|
|
|
|
|
|
|
|
|
|
|
|
|
#include <cassert> |
|
#include <sstream> |
|
#include "TrellisPath.h" |
|
#include "Hypothesis.h" |
|
#include "InputPath.h" |
|
#include "../TrellisPaths.h" |
|
#include "../System.h" |
|
#include "../SubPhrase.h" |
|
|
|
using namespace std; |
|
|
|
namespace Moses2 |
|
{ |
|
|
|
std::string TrellisNode::Debug(const System &system) const |
|
{ |
|
stringstream out; |
|
out << "arcList=" << arcList->size() << " " << ind; |
|
return out.str(); |
|
} |
|
|
|
|
|
TrellisPath::TrellisPath(const Hypothesis *hypo, const ArcLists &arcLists) : |
|
prevEdgeChanged(-1) |
|
{ |
|
AddNodes(hypo, arcLists); |
|
m_scores = &hypo->GetScores(); |
|
} |
|
|
|
TrellisPath::TrellisPath(const TrellisPath &origPath, size_t edgeIndex, |
|
const TrellisNode &newNode, const ArcLists &arcLists, MemPool &pool, |
|
const System &system) : |
|
prevEdgeChanged(edgeIndex) |
|
{ |
|
nodes.reserve(origPath.nodes.size()); |
|
for (size_t currEdge = 0; currEdge < edgeIndex; currEdge++) { |
|
|
|
nodes.push_back(origPath.nodes[currEdge]); |
|
} |
|
|
|
|
|
nodes.push_back(newNode); |
|
|
|
|
|
const Hypothesis *arc = static_cast<const Hypothesis*>(newNode.GetHypo()); |
|
|
|
const Hypothesis *prevHypo = arc->GetPrevHypo(); |
|
while (prevHypo != NULL) { |
|
const ArcList &arcList = arcLists.GetArcList(prevHypo); |
|
TrellisNode node(arcList, 0); |
|
nodes.push_back(node); |
|
|
|
prevHypo = prevHypo->GetPrevHypo(); |
|
} |
|
|
|
const TrellisNode &origNode = origPath.nodes[edgeIndex]; |
|
const HypothesisBase *origHypo = origNode.GetHypo(); |
|
const HypothesisBase *newHypo = newNode.GetHypo(); |
|
|
|
CalcScores(origPath.GetScores(), origHypo->GetScores(), newHypo->GetScores(), |
|
pool, system); |
|
} |
|
|
|
TrellisPath::~TrellisPath() |
|
{ |
|
|
|
} |
|
|
|
SCORE TrellisPath::GetFutureScore() const |
|
{ |
|
return m_scores->GetTotalScore(); |
|
} |
|
|
|
std::string TrellisPath::Debug(const System &system) const |
|
{ |
|
stringstream out; |
|
|
|
out << OutputTargetPhrase(system); |
|
out << "||| "; |
|
|
|
out << GetScores().Debug(system); |
|
out << "||| "; |
|
|
|
out << GetScores().GetTotalScore(); |
|
|
|
return out.str(); |
|
} |
|
|
|
void TrellisPath::OutputToStream(std::ostream &out, const System &system) const |
|
{ |
|
out << OutputTargetPhrase(system); |
|
out << "||| "; |
|
|
|
GetScores().OutputBreakdown(out, system); |
|
out << "||| "; |
|
|
|
out << GetScores().GetTotalScore(); |
|
} |
|
|
|
std::string TrellisPath::OutputTargetPhrase(const System &system) const |
|
{ |
|
std::stringstream out; |
|
for (int i = nodes.size() - 2; i >= 0; --i) { |
|
const TrellisNode &node = nodes[i]; |
|
|
|
const Hypothesis *hypo = static_cast<const Hypothesis*>(node.GetHypo()); |
|
const TargetPhrase<Moses2::Word> &tp = hypo->GetTargetPhrase(); |
|
|
|
const InputPath &path = static_cast<const InputPath&>(hypo->GetInputPath()); |
|
const SubPhrase<Moses2::Word> &subPhrase = path.subPhrase; |
|
|
|
tp.OutputToStream(system, subPhrase, out); |
|
} |
|
return out.str(); |
|
} |
|
|
|
void TrellisPath::CreateDeviantPaths(TrellisPaths<TrellisPath> &paths, |
|
const ArcLists &arcLists, MemPool &pool, const System &system) const |
|
{ |
|
const size_t sizePath = nodes.size(); |
|
|
|
|
|
for (size_t currEdge = prevEdgeChanged + 1; currEdge < sizePath; currEdge++) { |
|
TrellisNode newNode = nodes[currEdge]; |
|
assert(newNode.ind == 0); |
|
const ArcList &arcList = *newNode.arcList; |
|
|
|
|
|
for (size_t i = 1; i < arcList.size(); ++i) { |
|
|
|
newNode.ind = i; |
|
|
|
TrellisPath *deviantPath = new TrellisPath(*this, currEdge, newNode, |
|
arcLists, pool, system); |
|
|
|
paths.Add(deviantPath); |
|
} |
|
} |
|
} |
|
|
|
void TrellisPath::CalcScores(const Scores &origScores, |
|
const Scores &origHypoScores, const Scores &newHypoScores, MemPool &pool, |
|
const System &system) |
|
{ |
|
Scores *scores = new (pool.Allocate<Scores>()) Scores(system, pool, |
|
system.featureFunctions.GetNumScores(), origScores); |
|
scores->PlusEquals(system, newHypoScores); |
|
scores->MinusEquals(system, origHypoScores); |
|
|
|
m_scores = scores; |
|
} |
|
|
|
void TrellisPath::AddNodes(const Hypothesis *hypo, const ArcLists &arcLists) |
|
{ |
|
if (hypo) { |
|
|
|
|
|
|
|
const ArcList &list = arcLists.GetArcList(hypo); |
|
TrellisNode node(list, 0); |
|
nodes.push_back(node); |
|
|
|
|
|
const Hypothesis *prev = hypo->GetPrevHypo(); |
|
AddNodes(prev, arcLists); |
|
} |
|
} |
|
|
|
} |
|
|