|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "moses/NonTerminal.h" |
|
#include "moses/TargetPhrase.h" |
|
#include "moses/TargetPhraseCollection.h" |
|
#include "moses/Util.h" |
|
#include "moses/Word.h" |
|
#include "UTrieNode.h" |
|
#include "Trie.h" |
|
#include "moses/TranslationModel/PhraseDictionaryNodeMemory.h" |
|
|
|
#include <boost/functional/hash.hpp> |
|
#include <boost/unordered_map.hpp> |
|
#include <boost/version.hpp> |
|
|
|
#include <map> |
|
#include <vector> |
|
|
|
namespace Moses |
|
{ |
|
|
|
void UTrieNode::Prune(size_t tableLimit) |
|
{ |
|
|
|
for (TerminalMap::iterator p = m_terminalMap.begin(); |
|
p != m_terminalMap.end(); ++p) { |
|
p->second.Prune(tableLimit); |
|
} |
|
if (m_gapNode) { |
|
m_gapNode->Prune(tableLimit); |
|
} |
|
|
|
|
|
for (LabelMap::iterator p = m_labelMap.begin(); p != m_labelMap.end(); ++p) { |
|
p->second->Prune(true, tableLimit); |
|
} |
|
} |
|
|
|
void UTrieNode::Sort(size_t tableLimit) |
|
{ |
|
|
|
for (TerminalMap::iterator p = m_terminalMap.begin(); |
|
p != m_terminalMap.end(); ++p) { |
|
p->second.Sort(tableLimit); |
|
} |
|
if (m_gapNode) { |
|
m_gapNode->Sort(tableLimit); |
|
} |
|
|
|
|
|
for (LabelMap::iterator p = m_labelMap.begin(); p != m_labelMap.end(); ++p) { |
|
p->second->Sort(true, tableLimit); |
|
} |
|
} |
|
|
|
UTrieNode *UTrieNode::GetOrCreateTerminalChild(const Word &sourceTerm) |
|
{ |
|
assert(!sourceTerm.IsNonTerminal()); |
|
std::pair<TerminalMap::iterator, bool> result; |
|
result = m_terminalMap.insert(std::make_pair(sourceTerm, UTrieNode())); |
|
const TerminalMap::iterator &iter = result.first; |
|
UTrieNode &child = iter->second; |
|
return &child; |
|
} |
|
|
|
UTrieNode *UTrieNode::GetOrCreateNonTerminalChild(const Word &targetNonTerm) |
|
{ |
|
assert(targetNonTerm.IsNonTerminal()); |
|
if (m_gapNode == NULL) { |
|
m_gapNode = new UTrieNode(); |
|
} |
|
return m_gapNode; |
|
} |
|
|
|
TargetPhraseCollection::shared_ptr |
|
UTrieNode:: |
|
GetOrCreateTargetPhraseCollection(const TargetPhrase &target) |
|
{ |
|
const AlignmentInfo &alignmentInfo = target.GetAlignNonTerm(); |
|
const size_t rank = alignmentInfo.GetSize(); |
|
|
|
std::vector<int> vec; |
|
vec.reserve(rank); |
|
|
|
m_labelTable.resize(rank); |
|
|
|
int i = 0; |
|
for (AlignmentInfo::const_iterator p = alignmentInfo.begin(); |
|
p != alignmentInfo.end(); ++p) { |
|
size_t targetNonTermIndex = p->second; |
|
const Word &targetNonTerm = target.GetWord(targetNonTermIndex); |
|
vec.push_back(InsertLabel(i++, targetNonTerm)); |
|
} |
|
TargetPhraseCollection::shared_ptr& ret = m_labelMap[vec]; |
|
if (ret == NULL) ret.reset(new TargetPhraseCollection); |
|
return ret; |
|
} |
|
|
|
} |
|
|