00001 #pragma once
00002
00003 #include <vector>
00004
00005 #include "moses/Syntax/S2T/RuleTrieScope3.h"
00006 #include "moses/Util.h"
00007
00008 #include "SentenceMap.h"
00009
00010 namespace Moses
00011 {
00012 namespace Syntax
00013 {
00014 namespace S2T
00015 {
00016
00017 struct PatternApplicationTrie;
00018
00019 typedef std::vector<const PatternApplicationTrie*> PatternApplicationKey;
00020
00021 struct PatternApplicationTrie {
00022 public:
00023 PatternApplicationTrie(int start, int end, const RuleTrieScope3::Node &node,
00024 const PVertex *pvertex, PatternApplicationTrie *parent)
00025 : m_start(start)
00026 , m_end(end)
00027 , m_node(&node)
00028 , m_pvertex(pvertex)
00029 , m_parent(parent)
00030 , m_highestTerminalNode(0)
00031 , m_lowestTerminalNode(0) {}
00032
00033 ~PatternApplicationTrie() {
00034 RemoveAllInColl(m_children);
00035 }
00036
00037 int Depth() const;
00038
00039 bool IsGapNode() const {
00040 return m_end == -1;
00041 }
00042 bool IsTerminalNode() const {
00043 return m_end != -1;
00044 }
00045
00046 const PatternApplicationTrie *GetHighestTerminalNode() const;
00047 const PatternApplicationTrie *GetLowestTerminalNode() const;
00048
00049 void DetermineStartRange(int, int &, int &) const;
00050 void DetermineEndRange(int, int &, int &) const;
00051
00052 void Extend(const RuleTrieScope3::Node &node, int minPos,
00053 const SentenceMap &sentMap, bool followsGap);
00054
00055 void ReadOffPatternApplicationKey(PatternApplicationKey &) const;
00056
00057 int m_start;
00058 int m_end;
00059 const RuleTrieScope3::Node *m_node;
00060 const PVertex *m_pvertex;
00061 PatternApplicationTrie *m_parent;
00062 std::vector<PatternApplicationTrie*> m_children;
00063 mutable const PatternApplicationTrie *m_highestTerminalNode;
00064 mutable const PatternApplicationTrie *m_lowestTerminalNode;
00065 };
00066
00067 }
00068 }
00069 }