00001 #include "TailLatticeBuilder.h"
00002
00003 #include "moses/Syntax/S2T/RuleTrieScope3.h"
00004
00005 namespace Moses
00006 {
00007 namespace Syntax
00008 {
00009 namespace S2T
00010 {
00011
00012 void TailLatticeBuilder::Build(
00013 const std::vector<const PatternApplicationTrie *> &key,
00014 const std::vector<SymbolRange> &ranges,
00015 TailLattice &lattice,
00016 std::vector<std::vector<bool> > &checkTable)
00017 {
00018 assert(key.size() == ranges.size());
00019 assert(key.size() > 0);
00020
00021 ExtendAndClear(key, ranges, lattice, checkTable);
00022
00023 const int spanStart = ranges.front().minStart;
00024
00025 const RuleTrieScope3::Node *utrieNode = key.back()->m_node;
00026
00027 const RuleTrieScope3::Node::LabelTable &labelTable =
00028 utrieNode->GetLabelTable();
00029
00030 std::size_t nonTermIndex = 0;
00031
00032 for (std::size_t i = 0; i < ranges.size(); ++i) {
00033 const SymbolRange &range = ranges[i];
00034 const PatternApplicationTrie &patNode = *(key[i]);
00035 if (patNode.IsTerminalNode()) {
00036 std::size_t offset = range.minStart - spanStart;
00037 std::size_t width = range.minEnd - range.minStart + 1;
00038 assert(lattice[offset][0][width].empty());
00039 lattice[offset][0][width].push_back(patNode.m_pvertex);
00040 continue;
00041 }
00042 const std::vector<Word> &labelVec = labelTable[nonTermIndex];
00043 assert(checkTable[nonTermIndex].size() == labelVec.size());
00044 for (int s = range.minStart; s <= range.maxStart; ++s) {
00045 for (int e = std::max(s, range.minEnd); e <= range.maxEnd; ++e) {
00046 assert(e-s >= 0);
00047 std::size_t offset = s - spanStart;
00048 std::size_t width = e - s + 1;
00049 assert(lattice[offset][nonTermIndex+1][width].empty());
00050 std::vector<bool>::iterator q = checkTable[nonTermIndex].begin();
00051 for (std::vector<Word>::const_iterator p = labelVec.begin();
00052 p != labelVec.end(); ++p, ++q) {
00053 const Word &label = *p;
00054 const PVertex *v =
00055 m_chart.GetCell(s, e).nonTerminalVertices.Find(label);
00056 lattice[offset][nonTermIndex+1][width].push_back(v);
00057 *q = (*q || static_cast<bool>(v));
00058 }
00059 }
00060 }
00061 ++nonTermIndex;
00062 }
00063 }
00064
00065
00066 void TailLatticeBuilder::ExtendAndClear(
00067 const std::vector<const PatternApplicationTrie *> &key,
00068 const std::vector<SymbolRange> &ranges,
00069 TailLattice &lattice,
00070 std::vector<std::vector<bool> > &checkTable)
00071 {
00072 const int spanStart = ranges.front().minStart;
00073 const int spanEnd = ranges.back().maxEnd;
00074
00075 const std::size_t span = spanEnd - spanStart + 1;
00076
00077
00078 if (lattice.size() < span) {
00079 lattice.resize(span);
00080 }
00081
00082 const RuleTrieScope3::Node *utrieNode = key.back()->m_node;
00083 const RuleTrieScope3::Node::LabelTable &labelTable =
00084 utrieNode->GetLabelTable();
00085
00086 std::size_t nonTermIndex = 0;
00087
00088 for (std::size_t i = 0; i < ranges.size(); ++i) {
00089 const SymbolRange &range = ranges[i];
00090 const PatternApplicationTrie &patNode = *(key[i]);
00091 if (patNode.IsTerminalNode()) {
00092 std::size_t offset = range.minStart - spanStart;
00093 std::size_t width = range.minEnd - range.minStart + 1;
00094 if (lattice[offset].size() < 1) {
00095 lattice[offset].resize(1);
00096 }
00097 if (lattice[offset][0].size() < width+1) {
00098 lattice[offset][0].resize(width+1);
00099 }
00100 lattice[offset][0][width].clear();
00101 continue;
00102 }
00103 const std::vector<Word> &labelVec = labelTable[nonTermIndex];
00104 for (int s = range.minStart; s <= range.maxStart; ++s) {
00105 for (int e = std::max(s, range.minEnd); e <= range.maxEnd; ++e) {
00106 assert(e-s >= 0);
00107 std::size_t offset = s - spanStart;
00108 std::size_t width = e - s + 1;
00109 if (lattice[offset].size() < nonTermIndex+2) {
00110 lattice[offset].resize(nonTermIndex+2);
00111 }
00112 if (lattice[offset][nonTermIndex+1].size() < width+1) {
00113 lattice[offset][nonTermIndex+1].resize(width+1);
00114 }
00115 lattice[offset][nonTermIndex+1][width].clear();
00116 lattice[offset][nonTermIndex+1][width].reserve(labelVec.size());
00117 }
00118 }
00119 if (checkTable.size() < nonTermIndex+1) {
00120 checkTable.resize(nonTermIndex+1);
00121 }
00122
00123
00124 checkTable[nonTermIndex].assign(labelVec.size(), false);
00125 ++nonTermIndex;
00126 }
00127 }
00128
00129 }
00130 }
00131 }