NMTKD
/
translation
/tools
/mosesdecoder
/moses
/Syntax
/S2T
/Parsers
/Scope3Parser
/TailLatticeBuilder.cpp
namespace Moses | |
{ | |
namespace Syntax | |
{ | |
namespace S2T | |
{ | |
void TailLatticeBuilder::Build( | |
const std::vector<const PatternApplicationTrie *> &key, | |
const std::vector<SymbolRange> &ranges, | |
TailLattice &lattice, | |
std::vector<std::vector<bool> > &checkTable) | |
{ | |
assert(key.size() == ranges.size()); | |
assert(key.size() > 0); | |
ExtendAndClear(key, ranges, lattice, checkTable); | |
const int spanStart = ranges.front().minStart; | |
const RuleTrieScope3::Node *utrieNode = key.back()->m_node; | |
const RuleTrieScope3::Node::LabelTable &labelTable = | |
utrieNode->GetLabelTable(); | |
std::size_t nonTermIndex = 0; | |
for (std::size_t i = 0; i < ranges.size(); ++i) { | |
const SymbolRange &range = ranges[i]; | |
const PatternApplicationTrie &patNode = *(key[i]); | |
if (patNode.IsTerminalNode()) { | |
std::size_t offset = range.minStart - spanStart; | |
std::size_t width = range.minEnd - range.minStart + 1; | |
assert(lattice[offset][0][width].empty()); | |
lattice[offset][0][width].push_back(patNode.m_pvertex); | |
continue; | |
} | |
const std::vector<Word> &labelVec = labelTable[nonTermIndex]; | |
assert(checkTable[nonTermIndex].size() == labelVec.size()); | |
for (int s = range.minStart; s <= range.maxStart; ++s) { | |
for (int e = std::max(s, range.minEnd); e <= range.maxEnd; ++e) { | |
assert(e-s >= 0); | |
std::size_t offset = s - spanStart; | |
std::size_t width = e - s + 1; | |
assert(lattice[offset][nonTermIndex+1][width].empty()); | |
std::vector<bool>::iterator q = checkTable[nonTermIndex].begin(); | |
for (std::vector<Word>::const_iterator p = labelVec.begin(); | |
p != labelVec.end(); ++p, ++q) { | |
const Word &label = *p; | |
const PVertex *v = | |
m_chart.GetCell(s, e).nonTerminalVertices.Find(label); | |
lattice[offset][nonTermIndex+1][width].push_back(v); | |
*q = (*q || static_cast<bool>(v)); | |
} | |
} | |
} | |
++nonTermIndex; | |
} | |
} | |
// Extend the lattice if necessary and clear the innermost vectors. | |
void TailLatticeBuilder::ExtendAndClear( | |
const std::vector<const PatternApplicationTrie *> &key, | |
const std::vector<SymbolRange> &ranges, | |
TailLattice &lattice, | |
std::vector<std::vector<bool> > &checkTable) | |
{ | |
const int spanStart = ranges.front().minStart; | |
const int spanEnd = ranges.back().maxEnd; | |
const std::size_t span = spanEnd - spanStart + 1; | |
// Extend the outermost vector. | |
if (lattice.size() < span) { | |
lattice.resize(span); | |
} | |
const RuleTrieScope3::Node *utrieNode = key.back()->m_node; | |
const RuleTrieScope3::Node::LabelTable &labelTable = | |
utrieNode->GetLabelTable(); | |
std::size_t nonTermIndex = 0; | |
for (std::size_t i = 0; i < ranges.size(); ++i) { | |
const SymbolRange &range = ranges[i]; | |
const PatternApplicationTrie &patNode = *(key[i]); | |
if (patNode.IsTerminalNode()) { | |
std::size_t offset = range.minStart - spanStart; | |
std::size_t width = range.minEnd - range.minStart + 1; | |
if (lattice[offset].size() < 1) { | |
lattice[offset].resize(1); | |
} | |
if (lattice[offset][0].size() < width+1) { | |
lattice[offset][0].resize(width+1); | |
} | |
lattice[offset][0][width].clear(); | |
continue; | |
} | |
const std::vector<Word> &labelVec = labelTable[nonTermIndex]; | |
for (int s = range.minStart; s <= range.maxStart; ++s) { | |
for (int e = std::max(s, range.minEnd); e <= range.maxEnd; ++e) { | |
assert(e-s >= 0); | |
std::size_t offset = s - spanStart; | |
std::size_t width = e - s + 1; | |
if (lattice[offset].size() < nonTermIndex+2) { | |
lattice[offset].resize(nonTermIndex+2); | |
} | |
if (lattice[offset][nonTermIndex+1].size() < width+1) { | |
lattice[offset][nonTermIndex+1].resize(width+1); | |
} | |
lattice[offset][nonTermIndex+1][width].clear(); | |
lattice[offset][nonTermIndex+1][width].reserve(labelVec.size()); | |
} | |
} | |
if (checkTable.size() < nonTermIndex+1) { | |
checkTable.resize(nonTermIndex+1); | |
} | |
// Unlike the lattice itself, the check table must contain initial | |
// values prior to the main build procedure (and the values must be false). | |
checkTable[nonTermIndex].assign(labelVec.size(), false); | |
++nonTermIndex; | |
} | |
} | |
} // namespace S2T | |
} // namespace Syntax | |
} // namespace Moses | |