| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "ChartTranslationOptions.h" |
| #include "ChartHypothesis.h" |
| #include "ChartCellLabel.h" |
| #include "ChartTranslationOption.h" |
| #include "InputPath.h" |
| #include "StaticData.h" |
| #include "TranslationTask.h" |
|
|
| using namespace std; |
|
|
| namespace Moses |
| { |
|
|
| ChartTranslationOptions::ChartTranslationOptions(const TargetPhraseCollection &targetPhraseColl, |
| const StackVec &stackVec, |
| const Range &range, |
| float score) |
| : m_stackVec(stackVec) |
| , m_wordsRange(&range) |
| , m_estimateOfBestScore(score) |
| { |
| TargetPhraseCollection::const_iterator iter; |
| for (iter = targetPhraseColl.begin(); iter != targetPhraseColl.end(); ++iter) { |
| const TargetPhrase *origTP = *iter; |
|
|
| boost::shared_ptr<ChartTranslationOption> ptr(new ChartTranslationOption(*origTP)); |
| m_collection.push_back(ptr); |
| } |
| } |
|
|
| ChartTranslationOptions::~ChartTranslationOptions() |
| { |
|
|
| } |
|
|
| |
| class ChartTranslationOptionScoreOrderer |
| { |
| public: |
| bool operator()(const boost::shared_ptr<ChartTranslationOption> &transOptA |
| , const boost::shared_ptr<ChartTranslationOption> &transOptB) const { |
| const ScoreComponentCollection &scoresA = transOptA->GetScores(); |
| const ScoreComponentCollection &scoresB = transOptB->GetScores(); |
| return scoresA.GetWeightedScore() > scoresB.GetWeightedScore(); |
| } |
| }; |
|
|
| void ChartTranslationOptions::EvaluateWithSourceContext(const InputType &input, const InputPath &inputPath) |
| { |
| SetInputPath(&inputPath); |
| |
| if (inputPath.ttask->options()->input.placeholder_factor != NOT_FOUND) { |
| CreateSourceRuleFromInputPath(); |
| } |
|
|
| CollType::iterator iter; |
| for (iter = m_collection.begin(); iter != m_collection.end(); ++iter) { |
| ChartTranslationOption &transOpt = **iter; |
| transOpt.SetInputPath(&inputPath); |
| transOpt.EvaluateWithSourceContext(input, inputPath, m_stackVec); |
| } |
|
|
| |
| size_t numDiscard = 0; |
| for (size_t i = 0; i < m_collection.size(); ++i) { |
| ChartTranslationOption *transOpt = m_collection[i].get(); |
|
|
| if (transOpt->GetScores().GetWeightedScore() == - std::numeric_limits<float>::infinity()) { |
| ++numDiscard; |
| } else if (numDiscard) { |
| m_collection[i - numDiscard] = m_collection[i]; |
| } |
| } |
|
|
| size_t newSize = m_collection.size() - numDiscard; |
| m_collection.resize(newSize); |
|
|
| |
| const StaticData &staticData = StaticData::Instance(); |
| if (staticData.RequireSortingAfterSourceContext()) { |
| std::sort(m_collection.begin() |
| , m_collection.begin() + newSize |
| , ChartTranslationOptionScoreOrderer()); |
| } |
|
|
| } |
|
|
| void ChartTranslationOptions::SetInputPath(const InputPath *inputPath) |
| { |
| CollType::iterator iter; |
| for (iter = m_collection.begin(); iter != m_collection.end(); ++iter) { |
| ChartTranslationOption &transOpt = **iter; |
| transOpt.SetInputPath(inputPath); |
| } |
| } |
|
|
| void ChartTranslationOptions::CreateSourceRuleFromInputPath() |
| { |
| if (m_collection.size() == 0) { |
| return; |
| } |
|
|
| const InputPath *inputPath = m_collection.front()->GetInputPath(); |
| assert(inputPath); |
| std::vector<const Word*> &ruleSourceFromInputPath = inputPath->AddRuleSourceFromInputPath(); |
|
|
| size_t chartCellIndex = 0; |
| const ChartCellLabel *chartCellLabel = (chartCellIndex < m_stackVec.size()) ? m_stackVec[chartCellIndex] : NULL; |
|
|
| size_t ind = 0; |
| for (size_t sourcePos = m_wordsRange->GetStartPos(); sourcePos <= m_wordsRange->GetEndPos(); ++sourcePos, ++ind) { |
| if (chartCellLabel) { |
| if (sourcePos == chartCellLabel->GetCoverage().GetEndPos()) { |
| |
| ruleSourceFromInputPath.push_back(NULL); |
| ++chartCellIndex; |
| chartCellLabel = (chartCellIndex < m_stackVec.size()) ? m_stackVec[chartCellIndex] : NULL; |
| } else if (sourcePos >= chartCellLabel->GetCoverage().GetStartPos()) { |
| |
| } else { |
| |
| ruleSourceFromInputPath.push_back(&inputPath->GetPhrase().GetWord(ind)); |
| } |
| } else { |
| |
| ruleSourceFromInputPath.push_back(&inputPath->GetPhrase().GetWord(ind)); |
| } |
| } |
|
|
| |
| CollType::iterator iter; |
| for (iter = m_collection.begin(); iter != m_collection.end(); ++iter) { |
| ChartTranslationOption &transOpt = **iter; |
| transOpt.SetSourceRuleFromInputPath(&ruleSourceFromInputPath); |
| } |
|
|
| } |
|
|
| std::ostream& operator<<(std::ostream &out, const ChartTranslationOptions &obj) |
| { |
| for (size_t i = 0; i < obj.m_collection.size(); ++i) { |
| const ChartTranslationOption &transOpt = *obj.m_collection[i]; |
| out << transOpt << endl; |
| } |
|
|
| return out; |
| } |
|
|
| } |
|
|