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
path: root/moses
diff options
context:
space:
mode:
Diffstat (limited to 'moses')
-rw-r--r--moses/Manager.cpp2
-rw-r--r--moses/TrellisPath.cpp40
-rw-r--r--moses/TrellisPath.h14
-rw-r--r--moses/mbr.cpp4
-rw-r--r--moses/server/TranslationRequest.cpp2
5 files changed, 39 insertions, 23 deletions
diff --git a/moses/Manager.cpp b/moses/Manager.cpp
index da0661aee..c46183b11 100644
--- a/moses/Manager.cpp
+++ b/moses/Manager.cpp
@@ -1637,7 +1637,7 @@ void Manager::OutputNBest(std::ostream& out
out << " |||";
// print scores with feature names
- path.GetScoreBreakdown().OutputAllFeatureScores(out );
+ path.GetScoreBreakdown()->OutputAllFeatureScores(out);
// total
out << " ||| " << path.GetTotalScore();
diff --git a/moses/TrellisPath.cpp b/moses/TrellisPath.cpp
index e76adc2db..36397e006 100644
--- a/moses/TrellisPath.cpp
+++ b/moses/TrellisPath.cpp
@@ -31,7 +31,6 @@ namespace Moses
TrellisPath::TrellisPath(const Hypothesis *hypo)
: m_prevEdgeChanged(NOT_FOUND)
{
- m_scoreBreakdown = hypo->GetScoreBreakdown();
m_totalScore = hypo->GetTotalScore();
// enumerate path using prevHypo
@@ -41,10 +40,9 @@ TrellisPath::TrellisPath(const Hypothesis *hypo)
}
}
-void TrellisPath::InitScore()
+void TrellisPath::InitTotalScore()
{
m_totalScore = m_path[0]->GetWinningHypo()->GetTotalScore();
- m_scoreBreakdown= m_path[0]->GetWinningHypo()->GetScoreBreakdown();
//calc score
size_t sizePath = m_path.size();
@@ -53,12 +51,8 @@ void TrellisPath::InitScore()
const Hypothesis *winningHypo = hypo->GetWinningHypo();
if (hypo != winningHypo) {
m_totalScore = m_totalScore - winningHypo->GetTotalScore() + hypo->GetTotalScore();
- m_scoreBreakdown.MinusEquals(winningHypo->GetScoreBreakdown());
- m_scoreBreakdown.PlusEquals(hypo->GetScoreBreakdown());
}
}
-
-
}
TrellisPath::TrellisPath(const TrellisPath &copy, size_t edgeIndex, const Hypothesis *arc)
@@ -80,7 +74,7 @@ TrellisPath::TrellisPath(const TrellisPath &copy, size_t edgeIndex, const Hypoth
prevHypo = prevHypo->GetPrevHypo();
}
- InitScore();
+ InitTotalScore();
}
TrellisPath::TrellisPath(const vector<const Hypothesis*> edges)
@@ -88,9 +82,7 @@ TrellisPath::TrellisPath(const vector<const Hypothesis*> edges)
{
m_path.resize(edges.size());
copy(edges.rbegin(),edges.rend(),m_path.begin());
- InitScore();
-
-
+ InitTotalScore();
}
@@ -172,6 +164,32 @@ void TrellisPath::CreateDeviantPaths(TrellisPathList &pathColl) const
}
}
+const boost::shared_ptr<ScoreComponentCollection> TrellisPath::GetScoreBreakdown() const
+{
+ if (!m_scoreBreakdown) {
+ float totalScore = m_path[0]->GetWinningHypo()->GetTotalScore(); // calculated for sanity check only
+
+ m_scoreBreakdown = boost::shared_ptr<ScoreComponentCollection>(new ScoreComponentCollection());
+ m_scoreBreakdown->PlusEquals(ScoreComponentCollection(m_path[0]->GetWinningHypo()->GetScoreBreakdown()));
+
+ //calc score
+ size_t sizePath = m_path.size();
+ for (size_t pos = 0 ; pos < sizePath ; pos++) {
+ const Hypothesis *hypo = m_path[pos];
+ const Hypothesis *winningHypo = hypo->GetWinningHypo();
+ if (hypo != winningHypo) {
+ totalScore = totalScore - winningHypo->GetTotalScore() + hypo->GetTotalScore();
+ m_scoreBreakdown->MinusEquals(winningHypo->GetScoreBreakdown());
+ m_scoreBreakdown->PlusEquals(hypo->GetScoreBreakdown());
+ }
+ }
+
+ assert(totalScore == m_totalScore);
+ }
+
+ return m_scoreBreakdown;
+}
+
Phrase TrellisPath::GetTargetPhrase() const
{
Phrase targetPhrase(ARRAY_SIZE_INCR);
diff --git a/moses/TrellisPath.h b/moses/TrellisPath.h
index def86549b..89efb32e4 100644
--- a/moses/TrellisPath.h
+++ b/moses/TrellisPath.h
@@ -19,14 +19,14 @@ License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
***********************************************************************/
-#ifndef moses_TrellisPath_h
-#define moses_TrellisPath_h
+#pragma once
#include <iostream>
#include <vector>
#include <limits>
#include "Hypothesis.h"
#include "TypeDef.h"
+#include <boost/shared_ptr.hpp>
namespace Moses
{
@@ -50,13 +50,13 @@ protected:
, or NOT_FOUND if this path is the best trans so consist of only hypos
*/
- ScoreComponentCollection m_scoreBreakdown;
float m_totalScore;
+ mutable boost::shared_ptr<ScoreComponentCollection> m_scoreBreakdown;
//Used by Manager::LatticeSample()
explicit TrellisPath(const std::vector<const Hypothesis*> edges);
- void InitScore();
+ void InitTotalScore();
public:
TrellisPath(); // not implemented
@@ -91,9 +91,7 @@ public:
//! create a list of next best paths by wiggling 1 of the node at a time.
void CreateDeviantPaths(TrellisPathList &pathColl) const;
- inline const ScoreComponentCollection &GetScoreBreakdown() const {
- return m_scoreBreakdown;
- }
+ const boost::shared_ptr<ScoreComponentCollection> GetScoreBreakdown() const;
//! get target words range of the hypo within n-best trellis. not necessarily the same as hypo.GetCurrTargetWordsRange()
WordsRange GetTargetWordsRange(const Hypothesis &hypo) const;
@@ -123,4 +121,4 @@ inline std::ostream& operator<<(std::ostream& out, const TrellisPath& path)
}
}
-#endif
+
diff --git a/moses/mbr.cpp b/moses/mbr.cpp
index df2313b66..66dac47f7 100644
--- a/moses/mbr.cpp
+++ b/moses/mbr.cpp
@@ -105,13 +105,13 @@ const TrellisPath doMBR(const TrellisPathList& nBestList)
for (iter = nBestList.begin() ; iter != nBestList.end() ; ++iter) {
const TrellisPath &path = **iter;
float score = StaticData::Instance().GetMBRScale()
- * path.GetScoreBreakdown().GetWeightedScore();
+ * path.GetScoreBreakdown()->GetWeightedScore();
if (maxScore < score) maxScore = score;
}
for (iter = nBestList.begin() ; iter != nBestList.end() ; ++iter) {
const TrellisPath &path = **iter;
- joint_prob = UntransformScore(StaticData::Instance().GetMBRScale() * path.GetScoreBreakdown().GetWeightedScore() - maxScore);
+ joint_prob = UntransformScore(StaticData::Instance().GetMBRScale() * path.GetScoreBreakdown()->GetWeightedScore() - maxScore);
marginal += joint_prob;
joint_prob_vec.push_back(joint_prob);
diff --git a/moses/server/TranslationRequest.cpp b/moses/server/TranslationRequest.cpp
index 1953a711f..a1daf8393 100644
--- a/moses/server/TranslationRequest.cpp
+++ b/moses/server/TranslationRequest.cpp
@@ -166,7 +166,7 @@ namespace MosesServer
{
// should the score breakdown be reported in a more structured manner?
ostringstream buf;
- path->GetScoreBreakdown().OutputAllFeatureScores(buf);
+ path->GetScoreBreakdown()->OutputAllFeatureScores(buf);
nBestXmlItem["fvals"] = xmlrpc_c::value_string(buf.str());
}