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/LexicalReordering.cpp')
-rw-r--r--contrib/moses2/FF/LexicalReordering/LexicalReordering.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/contrib/moses2/FF/LexicalReordering/LexicalReordering.cpp b/contrib/moses2/FF/LexicalReordering/LexicalReordering.cpp
new file mode 100644
index 000000000..97394ce84
--- /dev/null
+++ b/contrib/moses2/FF/LexicalReordering/LexicalReordering.cpp
@@ -0,0 +1,222 @@
+/*
+ * LexicalReordering.cpp
+ *
+ * Created on: 15 Dec 2015
+ * Author: hieu
+ */
+
+#include <boost/foreach.hpp>
+#include "util/exception.hh"
+#include "LexicalReordering.h"
+#include "LRModel.h"
+#include "PhraseBasedReorderingState.h"
+#include "BidirectionalReorderingState.h"
+#include "../../TranslationModel/PhraseTable.h"
+#include "../../TranslationModel/CompactPT/LexicalReorderingTableCompact.h"
+#include "../../System.h"
+#include "../../PhraseBased/PhraseImpl.h"
+#include "../../PhraseBased/Manager.h"
+#include "../../PhraseBased/Hypothesis.h"
+#include "../../PhraseBased/TargetPhrases.h"
+#include "../../PhraseBased/TargetPhraseImpl.h"
+#include "../../legacy/InputFileStream.h"
+#include "../../legacy/Util2.h"
+
+using namespace std;
+
+namespace Moses2
+{
+
+///////////////////////////////////////////////////////////////////////
+
+LexicalReordering::LexicalReordering(size_t startInd, const std::string &line) :
+ StatefulFeatureFunction(startInd, line), m_compactModel(NULL), m_blank(
+ NULL), m_propertyInd(-1), m_coll(NULL), m_configuration(NULL)
+{
+ ReadParameters();
+ assert(m_configuration);
+ //assert(m_numScores == 6);
+}
+
+LexicalReordering::~LexicalReordering()
+{
+ delete m_compactModel;
+ delete m_coll;
+ delete m_configuration;
+}
+
+void LexicalReordering::Load(System &system)
+{
+ MemPool &pool = system.GetSystemPool();
+
+ if (m_propertyInd >= 0) {
+ // Using integrate Lex RO. No loading needed
+ }
+ else if (FileExists(m_path + ".minlexr")) {
+ m_compactModel = new LexicalReorderingTableCompact(m_path + ".minlexr",
+ m_FactorsF, m_FactorsE, m_FactorsC);
+ m_blank = new (pool.Allocate<PhraseImpl>()) PhraseImpl(pool, 0);
+ }
+ else {
+ m_coll = new Coll();
+ InputFileStream file(m_path);
+ string line;
+ size_t lineNum = 0;
+
+ while (getline(file, line)) {
+ if (++lineNum % 1000000 == 0) {
+ cerr << lineNum << " ";
+ }
+
+ std::vector<std::string> toks = TokenizeMultiCharSeparator(line, "|||");
+ assert(toks.size() == 3);
+ PhraseImpl *source = PhraseImpl::CreateFromString(pool, system.GetVocab(),
+ system, toks[0]);
+ PhraseImpl *target = PhraseImpl::CreateFromString(pool, system.GetVocab(),
+ system, toks[1]);
+ std::vector<SCORE> scores = Tokenize<SCORE>(toks[2]);
+ std::transform(scores.begin(), scores.end(), scores.begin(),
+ TransformScore);
+ std::transform(scores.begin(), scores.end(), scores.begin(), FloorScore);
+
+ Key key(source, target);
+ (*m_coll)[key] = scores;
+ }
+ }
+}
+
+void LexicalReordering::SetParameter(const std::string& key,
+ const std::string& value)
+{
+ if (key == "path") {
+ m_path = value;
+ }
+ else if (key == "type") {
+ m_configuration = new LRModel(value, *this);
+ }
+ else if (key == "input-factor") {
+ m_FactorsF = Tokenize<FactorType>(value);
+ }
+ else if (key == "output-factor") {
+ m_FactorsE = Tokenize<FactorType>(value);
+ }
+ else if (key == "property-index") {
+ m_propertyInd = Scan<int>(value);
+ }
+ else {
+ StatefulFeatureFunction::SetParameter(key, value);
+ }
+}
+
+FFState* LexicalReordering::BlankState(MemPool &pool, const System &sys) const
+{
+ FFState *ret = m_configuration->CreateLRState(pool);
+ return ret;
+}
+
+void LexicalReordering::EmptyHypothesisState(FFState &state,
+ const ManagerBase &mgr, const InputType &input,
+ const Hypothesis &hypo) const
+{
+ BidirectionalReorderingState &stateCast =
+ static_cast<BidirectionalReorderingState&>(state);
+ stateCast.Init(NULL, hypo.GetTargetPhrase(), hypo.GetInputPath(), true,
+ &hypo.GetBitmap());
+}
+
+void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system,
+ const Phrase<Moses2::Word> &source, const TargetPhraseImpl &targetPhrase, Scores &scores,
+ SCORE &estimatedScore) const
+{
+}
+
+void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system, const Phrase<SCFG::Word> &source,
+ const TargetPhrase<SCFG::Word> &targetPhrase, Scores &scores,
+ SCORE &estimatedScore) const
+{
+ UTIL_THROW2("Don't use with SCFG models");
+}
+
+
+void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool,
+ const TargetPhrases &tps, const Phrase<Moses2::Word> &sourcePhrase) const
+{
+ BOOST_FOREACH(const TargetPhraseImpl *tp, tps){
+ EvaluateAfterTablePruning(pool, *tp, sourcePhrase);
+}
+}
+
+void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool,
+ const TargetPhraseImpl &targetPhrase, const Phrase<Moses2::Word> &sourcePhrase) const
+{
+ if (m_propertyInd >= 0) {
+ SCORE *scoreArr = targetPhrase.GetScoresProperty(m_propertyInd);
+ targetPhrase.ffData[m_PhraseTableInd] = scoreArr;
+ }
+ else if (m_compactModel) {
+ // using external compact binary model
+ const Values values = m_compactModel->GetScore(sourcePhrase, targetPhrase,
+ *m_blank);
+ if (values.size()) {
+ assert(values.size() == m_numScores);
+
+ SCORE *scoreArr = pool.Allocate<SCORE>(m_numScores);
+ for (size_t i = 0; i < m_numScores; ++i) {
+ scoreArr[i] = values[i];
+ }
+ targetPhrase.ffData[m_PhraseTableInd] = scoreArr;
+ }
+ else {
+ targetPhrase.ffData[m_PhraseTableInd] = NULL;
+ }
+ }
+ else if (m_coll) {
+ // using external memory model
+
+ // cache data in target phrase
+ const Values *values = GetValues(sourcePhrase, targetPhrase);
+ assert(values->size() == m_numScores);
+
+ if (values) {
+ SCORE *scoreArr = pool.Allocate<SCORE>(m_numScores);
+ for (size_t i = 0; i < m_numScores; ++i) {
+ scoreArr[i] = (*values)[i];
+ }
+ targetPhrase.ffData[m_PhraseTableInd] = scoreArr;
+ }
+ else {
+ targetPhrase.ffData[m_PhraseTableInd] = NULL;
+ }
+ }
+}
+
+void LexicalReordering::EvaluateWhenApplied(const ManagerBase &mgr,
+ const Hypothesis &hypo, const FFState &prevState, Scores &scores,
+ FFState &state) const
+{
+ const LRState &prevStateCast = static_cast<const LRState&>(prevState);
+ prevStateCast.Expand(mgr, *this, hypo, m_PhraseTableInd, scores, state);
+}
+
+const LexicalReordering::Values *LexicalReordering::GetValues(
+ const Phrase<Moses2::Word> &source, const Phrase<Moses2::Word> &target) const
+{
+ Key key(&source, &target);
+ Coll::const_iterator iter;
+ iter = m_coll->find(key);
+ if (iter == m_coll->end()) {
+ return NULL;
+ }
+ else {
+ return &iter->second;
+ }
+}
+
+void LexicalReordering::EvaluateWhenApplied(const SCFG::Manager &mgr,
+ const SCFG::Hypothesis &hypo, int featureID, Scores &scores,
+ FFState &state) const
+{
+ UTIL_THROW2("Not implemented");
+}
+
+} /* namespace Moses2 */