|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "ApplicableRuleTrie.h" |
|
|
|
|
|
namespace Moses |
|
|
{ |
|
|
|
|
|
void ApplicableRuleTrie::Extend(const UTrieNode &root, int minPos, |
|
|
const SentenceMap &sentMap, bool followsGap) |
|
|
{ |
|
|
const UTrieNode::TerminalMap &termMap = root.GetTerminalMap(); |
|
|
for (UTrieNode::TerminalMap::const_iterator p = termMap.begin(); |
|
|
p != termMap.end(); ++p) { |
|
|
const Word &word = p->first; |
|
|
const UTrieNode &child = p->second; |
|
|
SentenceMap::const_iterator q = sentMap.find(word); |
|
|
if (q == sentMap.end()) { |
|
|
continue; |
|
|
} |
|
|
for (std::vector<size_t>::const_iterator r = q->second.begin(); |
|
|
r != q->second.end(); ++r) { |
|
|
size_t index = *r; |
|
|
if (index == (size_t)minPos || (followsGap && index > (size_t)minPos) || minPos == -1) { |
|
|
ApplicableRuleTrie *subTrie = new ApplicableRuleTrie(index, index, |
|
|
child); |
|
|
subTrie->Extend(child, index+1, sentMap, false); |
|
|
m_children.push_back(subTrie); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
const UTrieNode *child = root.GetNonTerminalChild(); |
|
|
if (!child) { |
|
|
return; |
|
|
} |
|
|
int start = followsGap ? -1 : minPos; |
|
|
ApplicableRuleTrie *subTrie = new ApplicableRuleTrie(start, -1, *child); |
|
|
int newMinPos = (minPos == -1 ? 1 : minPos+1); |
|
|
subTrie->Extend(*child, newMinPos, sentMap, true); |
|
|
m_children.push_back(subTrie); |
|
|
} |
|
|
|
|
|
} |
|
|
|