|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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; |
|
} |
|
|
|
} |
|
} |
|
|
|
|