Example #1
0
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);
}