2016-02-29 16:10:55 +03:00
|
|
|
/*
|
|
|
|
* HypothesisColl.cpp
|
|
|
|
*
|
|
|
|
* Created on: 26 Feb 2016
|
|
|
|
* Author: hieu
|
|
|
|
*/
|
2016-06-03 21:57:51 +03:00
|
|
|
#include <iostream>
|
2016-06-20 16:59:31 +03:00
|
|
|
#include <sstream>
|
2016-02-29 16:10:55 +03:00
|
|
|
#include <algorithm>
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
#include "HypothesisColl.h"
|
|
|
|
#include "ManagerBase.h"
|
|
|
|
#include "System.h"
|
|
|
|
|
2016-06-20 16:59:31 +03:00
|
|
|
using namespace std;
|
|
|
|
|
2016-03-31 23:00:16 +03:00
|
|
|
namespace Moses2
|
|
|
|
{
|
2016-02-29 16:10:55 +03:00
|
|
|
|
2016-03-31 23:00:16 +03:00
|
|
|
HypothesisColl::HypothesisColl(const ManagerBase &mgr) :
|
2016-08-05 13:02:52 +03:00
|
|
|
m_coll(MemPoolAllocator<const HypothesisBase*>(mgr.GetPool())), m_sortedHypos(
|
|
|
|
NULL)
|
2016-03-31 23:00:16 +03:00
|
|
|
{
|
|
|
|
}
|
2016-02-29 16:10:55 +03:00
|
|
|
|
2016-08-05 13:35:42 +03:00
|
|
|
const HypothesisBase *HypothesisColl::GetBestHypo() const
|
|
|
|
{
|
|
|
|
if (GetSize() == 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (m_sortedHypos) {
|
|
|
|
return (*m_sortedHypos)[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
SCORE bestScore = -std::numeric_limits<SCORE>::infinity();
|
|
|
|
const HypothesisBase *bestHypo;
|
|
|
|
BOOST_FOREACH(const HypothesisBase *hypo, m_coll) {
|
|
|
|
if (hypo->GetFutureScore() > bestScore) {
|
|
|
|
bestScore = hypo->GetFutureScore();
|
|
|
|
bestHypo = hypo;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return bestHypo;
|
|
|
|
}
|
|
|
|
|
2016-08-05 00:41:29 +03:00
|
|
|
void HypothesisColl::Add(
|
2016-08-05 13:02:52 +03:00
|
|
|
const System &system,
|
|
|
|
HypothesisBase *hypo,
|
|
|
|
Recycler<HypothesisBase*> &hypoRecycle,
|
|
|
|
ArcLists &arcLists)
|
2016-08-05 00:41:29 +03:00
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
StackAdd added = Add(hypo);
|
|
|
|
|
|
|
|
size_t nbestSize = system.options.nbest.nbest_size;
|
|
|
|
if (nbestSize) {
|
|
|
|
arcLists.AddArc(added.added, hypo, added.other);
|
2016-08-05 00:41:29 +03:00
|
|
|
}
|
2016-08-05 13:02:52 +03:00
|
|
|
else {
|
|
|
|
if (!added.added) {
|
|
|
|
hypoRecycle.Recycle(hypo);
|
|
|
|
}
|
|
|
|
else if (added.other) {
|
|
|
|
hypoRecycle.Recycle(added.other);
|
|
|
|
}
|
2016-08-05 00:41:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-02-29 16:10:55 +03:00
|
|
|
StackAdd HypothesisColl::Add(const HypothesisBase *hypo)
|
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
std::pair<_HCType::iterator, bool> addRet = m_coll.insert(hypo);
|
|
|
|
|
|
|
|
// CHECK RECOMBINATION
|
|
|
|
if (addRet.second) {
|
|
|
|
// equiv hypo doesn't exists
|
|
|
|
return StackAdd(true, NULL);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
HypothesisBase *hypoExisting = const_cast<HypothesisBase*>(*addRet.first);
|
|
|
|
if (hypo->GetFutureScore() > hypoExisting->GetFutureScore()) {
|
|
|
|
// incoming hypo is better than the one we have
|
|
|
|
const HypothesisBase * const &hypoExisting1 = *addRet.first;
|
|
|
|
const HypothesisBase *&hypoExisting2 =
|
|
|
|
const_cast<const HypothesisBase *&>(hypoExisting1);
|
|
|
|
hypoExisting2 = hypo;
|
|
|
|
|
|
|
|
return StackAdd(true, hypoExisting);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// already storing the best hypo. discard incoming hypo
|
|
|
|
return StackAdd(false, hypoExisting);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
assert(false);
|
2016-02-29 16:10:55 +03:00
|
|
|
}
|
|
|
|
|
2016-06-23 14:54:43 +03:00
|
|
|
const Hypotheses &HypothesisColl::GetSortedAndPruneHypos(
|
2016-08-05 13:02:52 +03:00
|
|
|
const ManagerBase &mgr,
|
|
|
|
ArcLists &arcLists) const
|
2016-02-29 16:10:55 +03:00
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
if (m_sortedHypos == NULL) {
|
|
|
|
// create sortedHypos first
|
|
|
|
MemPool &pool = mgr.GetPool();
|
|
|
|
m_sortedHypos = new (pool.Allocate<Hypotheses>()) Hypotheses(pool,
|
|
|
|
m_coll.size());
|
|
|
|
|
|
|
|
size_t ind = 0;
|
|
|
|
BOOST_FOREACH(const HypothesisBase *hypo, m_coll){
|
|
|
|
(*m_sortedHypos)[ind] = hypo;
|
|
|
|
++ind;
|
|
|
|
}
|
|
|
|
|
|
|
|
SortAndPruneHypos(mgr, arcLists);
|
|
|
|
}
|
|
|
|
|
|
|
|
return *m_sortedHypos;
|
2016-02-29 16:10:55 +03:00
|
|
|
}
|
|
|
|
|
2016-03-31 23:00:16 +03:00
|
|
|
void HypothesisColl::SortAndPruneHypos(const ManagerBase &mgr,
|
2016-08-05 13:02:52 +03:00
|
|
|
ArcLists &arcLists) const
|
2016-02-29 16:10:55 +03:00
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
size_t stackSize = mgr.system.options.search.stack_size;
|
|
|
|
Recycler<HypothesisBase*> &recycler = mgr.GetHypoRecycle();
|
|
|
|
|
|
|
|
/*
|
|
|
|
cerr << "UNSORTED hypos: ";
|
|
|
|
BOOST_FOREACH(const HypothesisBase *hypo, m_coll) {
|
|
|
|
cerr << hypo << "(" << hypo->GetFutureScore() << ")" << " ";
|
2016-03-31 23:00:16 +03:00
|
|
|
}
|
|
|
|
cerr << endl;
|
2016-08-05 13:02:52 +03:00
|
|
|
*/
|
|
|
|
Hypotheses::iterator iterMiddle;
|
|
|
|
iterMiddle =
|
|
|
|
(stackSize == 0 || m_sortedHypos->size() < stackSize) ?
|
|
|
|
m_sortedHypos->end() : m_sortedHypos->begin() + stackSize;
|
|
|
|
|
|
|
|
std::partial_sort(m_sortedHypos->begin(), iterMiddle, m_sortedHypos->end(),
|
|
|
|
HypothesisFutureScoreOrderer());
|
|
|
|
|
|
|
|
// prune
|
|
|
|
if (stackSize && m_sortedHypos->size() > stackSize) {
|
|
|
|
for (size_t i = stackSize; i < m_sortedHypos->size(); ++i) {
|
|
|
|
HypothesisBase *hypo = const_cast<HypothesisBase*>((*m_sortedHypos)[i]);
|
|
|
|
recycler.Recycle(hypo);
|
|
|
|
|
|
|
|
// delete from arclist
|
|
|
|
if (mgr.system.options.nbest.nbest_size) {
|
|
|
|
arcLists.Delete(hypo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_sortedHypos->resize(stackSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
cerr << "sorted hypos: ";
|
|
|
|
for (size_t i = 0; i < m_sortedHypos->size(); ++i) {
|
|
|
|
const HypothesisBase *hypo = (*m_sortedHypos)[i];
|
|
|
|
cerr << hypo << " ";
|
2016-03-31 23:00:16 +03:00
|
|
|
}
|
|
|
|
cerr << endl;
|
2016-08-05 13:02:52 +03:00
|
|
|
*/
|
2016-02-29 16:10:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void HypothesisColl::Clear()
|
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
m_sortedHypos = NULL;
|
|
|
|
m_coll.clear();
|
2016-02-29 16:10:55 +03:00
|
|
|
}
|
|
|
|
|
2016-06-20 16:59:31 +03:00
|
|
|
std::string HypothesisColl::Debug(const System &system) const
|
2016-06-03 21:57:51 +03:00
|
|
|
{
|
2016-08-05 13:02:52 +03:00
|
|
|
stringstream out;
|
|
|
|
BOOST_FOREACH (const HypothesisBase *hypo, m_coll) {
|
|
|
|
out << hypo->Debug(system);
|
|
|
|
out << std::endl << std::endl;
|
|
|
|
}
|
2016-06-18 01:06:02 +03:00
|
|
|
|
2016-08-05 13:02:52 +03:00
|
|
|
return out.str();
|
2016-06-03 21:57:51 +03:00
|
|
|
}
|
|
|
|
|
2016-02-29 16:10:55 +03:00
|
|
|
} /* namespace Moses2 */
|