| |
| |
| |
| |
| |
| |
|
|
| #include <boost/foreach.hpp> |
| #include "NBests.h" |
| #include "../Manager.h" |
| #include "../../System.h" |
|
|
| using namespace std; |
|
|
| namespace Moses2 |
| { |
| namespace SCFG |
| { |
| NBests::NBests(const SCFG::Manager &mgr, |
| const ArcList &arcList, |
| NBestColl &nbestColl) |
| :indIter(0) |
| { |
| |
| NBest *contender = new NBest(mgr, arcList, 0, nbestColl); |
| contenders.push(contender); |
| bool extended = Extend(mgr, nbestColl, 0); |
| assert(extended); |
| } |
|
|
| NBests::~NBests() |
| { |
| BOOST_FOREACH(const NBest *nbest, m_coll) { |
| delete nbest; |
| } |
|
|
| |
| while (!contenders.empty()) { |
| NBest *contender = contenders.top(); |
| contenders.pop(); |
| delete contender; |
| } |
| } |
|
|
| bool NBests::Extend(const SCFG::Manager &mgr, |
| NBestColl &nbestColl, |
| size_t ind) |
| { |
| if (ind < m_coll.size()) { |
| |
| return true; |
| } |
|
|
| assert(ind == m_coll.size()); |
|
|
| |
| if (ind >= mgr.system.options.nbest.nbest_size) { |
| return false; |
| } |
|
|
| size_t maxIter = mgr.system.options.nbest.nbest_size * mgr.system.options.nbest.factor; |
|
|
| |
| |
| bool ok = false; |
| while (!ok) { |
| ++indIter; |
| if (indIter > maxIter) { |
| return false; |
| } |
|
|
| if (contenders.empty()) { |
| return false; |
| } |
|
|
| NBest *contender = contenders.top(); |
| contenders.pop(); |
|
|
| contender->CreateDeviants(mgr, nbestColl, contenders); |
|
|
| if (mgr.system.options.nbest.only_distinct) { |
| const string &tgtPhrase = contender->GetString(); |
| |
| boost::hash<std::string> string_hash; |
| size_t hash = string_hash(tgtPhrase); |
|
|
| if (distinctHypos.insert(hash).second) { |
| ok = true; |
| } |
| } else { |
| ok = true; |
| } |
|
|
| if (ok) { |
| Add(contender); |
| |
| |
| return true; |
| } else { |
| delete contender; |
| } |
| } |
|
|
| return false; |
| } |
|
|
| } |
| } |
|
|
|
|