00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "StackLatticeBuilder.h"
00021
00022 #include "moses/ChartRuleLookupManager.h"
00023 #include "moses/TranslationModel/RuleTable/UTrieNode.h"
00024 #include "StackLattice.h"
00025 #include "VarSpanNode.h"
00026
00027 namespace Moses
00028 {
00029
00030 void StackLatticeBuilder::Build(
00031 int start,
00032 int end,
00033 const UTrieNode &ruleNode,
00034 const VarSpanNode &varSpanNode,
00035 const std::vector<VarSpanNode::NonTermRange> &ranges,
00036 const ChartRuleLookupManager &manager,
00037 StackLattice &lattice,
00038 std::vector<std::vector<bool> > &checkTable)
00039 {
00040
00041 const size_t span = end - start + 1;
00042 if (lattice.size() < span) {
00043 lattice.resize(span);
00044 }
00045
00046
00047 if (checkTable.size() < varSpanNode.m_rank) {
00048 checkTable.resize(varSpanNode.m_rank);
00049 }
00050
00051 const UTrieNode::LabelTable &labelTable = ruleNode.GetLabelTable();
00052
00053 for (size_t index = 0; index < ranges.size(); ++index) {
00054 const VarSpanNode::NonTermRange &range = ranges[index];
00055 const std::vector<Word> &labelVec = labelTable[index];
00056 checkTable[index].clear();
00057 checkTable[index].resize(labelVec.size(), false);
00058
00059 for (size_t offset = range.s1; offset <= range.s2; ++offset) {
00060
00061 if (lattice[offset].size() < index+1) {
00062 lattice[offset].resize(index+1);
00063 }
00064 size_t e1 = std::max(offset, range.e1);
00065 const size_t maxSpan = range.e2-offset+1;
00066 if (lattice[offset][index].size() < maxSpan+1) {
00067 lattice[offset][index].resize(maxSpan+1);
00068 }
00069 for (size_t end = e1; end <= range.e2; ++end) {
00070 const size_t span = end-offset+1;
00071
00072
00073
00074 StackVec &stackVec = lattice[offset][index][span];
00075 stackVec.clear();
00076 stackVec.reserve(labelVec.size());
00077 std::vector<bool>::iterator q = checkTable[index].begin();
00078 for (std::vector<Word>::const_iterator p = labelVec.begin();
00079 p != labelVec.end(); ++p) {
00080 const Word &label = *p;
00081 const ChartCellLabel *stack = manager.GetTargetLabelSet(start+offset, start+offset+span-1).Find(label);
00082 stackVec.push_back(stack);
00083 *q++ = *q || static_cast<bool>(stack);
00084 }
00085 }
00086 }
00087 }
00088 }
00089
00090 }