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/LexicalReordering/LRState.cpp')
-rw-r--r--contrib/moses2/FF/LexicalReordering/LRState.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/contrib/moses2/FF/LexicalReordering/LRState.cpp b/contrib/moses2/FF/LexicalReordering/LRState.cpp
new file mode 100644
index 000000000..4e9abd774
--- /dev/null
+++ b/contrib/moses2/FF/LexicalReordering/LRState.cpp
@@ -0,0 +1,93 @@
+/*
+ * LRState.cpp
+ *
+ * Created on: 22 Mar 2016
+ * Author: hieu
+ */
+#include "LRState.h"
+#include "LexicalReordering.h"
+#include "../../Scores.h"
+#include "../../TargetPhrase.h"
+
+using namespace std;
+
+namespace Moses2
+{
+
+class InputType;
+
+LRState::LRState(const LRModel &config, LRModel::Direction dir, size_t offset) :
+ m_configuration(config), m_direction(dir), m_offset(offset)
+{
+}
+
+int LRState::ComparePrevScores(const TargetPhrase<Moses2::Word> *other) const
+{
+ LexicalReordering* producer = m_configuration.GetScoreProducer();
+ size_t phraseTableInd = producer->GetPhraseTableInd();
+ const SCORE *myScores = (const SCORE*) prevTP->ffData[phraseTableInd]; //producer->
+ const SCORE *yrScores = (const SCORE*) other->ffData[phraseTableInd]; //producer->
+
+ if (myScores == yrScores) return 0;
+
+ // The pointers are NULL if a phrase pair isn't found in the reordering table.
+ if (yrScores == NULL) return -1;
+ if (myScores == NULL) return 1;
+
+ size_t stop = m_offset + m_configuration.GetNumberOfTypes();
+ for (size_t i = m_offset; i < stop; i++) {
+ if ((myScores)[i] < (yrScores)[i]) return -1;
+ if ((myScores)[i] > (yrScores)[i]) return 1;
+ }
+ return 0;
+}
+
+void LRState::CopyScores(const System &system, Scores &accum,
+ const TargetPhrase<Moses2::Word> &topt, ReorderingType reoType) const
+{
+ // don't call this on a bidirectional object
+ UTIL_THROW_IF2(
+ m_direction != LRModel::Backward && m_direction != LRModel::Forward,
+ "Unknown direction: " << m_direction);
+
+ TargetPhrase<Moses2::Word> const* relevantOpt = (
+ (m_direction == LRModel::Backward) ? &topt : prevTP);
+
+ LexicalReordering* producer = m_configuration.GetScoreProducer();
+ size_t phraseTableInd = producer->GetPhraseTableInd();
+ const SCORE *cached = (const SCORE*) relevantOpt->ffData[phraseTableInd]; //producer->
+
+ if (cached == NULL) {
+ return;
+ }
+
+ size_t off_remote = m_offset + reoType;
+ size_t off_local = m_configuration.CollapseScores() ? m_offset : off_remote;
+
+ UTIL_THROW_IF2(off_local >= producer->GetNumScores(),
+ "offset out of vector bounds!");
+
+ // look up applicable score from vector of scores
+ //UTIL_THROW_IF2(off_remote >= cached->size(), "offset out of vector bounds!");
+ //Scores scores(producer->GetNumScoreComponents(),0);
+ SCORE score = cached[off_remote];
+ accum.PlusEquals(system, *producer, score, off_local);
+
+ // else: use default scores (if specified)
+ /*
+ else if (producer->GetHaveDefaultScores()) {
+ Scores scores(producer->GetNumScoreComponents(),0);
+ scores[off_local] = producer->GetDefaultScore(off_remote);
+ accum->PlusEquals(m_configuration.GetScoreProducer(), scores);
+ }
+ */
+ // note: if no default score, no cost
+ /*
+ const SparseReordering* sparse = m_configuration.GetSparseReordering();
+ if (sparse) sparse->CopyScores(*relevantOpt, m_prevOption, input, reoType,
+ m_direction, accum);
+ */
+}
+
+}
+