Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/moses2/PhraseBased/Hypothesis.cpp')
-rw-r--r--contrib/moses2/PhraseBased/Hypothesis.cpp228
1 files changed, 228 insertions, 0 deletions
diff --git a/contrib/moses2/PhraseBased/Hypothesis.cpp b/contrib/moses2/PhraseBased/Hypothesis.cpp
new file mode 100644
index 000000000..d59efb11a
--- /dev/null
+++ b/contrib/moses2/PhraseBased/Hypothesis.cpp
@@ -0,0 +1,228 @@
+/*
+ * Hypothesis.cpp
+ *
+ * Created on: 24 Oct 2015
+ * Author: hieu hoang
+ */
+#include <boost/foreach.hpp>
+#include <stdlib.h>
+#include <deque>
+#include "Hypothesis.h"
+#include "Manager.h"
+#include "Sentence.h"
+#include "TargetPhraseImpl.h"
+#include "../InputPathBase.h"
+#include "../System.h"
+#include "../Scores.h"
+#include "../Phrase.h"
+#include "../FF/StatefulFeatureFunction.h"
+
+using namespace std;
+
+namespace Moses2
+{
+Hypothesis *Hypothesis::Create(MemPool &pool, Manager &mgr)
+{
+// ++g_numHypos;
+ Hypothesis *ret;
+
+ Recycler<HypothesisBase*> &recycler = mgr.GetHypoRecycle();
+ ret = static_cast<Hypothesis*>(recycler.Get());
+ if (ret) {
+ // got new hypo from recycler. Do nothing
+ }
+ else {
+ ret = new (pool.Allocate<Hypothesis>()) Hypothesis(pool, mgr.system);
+ //cerr << "Hypothesis=" << sizeof(Hypothesis) << " " << ret << endl;
+ recycler.Keep(ret);
+ }
+ return ret;
+}
+
+Hypothesis::Hypothesis(MemPool &pool, const System &system) :
+ HypothesisBase(pool, system), m_currTargetWordsRange()
+{
+}
+
+Hypothesis::~Hypothesis()
+{
+ // TODO Auto-generated destructor stub
+}
+
+void Hypothesis::Init(Manager &mgr, const InputPathBase &path,
+ const TargetPhraseImpl &tp, const Bitmap &bitmap)
+{
+ m_mgr = &mgr;
+ m_targetPhrase = &tp;
+ m_sourceCompleted = &bitmap;
+ m_path = &path;
+ m_prevHypo = NULL;
+
+ m_currTargetWordsRange.SetStartPos(NOT_FOUND);
+ m_currTargetWordsRange.SetEndPos(NOT_FOUND);
+
+ m_estimatedScore = 0;
+ m_scores->Reset(mgr.system);
+}
+
+void Hypothesis::Init(Manager &mgr, const Hypothesis &prevHypo,
+ const InputPathBase &path, const TargetPhraseImpl &tp, const Bitmap &bitmap,
+ SCORE estimatedScore)
+{
+ m_mgr = &mgr;
+ m_targetPhrase = &tp;
+ m_sourceCompleted = &bitmap;
+ m_path = &path;
+ m_prevHypo = &prevHypo;
+
+ m_currTargetWordsRange.SetStartPos(
+ prevHypo.m_currTargetWordsRange.GetEndPos() + 1);
+ m_currTargetWordsRange.SetEndPos(
+ prevHypo.m_currTargetWordsRange.GetEndPos() + tp.GetSize());
+
+ m_estimatedScore = estimatedScore;
+
+ m_scores->Reset(mgr.system);
+ m_scores->PlusEquals(mgr.system, prevHypo.GetScores());
+ m_scores->PlusEquals(mgr.system, GetTargetPhrase().GetScores());
+}
+
+size_t Hypothesis::hash() const
+{
+ // coverage
+ size_t seed = (size_t) m_sourceCompleted;
+
+ seed = HypothesisBase::hash(seed);
+ return seed;
+}
+
+bool Hypothesis::operator==(const Hypothesis &other) const
+{
+ // coverage
+ if (m_sourceCompleted != other.m_sourceCompleted) {
+ return false;
+ }
+
+ bool ret = HypothesisBase::operator ==(other);
+ return ret;
+}
+
+std::string Hypothesis::Debug(const System &system) const
+{
+ stringstream out;
+
+ // coverage
+ out << GetBitmap() << " " << GetInputPath().range << " ";
+
+ // states
+ const std::vector<const StatefulFeatureFunction*> &sfffs =
+ GetManager().system.featureFunctions.GetStatefulFeatureFunctions();
+ size_t numStatefulFFs = sfffs.size();
+ for (size_t i = 0; i < numStatefulFFs; ++i) {
+ const FFState &state = *GetState(i);
+ out << "(" << state << ") ";
+ }
+
+ // string
+ //Debug(out, m_mgr->system);
+ out << " ";
+ out << "fc=" << GetFutureScore() << " ";
+ out << GetScores().Debug(GetManager().system);
+
+ return out.str();
+}
+
+void Hypothesis::OutputToStream(std::ostream &out) const
+{
+ if (m_prevHypo) {
+ m_prevHypo->OutputToStream(out);
+ }
+ //cerr << "range=" << GetInputPath().range << endl;
+
+ const TargetPhrase<Moses2::Word> &tp = GetTargetPhrase();
+ if (tp.GetSize()) {
+ const SubPhrase<Moses2::Word> &subPhrase = static_cast<const InputPath&>(GetInputPath()).subPhrase;
+ //cerr << "tp=" << tp.Debug(m_mgr->system) << endl;
+ //cerr << "subPhrase=" << subPhrase.Debug(m_mgr->system) << endl;
+
+ tp.OutputToStream(m_mgr->system, subPhrase, out);
+ }
+
+ if (m_path->range.GetStartPos() != NOT_FOUND) {
+ if (m_mgr->system.options.output.ReportSegmentation == 1) {
+ // just report phrase segmentation
+ out << "|" << m_path->range.GetStartPos() << "-" << m_path->range.GetEndPos() << "| ";
+ }
+ else if (m_mgr->system.options.output.ReportSegmentation == 2) {
+ // more detailed info about every segment
+ out << "|";
+
+ // phrase segmentation
+ out << m_path->range.GetStartPos() << "-" << m_path->range.GetEndPos() << ",";
+
+ // score breakdown
+ m_scores->OutputBreakdown(out, m_mgr->system);
+
+ out << "| ";
+ }
+ }
+}
+
+void Hypothesis::EmptyHypothesisState(const InputType &input)
+{
+ const std::vector<const StatefulFeatureFunction*> &sfffs =
+ GetManager().system.featureFunctions.GetStatefulFeatureFunctions();
+ BOOST_FOREACH(const StatefulFeatureFunction *sfff, sfffs){
+ size_t statefulInd = sfff->GetStatefulInd();
+ FFState *state = m_ffStates[statefulInd];
+ sfff->EmptyHypothesisState(*state, GetManager(), input, *this);
+}
+}
+
+void Hypothesis::EvaluateWhenApplied()
+{
+ const std::vector<const StatefulFeatureFunction*> &sfffs =
+ GetManager().system.featureFunctions.GetStatefulFeatureFunctions();
+ BOOST_FOREACH(const StatefulFeatureFunction *sfff, sfffs){
+ EvaluateWhenApplied(*sfff);
+ }
+//cerr << *this << endl;
+}
+
+void Hypothesis::EvaluateWhenApplied(const StatefulFeatureFunction &sfff)
+{
+ size_t statefulInd = sfff.GetStatefulInd();
+ const FFState *prevState = m_prevHypo->GetState(statefulInd);
+ FFState *thisState = m_ffStates[statefulInd];
+ assert(prevState);
+ sfff.EvaluateWhenApplied(GetManager(), *this, *prevState, *m_scores,
+ *thisState);
+
+}
+
+/** recursive - pos is relative from start of sentence */
+const Word &Hypothesis::GetWord(size_t pos) const
+{
+ const Hypothesis *hypo = this;
+ while (pos < hypo->GetCurrTargetWordsRange().GetStartPos()) {
+ hypo = hypo->GetPrevHypo();
+ UTIL_THROW_IF2(hypo == NULL, "Previous hypothesis should not be NULL");
+ }
+ return hypo->GetCurrWord(pos - hypo->GetCurrTargetWordsRange().GetStartPos());
+}
+
+void Hypothesis::Swap(Hypothesis &other)
+{
+ /*
+ Swap(m_targetPhrase, other.m_targetPhrase);
+ Swap(m_sourceCompleted, other.m_sourceCompleted);
+ Swap(m_range, other.m_range);
+ Swap(m_prevHypo, other.m_prevHypo);
+ Swap(m_ffStates, other.m_ffStates);
+ Swap(m_estimatedScore, other.m_estimatedScore);
+ Swap(m_currTargetWordsRange, other.m_currTargetWordsRange);
+ */
+}
+
+}
+