|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
#include "moses/NonTerminal.h" |
|
#include "moses/TargetPhrase.h" |
|
#include "moses/TargetPhraseCollection.h" |
|
#include "moses/Terminal.h" |
|
#include "moses/Util.h" |
|
#include "moses/Word.h" |
|
#include "Trie.h" |
|
|
|
#include <boost/functional/hash.hpp> |
|
#include <boost/unordered_map.hpp> |
|
#include <boost/version.hpp> |
|
|
|
#include <map> |
|
#include <vector> |
|
|
|
namespace Moses |
|
{ |
|
|
|
class RuleTableUTrie; |
|
|
|
|
|
class UTrieNode |
|
{ |
|
public: |
|
typedef std::vector<std::vector<Word> > LabelTable; |
|
#if defined(BOOST_VERSION) && (BOOST_VERSION >= 104200) |
|
typedef boost::unordered_map<Word, |
|
UTrieNode, |
|
TerminalHasher, |
|
TerminalEqualityPred> TerminalMap; |
|
|
|
typedef boost::unordered_map<std::vector<int>, |
|
TargetPhraseCollection::shared_ptr> LabelMap; |
|
#else |
|
typedef std::map<Word, UTrieNode> TerminalMap; |
|
typedef std::map<std::vector<int>, TargetPhraseCollection::shared_ptr> LabelMap; |
|
#endif |
|
|
|
~UTrieNode() { |
|
delete m_gapNode; |
|
} |
|
|
|
const LabelTable &GetLabelTable() const { |
|
return m_labelTable; |
|
} |
|
const LabelMap &GetLabelMap() const { |
|
return m_labelMap; |
|
} |
|
const TerminalMap &GetTerminalMap() const { |
|
return m_terminalMap; |
|
} |
|
|
|
const UTrieNode *GetNonTerminalChild() const { |
|
return m_gapNode; |
|
} |
|
|
|
UTrieNode *GetOrCreateTerminalChild(const Word &sourceTerm); |
|
UTrieNode *GetOrCreateNonTerminalChild(const Word &targetNonTerm); |
|
|
|
TargetPhraseCollection::shared_ptr |
|
GetOrCreateTargetPhraseCollection(const TargetPhrase &); |
|
|
|
bool IsLeaf() const { |
|
return m_terminalMap.empty() && m_gapNode == NULL; |
|
} |
|
|
|
bool HasRules() const { |
|
return !m_labelMap.empty(); |
|
} |
|
|
|
void Prune(size_t tableLimit); |
|
void Sort(size_t tableLimit); |
|
|
|
private: |
|
friend class RuleTableUTrie; |
|
|
|
UTrieNode() : m_gapNode(NULL) {} |
|
|
|
int InsertLabel(int i, const Word &w) { |
|
std::vector<Word> &inner = m_labelTable[i]; |
|
for (size_t j = 0; j < inner.size(); ++j) { |
|
if (inner[j] == w) { |
|
return j; |
|
} |
|
} |
|
inner.push_back(w); |
|
return inner.size()-1; |
|
} |
|
|
|
LabelTable m_labelTable; |
|
LabelMap m_labelMap; |
|
TerminalMap m_terminalMap; |
|
UTrieNode *m_gapNode; |
|
}; |
|
|
|
} |
|
|