00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "PhraseDictionaryNodeSCFG.h"
00023 #include "TargetPhrase.h"
00024 #include "PhraseDictionary.h"
00025
00026 namespace Moses
00027 {
00028
00029 PhraseDictionaryNodeSCFG::~PhraseDictionaryNodeSCFG()
00030 {
00031 delete m_targetPhraseCollection;
00032 }
00033
00034 void PhraseDictionaryNodeSCFG::Prune(size_t tableLimit)
00035 {
00036
00037 for (TerminalMap::iterator p = m_sourceTermMap.begin(); p != m_sourceTermMap.end(); ++p) {
00038 p->second.Prune(tableLimit);
00039 }
00040 for (NonTerminalMap::iterator p = m_nonTermMap.begin(); p != m_nonTermMap.end(); ++p) {
00041 p->second.Prune(tableLimit);
00042 }
00043
00044
00045 if (m_targetPhraseCollection != NULL)
00046 m_targetPhraseCollection->Prune(true, tableLimit);
00047 }
00048
00049 void PhraseDictionaryNodeSCFG::Sort(size_t tableLimit)
00050 {
00051
00052 for (TerminalMap::iterator p = m_sourceTermMap.begin(); p != m_sourceTermMap.end(); ++p) {
00053 p->second.Sort(tableLimit);
00054 }
00055 for (NonTerminalMap::iterator p = m_nonTermMap.begin(); p != m_nonTermMap.end(); ++p) {
00056 p->second.Sort(tableLimit);
00057 }
00058
00059
00060 if (m_targetPhraseCollection != NULL) {
00061 m_targetPhraseCollection->Sort(true, tableLimit);
00062 }
00063 }
00064
00065 PhraseDictionaryNodeSCFG *PhraseDictionaryNodeSCFG::GetOrCreateChild(const Word &sourceTerm)
00066 {
00067
00068
00069 std::pair <TerminalMap::iterator,bool> insResult;
00070 insResult = m_sourceTermMap.insert( std::make_pair(sourceTerm, PhraseDictionaryNodeSCFG()) );
00071 const TerminalMap::iterator &iter = insResult.first;
00072 PhraseDictionaryNodeSCFG &ret = iter->second;
00073 return &ret;
00074 }
00075
00076 PhraseDictionaryNodeSCFG *PhraseDictionaryNodeSCFG::GetOrCreateChild(const Word &sourceNonTerm, const Word &targetNonTerm)
00077 {
00078 CHECK(sourceNonTerm.IsNonTerminal());
00079 CHECK(targetNonTerm.IsNonTerminal());
00080
00081 NonTerminalMapKey key(sourceNonTerm, targetNonTerm);
00082 std::pair <NonTerminalMap::iterator,bool> insResult;
00083 insResult = m_nonTermMap.insert( std::make_pair(key, PhraseDictionaryNodeSCFG()) );
00084 const NonTerminalMap::iterator &iter = insResult.first;
00085 PhraseDictionaryNodeSCFG &ret = iter->second;
00086 return &ret;
00087 }
00088
00089 const PhraseDictionaryNodeSCFG *PhraseDictionaryNodeSCFG::GetChild(const Word &sourceTerm) const
00090 {
00091 CHECK(!sourceTerm.IsNonTerminal());
00092
00093 TerminalMap::const_iterator p = m_sourceTermMap.find(sourceTerm);
00094 return (p == m_sourceTermMap.end()) ? NULL : &p->second;
00095 }
00096
00097 const PhraseDictionaryNodeSCFG *PhraseDictionaryNodeSCFG::GetChild(const Word &sourceNonTerm, const Word &targetNonTerm) const
00098 {
00099 CHECK(sourceNonTerm.IsNonTerminal());
00100 CHECK(targetNonTerm.IsNonTerminal());
00101
00102 NonTerminalMapKey key(sourceNonTerm, targetNonTerm);
00103 NonTerminalMap::const_iterator p = m_nonTermMap.find(key);
00104 return (p == m_nonTermMap.end()) ? NULL : &p->second;
00105 }
00106
00107 void PhraseDictionaryNodeSCFG::Clear()
00108 {
00109 m_sourceTermMap.clear();
00110 m_nonTermMap.clear();
00111 delete m_targetPhraseCollection;
00112
00113 }
00114
00115 std::ostream& operator<<(std::ostream &out, const PhraseDictionaryNodeSCFG &node)
00116 {
00117 out << node.GetTargetPhraseCollection();
00118 return out;
00119 }
00120
00121 TO_STRING_BODY(PhraseDictionaryNodeSCFG)
00122
00123 }
00124