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); }
void PatternApplicationTrie::Extend(const RuleTrieScope3::Node &node, int minPos, const SentenceMap &sentMap, bool followsGap) { const RuleTrieScope3::Node::TerminalMap &termMap = node.GetTerminalMap(); for (RuleTrieScope3::Node::TerminalMap::const_iterator p = termMap.begin(); p != termMap.end(); ++p) { const Word &word = p->first; const RuleTrieScope3::Node &child = p->second; SentenceMap::const_iterator q = sentMap.find(word); if (q == sentMap.end()) { continue; } for (std::vector<const PVertex *>::const_iterator r = q->second.begin(); r != q->second.end(); ++r) { const PVertex *v = *r; std::size_t start = v->span.GetStartPos(); std::size_t end = v->span.GetEndPos(); if (start == (std::size_t)minPos || (followsGap && start > (std::size_t)minPos) || minPos == -1) { PatternApplicationTrie *subTrie = new PatternApplicationTrie(start, end, child, v, this); subTrie->Extend(child, end+1, sentMap, false); m_children.push_back(subTrie); } } } const RuleTrieScope3::Node *child = node.GetNonTerminalChild(); if (!child) { return; } int start = followsGap ? -1 : minPos; PatternApplicationTrie *subTrie = new PatternApplicationTrie(start, -1, *child, 0, this); int newMinPos = (minPos == -1 ? 1 : minPos+1); subTrie->Extend(*child, newMinPos, sentMap, true); m_children.push_back(subTrie); }