| #include <boost/foreach.hpp> |
| #include "Stacks.h" |
| #include "Hypothesis.h" |
| #include "TargetPhraseImpl.h" |
| #include "Manager.h" |
|
|
| using namespace std; |
|
|
| namespace Moses2 |
| { |
|
|
| namespace SCFG |
| { |
|
|
| Stack::Stack(const Manager &mgr) |
| :m_mgr(mgr) |
| { |
| } |
|
|
| Stack::~Stack() |
| { |
| BOOST_FOREACH (const Coll::value_type &valPair, m_coll) { |
| Moses2::HypothesisColl *hypos = valPair.second; |
| delete hypos; |
| } |
| } |
|
|
| void Stack::Add(SCFG::Hypothesis *hypo, Recycler<HypothesisBase*> &hypoRecycle, |
| ArcLists &arcLists) |
| { |
| const SCFG::TargetPhraseImpl &tp = hypo->GetTargetPhrase(); |
| const SCFG::Word &lhs = tp.lhs; |
| |
|
|
| HypothesisColl &coll = GetColl(lhs); |
| coll.Add(m_mgr, hypo, hypoRecycle, arcLists); |
| } |
|
|
| size_t Stack::GetSize() const |
| { |
| size_t ret = 0; |
| BOOST_FOREACH (const Coll::value_type &valPair, m_coll) { |
| Moses2::HypothesisColl &hypos = *valPair.second; |
| ret += hypos.GetSize(); |
| } |
| return ret; |
| } |
|
|
| const Moses2::HypothesisColl *Stack::GetColl(const SCFG::Word &nt) const |
| { |
| assert(nt.isNonTerminal); |
| Coll::const_iterator iter = m_coll.find(nt); |
| if (iter != m_coll.end()) { |
| return NULL; |
| } else { |
| return iter->second; |
| } |
| } |
|
|
| Moses2::HypothesisColl &Stack::GetColl(const SCFG::Word &nt) |
| { |
| Moses2::HypothesisColl *ret; |
| Coll::iterator iter; |
| iter = m_coll.find(nt); |
| if (iter == m_coll.end()) { |
| ret = new Moses2::HypothesisColl(m_mgr); |
| m_coll[nt] = ret; |
| } else { |
| ret = iter->second; |
| } |
| return *ret; |
| } |
|
|
| const Hypothesis *Stack::GetBestHypo() const |
| { |
| SCORE bestScore = -std::numeric_limits<SCORE>::infinity(); |
| const HypothesisBase *bestHypo = NULL; |
| BOOST_FOREACH(const Coll::value_type &val, m_coll) { |
| const Moses2::HypothesisColl &hypos = *val.second; |
| const Moses2::HypothesisBase *hypo = hypos.GetBestHypo(); |
|
|
| if (hypo->GetFutureScore() > bestScore) { |
| bestScore = hypo->GetFutureScore(); |
| bestHypo = hypo; |
| } |
| } |
| return &bestHypo->Cast<SCFG::Hypothesis>(); |
| } |
|
|
| std::string Stack::Debug(const System &system) const |
| { |
| stringstream out; |
| BOOST_FOREACH (const SCFG::Stack::Coll::value_type &valPair, m_coll) { |
| const SCFG::Word &lhs = valPair.first; |
| const Moses2::HypothesisColl &hypos = *valPair.second; |
| out << "lhs=" << lhs.Debug(system); |
| out << "=" << hypos.GetSize() << endl; |
| out << hypos.Debug(system); |
| out << endl; |
| } |
|
|
| return out.str(); |
| } |
|
|
| } |
| } |
|
|