/* * LexicalReordering.cpp * * Created on: 15 Dec 2015 * Author: hieu */ #include #include "util/exception.hh" #include "LexicalReordering.h" #include "LRModel.h" #include "PhraseBasedReorderingState.h" #include "BidirectionalReorderingState.h" #include "../../TranslationModel/PhraseTable.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" #ifdef HAVE_CMPH #include "../../TranslationModel/CompactPT/LexicalReorderingTableCompact.h" #endif using namespace std; namespace Moses2 { /////////////////////////////////////////////////////////////////////// LexicalReordering::LexicalReordering(size_t startInd, const std::string &line) : StatefulFeatureFunction(startInd, line) , m_blank(NULL) , m_propertyInd(-1) , m_coll(NULL) , m_configuration(NULL) #ifdef HAVE_CMPH , m_compactModel(NULL) #endif { ReadParameters(); assert(m_configuration); //assert(m_numScores == 6); } LexicalReordering::~LexicalReordering() { delete m_coll; delete m_configuration; #ifdef HAVE_CMPH delete m_compactModel; #endif } void LexicalReordering::Load(System &system) { MemPool &pool = system.GetSystemPool(); if (m_propertyInd >= 0) { // Using integrate Lex RO. No loading needed #ifdef HAVE_CMPH } 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(pool, 0); #endif } 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 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 scores = Tokenize(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(value); } else if (key == "output-factor") { m_FactorsE = Tokenize(value); } else if (key == "property-index") { m_propertyInd = Scan(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(state); stateCast.Init(NULL, hypo.GetTargetPhrase(), hypo.GetInputPath(), true, &hypo.GetBitmap()); } void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system, const Phrase &source, const TargetPhraseImpl &targetPhrase, Scores &scores, SCORE &estimatedScore) const { } void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system, const Phrase &source, const TargetPhrase &targetPhrase, Scores &scores, SCORE &estimatedScore) const { UTIL_THROW2("Don't use with SCFG models"); } void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool, const TargetPhrases &tps, const Phrase &sourcePhrase) const { BOOST_FOREACH(const TargetPhraseImpl *tp, tps) { EvaluateAfterTablePruning(pool, *tp, sourcePhrase); } } void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool, const TargetPhraseImpl &targetPhrase, const Phrase &sourcePhrase) const { if (m_propertyInd >= 0) { SCORE *scoreArr = targetPhrase.GetScoresProperty(m_propertyInd); targetPhrase.ffData[m_PhraseTableInd] = scoreArr; #ifdef HAVE_CMPH } 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(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; } #endif } 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(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(prevState); prevStateCast.Expand(mgr, *this, hypo, m_PhraseTableInd, scores, state); } const LexicalReordering::Values *LexicalReordering::GetValues( const Phrase &source, const Phrase &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 */