hindi-sindhi-docker
/
mosesdecoder
/moses
/TranslationModel
/CYKPlusParser
/CompletedRuleCollection.cpp
| /*********************************************************************** | |
| Moses - factored phrase-based language decoder | |
| Copyright (C) 2014 University of Edinburgh | |
| This library is free software; you can redistribute it and/or | |
| modify it under the terms of the GNU Lesser General Public | |
| License as published by the Free Software Foundation; either | |
| version 2.1 of the License, or (at your option) any later version. | |
| This library is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| Lesser General Public License for more details. | |
| You should have received a copy of the GNU Lesser General Public | |
| License along with this library; if not, write to the Free Software | |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| ***********************************************************************/ | |
| using namespace std; | |
| namespace Moses | |
| { | |
| CompletedRuleCollection::CompletedRuleCollection(size_t rule_limit) | |
| : m_ruleLimit(rule_limit) | |
| { | |
| m_scoreThreshold = numeric_limits<float>::infinity(); | |
| } | |
| CompletedRuleCollection::~CompletedRuleCollection() | |
| { | |
| Clear(); | |
| } | |
| // copies some functionality (pruning) from ChartTranslationOptionList::Add | |
| void CompletedRuleCollection::Add(const TargetPhraseCollection &tpc, | |
| const StackVec &stackVec, | |
| const ChartParserCallback &outColl) | |
| { | |
| if (tpc.IsEmpty()) { | |
| return; | |
| } | |
| const TargetPhrase &targetPhrase = **(tpc.begin()); | |
| float score = targetPhrase.GetFutureScore(); | |
| for (StackVec::const_iterator p = stackVec.begin(); p != stackVec.end(); ++p) { | |
| float stackScore = (*p)->GetBestScore(&outColl); | |
| score += stackScore; | |
| } | |
| // If the rule limit has already been reached then don't add the option | |
| // unless it is better than at least one existing option. | |
| if (m_ruleLimit && m_collection.size() > m_ruleLimit && score < m_scoreThreshold) { | |
| return; | |
| } | |
| CompletedRule *completedRule = new CompletedRule(tpc, stackVec, score); | |
| m_collection.push_back(completedRule); | |
| // If the rule limit hasn't been exceeded then update the threshold. | |
| if (!m_ruleLimit || m_collection.size() <= m_ruleLimit) { | |
| m_scoreThreshold = (score < m_scoreThreshold) ? score : m_scoreThreshold; | |
| } | |
| // Prune if bursting | |
| if (m_ruleLimit && m_collection.size() == m_ruleLimit * 2) { | |
| NTH_ELEMENT4(m_collection.begin(), | |
| m_collection.begin() + m_ruleLimit - 1, | |
| m_collection.end(), | |
| CompletedRuleOrdered()); | |
| m_scoreThreshold = m_collection[m_ruleLimit-1]->GetScoreEstimate(); | |
| for (size_t i = 0 + m_ruleLimit; i < m_collection.size(); i++) { | |
| delete m_collection[i]; | |
| } | |
| m_collection.resize(m_ruleLimit); | |
| } | |
| } | |
| // copies some functionality (pruning) from ChartTranslationOptionList::Add | |
| void CompletedRuleCollection::Add(const TargetPhraseCollection &tpc, | |
| const StackVec &stackVec, | |
| const std::vector<float> &stackScores, | |
| const ChartParserCallback &outColl) | |
| { | |
| if (tpc.IsEmpty()) { | |
| return; | |
| } | |
| const TargetPhrase &targetPhrase = **(tpc.begin()); | |
| float score = std::accumulate(stackScores.begin(), stackScores.end(), targetPhrase.GetFutureScore()); | |
| // If the rule limit has already been reached then don't add the option | |
| // unless it is better than at least one existing option. | |
| if (m_collection.size() > m_ruleLimit && score < m_scoreThreshold) { | |
| return; | |
| } | |
| CompletedRule *completedRule = new CompletedRule(tpc, stackVec, score); | |
| m_collection.push_back(completedRule); | |
| // If the rule limit hasn't been exceeded then update the threshold. | |
| if (m_collection.size() <= m_ruleLimit) { | |
| m_scoreThreshold = (score < m_scoreThreshold) ? score : m_scoreThreshold; | |
| } | |
| // Prune if bursting | |
| if (m_collection.size() == m_ruleLimit * 2) { | |
| NTH_ELEMENT4(m_collection.begin(), | |
| m_collection.begin() + m_ruleLimit - 1, | |
| m_collection.end(), | |
| CompletedRuleOrdered()); | |
| m_scoreThreshold = m_collection[m_ruleLimit-1]->GetScoreEstimate(); | |
| for (size_t i = 0 + m_ruleLimit; i < m_collection.size(); i++) { | |
| delete m_collection[i]; | |
| } | |
| m_collection.resize(m_ruleLimit); | |
| } | |
| } | |
| } | |