|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "moses/NonTerminal.h" |
|
#include "moses/TranslationModel/Scope3Parser/Parser.h" |
|
#include "moses/StaticData.h" |
|
#include "moses/TargetPhrase.h" |
|
#include "moses/TargetPhraseCollection.h" |
|
#include "moses/Util.h" |
|
#include "moses/Word.h" |
|
#include "UTrie.h" |
|
#include "Trie.h" |
|
#include "UTrieNode.h" |
|
|
|
#include <boost/functional/hash.hpp> |
|
#include <boost/unordered_map.hpp> |
|
#include <boost/version.hpp> |
|
|
|
#include <map> |
|
#include <vector> |
|
|
|
namespace Moses |
|
{ |
|
|
|
TargetPhraseCollection::shared_ptr |
|
RuleTableUTrie:: |
|
GetOrCreateTargetPhraseCollection(const Phrase &source, |
|
const TargetPhrase &target, |
|
const Word *sourceLHS) |
|
{ |
|
UTrieNode &currNode = GetOrCreateNode(source, target, sourceLHS); |
|
return currNode.GetOrCreateTargetPhraseCollection(target); |
|
} |
|
|
|
UTrieNode &RuleTableUTrie::GetOrCreateNode(const Phrase &source, |
|
const TargetPhrase &target, |
|
const Word *) |
|
{ |
|
const size_t size = source.GetSize(); |
|
|
|
const AlignmentInfo &alignmentInfo = target.GetAlignNonTerm(); |
|
AlignmentInfo::const_iterator iterAlign = alignmentInfo.begin(); |
|
|
|
UTrieNode *currNode = &m_root; |
|
for (size_t pos = 0 ; pos < size ; ++pos) { |
|
const Word &word = source.GetWord(pos); |
|
|
|
if (word.IsNonTerminal()) { |
|
assert(iterAlign != alignmentInfo.end()); |
|
assert(iterAlign->first == pos); |
|
size_t targetNonTermInd = iterAlign->second; |
|
++iterAlign; |
|
const Word &targetNonTerm = target.GetWord(targetNonTermInd); |
|
currNode = currNode->GetOrCreateNonTerminalChild(targetNonTerm); |
|
} else { |
|
currNode = currNode->GetOrCreateTerminalChild(word); |
|
} |
|
|
|
assert(currNode != NULL); |
|
} |
|
|
|
return *currNode; |
|
} |
|
|
|
ChartRuleLookupManager *RuleTableUTrie::CreateRuleLookupManager( |
|
const ChartParser &parser, |
|
const ChartCellCollectionBase &cellCollection, |
|
std::size_t maxChartSpan) |
|
{ |
|
return new Scope3Parser(parser, cellCollection, *this, maxChartSpan); |
|
} |
|
|
|
void RuleTableUTrie::SortAndPrune() |
|
{ |
|
if (GetTableLimit()) { |
|
m_root.Sort(GetTableLimit()); |
|
} |
|
} |
|
|
|
} |
|
|