| |
| #include <vector> |
| #include <string> |
|
|
| #include "LRState.h" |
| #include "moses/FF/FFState.h" |
| #include "moses/Hypothesis.h" |
| #include "moses/Range.h" |
| #include "moses/TranslationOption.h" |
| #include "moses/Util.h" |
|
|
| #include "LexicalReordering.h" |
|
|
| namespace Moses |
| { |
|
|
| void |
| LRState:: |
| CopyScores(ScoreComponentCollection* accum, |
| const TranslationOption &topt, |
| const InputType& input, |
| ReorderingType reoType) const |
| { |
| |
| UTIL_THROW_IF2(m_direction != LRModel::Backward && |
| m_direction != LRModel::Forward, |
| "Unknown direction: " << m_direction); |
|
|
| TranslationOption const* relevantOpt = ((m_direction == LRModel::Backward) |
| ? &topt : m_prevOption); |
|
|
| LexicalReordering* producer = m_configuration.GetScoreProducer(); |
| Scores const* cached = relevantOpt->GetLexReorderingScores(producer); |
|
|
| |
| |
| size_t off_remote = m_offset + reoType; |
| size_t off_local = m_configuration.CollapseScores() ? m_offset : off_remote; |
|
|
| UTIL_THROW_IF2(off_local >= producer->GetNumScoreComponents(), |
| "offset out of vector bounds!"); |
|
|
| |
| if(cached) { |
| UTIL_THROW_IF2(off_remote >= cached->size(), "offset out of vector bounds!"); |
| Scores scores(producer->GetNumScoreComponents(),0); |
| scores[off_local ] = (*cached)[off_remote]; |
| accum->PlusEquals(producer, scores); |
| } |
|
|
| |
| else if (producer->GetHaveDefaultScores()) { |
| Scores scores(producer->GetNumScoreComponents(),0); |
| scores[off_local] = producer->GetDefaultScore(off_remote); |
| accum->PlusEquals(m_configuration.GetScoreProducer(), scores); |
| } |
| |
|
|
| const SparseReordering* sparse = m_configuration.GetSparseReordering(); |
| if (sparse) sparse->CopyScores(*relevantOpt, m_prevOption, input, reoType, |
| m_direction, accum); |
| } |
|
|
|
|
| int |
| LRState:: |
| ComparePrevScores(const TranslationOption *other) const |
| { |
| LexicalReordering* producer = m_configuration.GetScoreProducer(); |
| const Scores* myScores = m_prevOption->GetLexReorderingScores(producer); |
| const Scores* yrScores = other->GetLexReorderingScores(producer); |
|
|
| if(myScores == yrScores) return 0; |
|
|
| |
| 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; |
| } |
|
|
| } |
|
|
|
|