00001
00002 #include "PhraseDictionaryMemoryPerSentenceOnDemand.h"
00003 #include <sstream>
00004
00005 using namespace std;
00006
00007 namespace Moses
00008 {
00009 PhraseDictionaryMemoryPerSentenceOnDemand::PhraseDictionaryMemoryPerSentenceOnDemand(const std::string &line)
00010 : PhraseDictionary(line, true), m_valuesAreProbabilities(true)
00011 {
00012 ReadParameters();
00013 }
00014
00015 void PhraseDictionaryMemoryPerSentenceOnDemand::Load(AllOptions::ptr const& opts)
00016 {
00017 m_options = opts;
00018 SetFeaturesToApply();
00019
00020
00021 }
00022
00023
00024 TargetPhraseCollection::shared_ptr PhraseDictionaryMemoryPerSentenceOnDemand::GetTargetPhraseCollectionNonCacheLEGACY(const Phrase &source) const
00025 {
00026
00027 Coll &coll = GetColl();
00028
00029 return coll[source];
00030
00031 }
00032
00033
00034 void PhraseDictionaryMemoryPerSentenceOnDemand::InitializeForInput(ttasksptr const& ttask)
00035 {
00036 Coll &coll = GetColl();
00037 coll.clear();
00038
00039 VERBOSE(2, "Initializing PhraseDictionaryMemoryPerSentenceOnDemand " << m_description << "\n");
00040
00041
00042
00043 boost::shared_ptr<Moses::ContextScope> contextScope = ttask->GetScope();
00044
00045
00046 void const* key = static_cast<void const*>(this);
00047
00048
00049 boost::shared_ptr<string> value = contextScope->get<string>(key);
00050
00051
00052 stringstream strme(*(value.get()));
00053
00054
00055 string line;
00056 while (getline(strme, line)) {
00057
00058 VERBOSE(3, "\t" << line);
00059
00060 vector<string> toks = TokenizeMultiCharSeparator(line, "|||");
00061 Phrase source;
00062 source.CreateFromString(Input, m_input, toks[0], NULL);
00063
00064 TargetPhrase *target = new TargetPhrase(this);
00065 target->CreateFromString(Output, m_output, toks[1], NULL);
00066
00067
00068 vector<float> scores = Tokenize<float>(toks[2]);
00069 if (m_valuesAreProbabilities) {
00070 std::transform(scores.begin(), scores.end(), scores.begin(),TransformScore);
00071 std::transform(scores.begin(), scores.end(), scores.begin(),FloorScore);
00072 }
00073 target->GetScoreBreakdown().PlusEquals(this, scores);
00074
00075
00076 target->EvaluateInIsolation(source, GetFeaturesToApply());
00077
00078
00079 TargetPhraseCollection::shared_ptr &tpsPtr = coll[source];
00080 TargetPhraseCollection *tps = tpsPtr.get();
00081 if (tps == NULL) {
00082 tps = new TargetPhraseCollection();
00083 tpsPtr.reset(tps);
00084 }
00085 tps->Add(target);
00086 }
00087 }
00088
00089 void PhraseDictionaryMemoryPerSentenceOnDemand::GetTargetPhraseCollectionBatch(const InputPathList &inputPathQueue) const
00090 {
00091 InputPathList::const_iterator iter;
00092 for (iter = inputPathQueue.begin(); iter != inputPathQueue.end(); ++iter) {
00093 InputPath &inputPath = **iter;
00094 const Phrase &source = inputPath.GetPhrase();
00095
00096 Coll &coll = GetColl();
00097 Coll::const_iterator iter = coll.find(source);
00098 if (iter == coll.end()) {
00099 TargetPhraseCollection::shared_ptr tprPtr;
00100 inputPath.SetTargetPhrases(*this, tprPtr, NULL);
00101 } else {
00102 const TargetPhraseCollection::shared_ptr &tprPtr = iter->second;
00103 inputPath.SetTargetPhrases(*this, tprPtr, NULL);
00104 }
00105 }
00106 }
00107
00108
00109 ChartRuleLookupManager* PhraseDictionaryMemoryPerSentenceOnDemand::CreateRuleLookupManager(const ChartParser &parser,
00110 const ChartCellCollectionBase &cellCollection,
00111 std::size_t )
00112 {
00113 abort();
00114 }
00115
00116 PhraseDictionaryMemoryPerSentenceOnDemand::Coll &PhraseDictionaryMemoryPerSentenceOnDemand::GetColl() const
00117 {
00118 Coll *coll;
00119 coll = m_coll.get();
00120 if (coll == NULL) {
00121 coll = new Coll;
00122 m_coll.reset(coll);
00123 }
00124 assert(coll);
00125 return *coll;
00126 }
00127
00128 void
00129 PhraseDictionaryMemoryPerSentenceOnDemand::SetParameter(const std::string& key, const std::string& value)
00130 {
00131 if (key == "path") {
00132 UTIL_THROW(util::Exception, "PhraseDictionaryMemoryPerSentenceOnDemand does not support key \"path\".");
00133 } else if (key == "valuesAreProbabilities") {
00134 m_valuesAreProbabilities = Scan<bool>(value);
00135 } else {
00136 PhraseDictionary::SetParameter(key, value);
00137 }
00138 }
00139
00140
00141 TO_STRING_BODY(PhraseDictionaryMemoryPerSentenceOnDemand);
00142
00143
00144 ostream& operator<<(ostream& out, const PhraseDictionaryMemoryPerSentenceOnDemand& phraseDict)
00145 {
00146 return out;
00147 }
00148
00149 }