| |
| |
| |
| |
| |
| |
| #pragma once |
| #include <boost/unordered_map.hpp> |
| #include <boost/foreach.hpp> |
| #include "../../PhraseBased/TargetPhrases.h" |
| #include "../../System.h" |
| #include "../../Phrase.h" |
|
|
| namespace Moses2 |
| { |
| class System; |
|
|
| namespace PtMem |
| { |
|
|
| template<class WORD, class SP, class TP, class TPS> |
| class Node |
| { |
| public: |
| typedef boost::unordered_map<size_t, Node> Children; |
|
|
| Node() |
| :m_targetPhrases(NULL) |
| ,m_unsortedTPS(NULL) |
| {} |
|
|
| ~Node() |
| {} |
|
|
| void AddRule(const std::vector<FactorType> &factors, SP &source, TP *target) { |
| AddRule(factors, source, target, 0); |
| } |
|
|
| TPS *Find(const std::vector<FactorType> &factors, const SP &source, size_t pos = 0) const { |
| assert(source.GetSize()); |
| if (pos == source.GetSize()) { |
| return m_targetPhrases; |
| } else { |
| const WORD &word = source[pos]; |
| |
| typename Children::const_iterator iter = m_children.find(word.hash(factors)); |
| if (iter == m_children.end()) { |
| return NULL; |
| } else { |
| const Node &child = iter->second; |
| return child.Find(factors, source, pos + 1); |
| } |
| } |
| } |
|
|
| const Node *Find(const std::vector<FactorType> &factors, const WORD &word) const { |
| typename Children::const_iterator iter = m_children.find(word.hash(factors)); |
| if (iter == m_children.end()) { |
| return NULL; |
| } else { |
| const Node &child = iter->second; |
| return &child; |
| } |
| } |
|
|
| const TPS *GetTargetPhrases() const { |
| return m_targetPhrases; |
| } |
|
|
| void SortAndPrune(size_t tableLimit, MemPool &pool, System &system) { |
| BOOST_FOREACH(typename Children::value_type &val, m_children) { |
| Node &child = val.second; |
| child.SortAndPrune(tableLimit, pool, system); |
| } |
|
|
| |
| if (m_unsortedTPS) { |
| m_targetPhrases = new (pool.Allocate<TPS>()) TPS(pool, m_unsortedTPS->size()); |
|
|
| for (size_t i = 0; i < m_unsortedTPS->size(); ++i) { |
| TP *tp = (*m_unsortedTPS)[i]; |
| m_targetPhrases->AddTargetPhrase(*tp); |
| } |
|
|
| m_targetPhrases->SortAndPrune(tableLimit); |
| system.featureFunctions.EvaluateAfterTablePruning(system.GetSystemPool(), *m_targetPhrases, *m_source); |
|
|
| delete m_unsortedTPS; |
| } |
| } |
|
|
| const Children &GetChildren() const { |
| return m_children; |
| } |
|
|
| void Debug(std::ostream &out, const System &system) const { |
| BOOST_FOREACH(const typename Children::value_type &valPair, m_children) { |
| const WORD &word = valPair.first; |
| |
| } |
| } |
| protected: |
| Children m_children; |
| TPS *m_targetPhrases; |
| Phrase<WORD> *m_source; |
| std::vector<TP*> *m_unsortedTPS; |
|
|
| Node &AddRule(const std::vector<FactorType> &factors, SP &source, TP *target, size_t pos) { |
| if (pos == source.GetSize()) { |
| if (m_unsortedTPS == NULL) { |
| m_unsortedTPS = new std::vector<TP*>(); |
| m_source = &source; |
| } |
|
|
| m_unsortedTPS->push_back(target); |
| return *this; |
| } else { |
| const WORD &word = source[pos]; |
| Node &child = m_children[word.hash(factors)]; |
| |
|
|
| return child.AddRule(factors, source, target, pos + 1); |
| } |
| } |
|
|
| }; |
|
|
|
|
| } |
| } |
|
|
|
|