| #include "RuleTrieScope3.h" |
|
|
| #include <map> |
| #include <vector> |
|
|
| #include <boost/functional/hash.hpp> |
| #include <boost/unordered_map.hpp> |
| #include <boost/version.hpp> |
|
|
| #include "moses/NonTerminal.h" |
| #include "moses/TargetPhrase.h" |
| #include "moses/TargetPhraseCollection.h" |
| #include "moses/Util.h" |
| #include "moses/Word.h" |
|
|
| namespace Moses |
| { |
| namespace Syntax |
| { |
| namespace S2T |
| { |
|
|
| void RuleTrieScope3::Node::Prune(std::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 RuleTrieScope3::Node::Sort(std::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); |
| } |
| } |
|
|
| RuleTrieScope3::Node *RuleTrieScope3::Node::GetOrCreateTerminalChild( |
| const Word &sourceTerm) |
| { |
| assert(!sourceTerm.IsNonTerminal()); |
| std::pair<TerminalMap::iterator, bool> result; |
| result = m_terminalMap.insert(std::make_pair(sourceTerm, Node())); |
| const TerminalMap::iterator &iter = result.first; |
| Node &child = iter->second; |
| return &child; |
| } |
|
|
| RuleTrieScope3::Node *RuleTrieScope3::Node::GetOrCreateNonTerminalChild( |
| const Word &targetNonTerm) |
| { |
| assert(targetNonTerm.IsNonTerminal()); |
| if (m_gapNode == NULL) { |
| m_gapNode = new Node(); |
| } |
| return m_gapNode; |
| } |
|
|
| TargetPhraseCollection::shared_ptr |
| RuleTrieScope3:: |
| Node:: |
| GetOrCreateTargetPhraseCollection(const TargetPhrase &target) |
| { |
| const AlignmentInfo &alignmentInfo = target.GetAlignNonTerm(); |
| const std::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) { |
| std::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) ret.reset(new TargetPhraseCollection); |
| return ret; |
| } |
|
|
| TargetPhraseCollection::shared_ptr |
| RuleTrieScope3:: |
| GetOrCreateTargetPhraseCollection(const Phrase &source, |
| const TargetPhrase &target, |
| const Word *sourceLHS) |
| { |
| Node &currNode = GetOrCreateNode(source, target, sourceLHS); |
| return currNode.GetOrCreateTargetPhraseCollection(target); |
| } |
|
|
| RuleTrieScope3::Node &RuleTrieScope3::GetOrCreateNode( |
| const Phrase &source, const TargetPhrase &target, const Word *) |
| { |
| const std::size_t size = source.GetSize(); |
|
|
| const AlignmentInfo &alignmentInfo = target.GetAlignNonTerm(); |
| AlignmentInfo::const_iterator iterAlign = alignmentInfo.begin(); |
|
|
| Node *currNode = &m_root; |
| for (std::size_t pos = 0 ; pos < size ; ++pos) { |
| const Word &word = source.GetWord(pos); |
|
|
| if (word.IsNonTerminal()) { |
| assert(iterAlign != alignmentInfo.end()); |
| assert(iterAlign->first == pos); |
| std::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; |
| } |
|
|
| void RuleTrieScope3::SortAndPrune(std::size_t tableLimit) |
| { |
| if (tableLimit) { |
| m_root.Sort(tableLimit); |
| } |
| } |
|
|
| bool RuleTrieScope3::HasPreterminalRule(const Word &w) const |
| { |
| const Node::TerminalMap &map = m_root.GetTerminalMap(); |
| Node::TerminalMap::const_iterator p = map.find(w); |
| return p != map.end() && p->second.HasRules(); |
| } |
|
|
| } |
| } |
| } |
|
|