/* * TrellisPath.cpp * * Created on: 16 Mar 2016 * Author: hieu */ #include #include #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++) { // copy path from parent nodes.push_back(origPath.nodes[currEdge]); } // 1 deviation nodes.push_back(newNode); // rest of path comes from following best path backwards const Hypothesis *arc = static_cast(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() { // TODO Auto-generated destructor stub } 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(node.GetHypo()); const TargetPhrase &tp = hypo->GetTargetPhrase(); const InputPath &path = static_cast(hypo->GetInputPath()); const SubPhrase &subPhrase = path.subPhrase; tp.OutputToStream(system, subPhrase, out); } return out.str(); } void TrellisPath::CreateDeviantPaths(TrellisPaths &paths, const ArcLists &arcLists, MemPool &pool, const System &system) const { const size_t sizePath = nodes.size(); //cerr << "prevEdgeChanged=" << prevEdgeChanged << endl; for (size_t currEdge = prevEdgeChanged + 1; currEdge < sizePath; currEdge++) { TrellisNode newNode = nodes[currEdge]; assert(newNode.ind == 0); const ArcList &arcList = *newNode.arcList; //cerr << "arcList=" << arcList.size() << endl; for (size_t i = 1; i < arcList.size(); ++i) { //cerr << "i=" << i << endl; newNode.ind = i; TrellisPath *deviantPath = new TrellisPath(*this, currEdge, newNode, arcLists, pool, system); //cerr << "deviantPath=" << deviantPath << endl; 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(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) { // add this hypo //cerr << "hypo=" << hypo << " " << flush; //cerr << *hypo << endl; const ArcList &list = arcLists.GetArcList(hypo); TrellisNode node(list, 0); nodes.push_back(node); // add prev hypos const Hypothesis *prev = hypo->GetPrevHypo(); AddNodes(prev, arcLists); } } } /* namespace Moses2 */