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/FF/Distortion.cpp')
-rw-r--r--contrib/moses2/FF/Distortion.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/contrib/moses2/FF/Distortion.cpp b/contrib/moses2/FF/Distortion.cpp
new file mode 100644
index 000000000..4220b731f
--- /dev/null
+++ b/contrib/moses2/FF/Distortion.cpp
@@ -0,0 +1,189 @@
+/*
+ * Distortion.cpp
+ *
+ * Created on: 28 Oct 2015
+ * Author: hieu
+ */
+#include <sstream>
+#include "Distortion.h"
+#include "../PhraseBased/Hypothesis.h"
+#include "../PhraseBased/Manager.h"
+#include "../legacy/Range.h"
+#include "../legacy/Bitmap.h"
+
+using namespace std;
+
+namespace Moses2
+{
+
+struct DistortionState_traditional: public FFState
+{
+ Range range;
+ int first_gap;
+
+ DistortionState_traditional() :
+ range()
+ {
+ // uninitialised
+ }
+
+ void Set(const Range& wr, int fg)
+ {
+ range = wr;
+ first_gap = fg;
+ }
+
+ size_t hash() const
+ {
+ return range.GetEndPos();
+ }
+ virtual bool operator==(const FFState& other) const
+ {
+ const DistortionState_traditional& o =
+ static_cast<const DistortionState_traditional&>(other);
+ return range.GetEndPos() == o.range.GetEndPos();
+ }
+
+ virtual std::string ToString() const
+ {
+ stringstream sb;
+ sb << first_gap << " " << range;
+ return sb.str();
+ }
+
+};
+
+///////////////////////////////////////////////////////////////////////
+Distortion::Distortion(size_t startInd, const std::string &line) :
+ StatefulFeatureFunction(startInd, line)
+{
+ ReadParameters();
+}
+
+Distortion::~Distortion()
+{
+ // TODO Auto-generated destructor stub
+}
+
+FFState* Distortion::BlankState(MemPool &pool, const System &sys) const
+{
+ return new (pool.Allocate<DistortionState_traditional>()) DistortionState_traditional();
+}
+
+void Distortion::EmptyHypothesisState(FFState &state, const ManagerBase &mgr,
+ const InputType &input, const Hypothesis &hypo) const
+{
+ DistortionState_traditional &stateCast =
+ static_cast<DistortionState_traditional&>(state);
+
+ // fake previous translated phrase start and end
+ size_t start = NOT_FOUND;
+ size_t end = NOT_FOUND;
+ /*
+ if (input.m_frontSpanCoveredLength > 0) {
+ // can happen with --continue-partial-translation
+ start = 0;
+ end = input.m_frontSpanCoveredLength -1;
+ }
+ */
+
+ stateCast.range = Range(start, end);
+ stateCast.first_gap = NOT_FOUND;
+}
+
+void Distortion::EvaluateInIsolation(MemPool &pool, const System &system,
+ const Phrase<Moses2::Word> &source, const TargetPhraseImpl &targetPhrase, Scores &scores,
+ SCORE &estimatedScore) const
+{
+}
+
+void Distortion::EvaluateInIsolation(MemPool &pool, const System &system, const Phrase<SCFG::Word> &source,
+ const TargetPhrase<SCFG::Word> &targetPhrase, Scores &scores,
+ SCORE &estimatedScore) const
+{
+}
+
+void Distortion::EvaluateWhenApplied(const ManagerBase &mgr,
+ const Hypothesis &hypo, const FFState &prevState, Scores &scores,
+ FFState &state) const
+{
+ const DistortionState_traditional &prev =
+ static_cast<const DistortionState_traditional&>(prevState);
+ SCORE distortionScore = CalculateDistortionScore(prev.range,
+ hypo.GetInputPath().range, prev.first_gap);
+ //cerr << "distortionScore=" << distortionScore << endl;
+
+ scores.PlusEquals(mgr.system, *this, distortionScore);
+
+ DistortionState_traditional &stateCast =
+ static_cast<DistortionState_traditional&>(state);
+ stateCast.Set(hypo.GetInputPath().range, hypo.GetBitmap().GetFirstGapPos());
+}
+
+SCORE Distortion::CalculateDistortionScore(const Range &prev, const Range &curr,
+ const int FirstGap) const
+{
+ bool useEarlyDistortionCost = false;
+ if (!useEarlyDistortionCost) {
+ return -(SCORE) ComputeDistortionDistance(prev, curr);
+ }
+ else {
+ /* Pay distortion score as soon as possible, from Moore and Quirk MT Summit 2007
+ Definitions:
+ S : current source range
+ S' : last translated source phrase range
+ S'' : longest fully-translated initial segment
+ */
+
+ int prefixEndPos = (int) FirstGap - 1;
+ if ((int) FirstGap == -1) prefixEndPos = -1;
+
+ // case1: S is adjacent to S'' => return 0
+ if ((int) curr.GetStartPos() == prefixEndPos + 1) {
+ //IFVERBOSE(4) std::cerr<< "MQ07disto:case1" << std::endl;
+ return 0;
+ }
+
+ // case2: S is to the left of S' => return 2(length(S))
+ if ((int) curr.GetEndPos() < (int) prev.GetEndPos()) {
+ //IFVERBOSE(4) std::cerr<< "MQ07disto:case2" << std::endl;
+ return (float) -2 * (int) curr.GetNumWordsCovered();
+ }
+
+ // case3: S' is a subsequence of S'' => return 2(nbWordBetween(S,S'')+length(S))
+ if ((int) prev.GetEndPos() <= prefixEndPos) {
+ //IFVERBOSE(4) std::cerr<< "MQ07disto:case3" << std::endl;
+ int z = (int) curr.GetStartPos() - prefixEndPos - 1;
+ return (float) -2 * (z + (int) curr.GetNumWordsCovered());
+ }
+
+ // case4: otherwise => return 2(nbWordBetween(S,S')+length(S))
+ //IFVERBOSE(4) std::cerr<< "MQ07disto:case4" << std::endl;
+ return (float) -2
+ * ((int) curr.GetNumWordsBetween(prev) + (int) curr.GetNumWordsCovered());
+
+ }
+}
+
+int Distortion::ComputeDistortionDistance(const Range& prev,
+ const Range& current) const
+{
+ int dist = 0;
+ if (prev.GetNumWordsCovered() == 0) {
+ dist = current.GetStartPos();
+ }
+ else {
+ dist = (int) prev.GetEndPos() - (int) current.GetStartPos() + 1;
+ }
+ return abs(dist);
+}
+
+void Distortion::EvaluateWhenApplied(const SCFG::Manager &mgr,
+ const SCFG::Hypothesis &hypo, int featureID, Scores &scores,
+ FFState &state) const
+{
+ UTIL_THROW2("Not implemented");
+}
+
+}
+