add HypothesisColl

This commit is contained in:
Hieu Hoang 2016-02-29 13:10:55 +00:00
parent acf5a1cebd
commit 71b8ca7b1e
2 changed files with 166 additions and 0 deletions

View File

@ -0,0 +1,115 @@
/*
* HypothesisColl.cpp
*
* Created on: 26 Feb 2016
* Author: hieu
*/
#include <algorithm>
#include <boost/foreach.hpp>
#include "HypothesisColl.h"
#include "ManagerBase.h"
#include "System.h"
namespace Moses2 {
HypothesisColl::HypothesisColl(const ManagerBase &mgr)
:m_coll(MemPoolAllocator<const HypothesisBase*>(mgr.GetPool()))
,m_sortedHypos(NULL)
{}
StackAdd HypothesisColl::Add(const HypothesisBase *hypo)
{
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 {
const HypothesisBase *hypoExisting = *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, const_cast<HypothesisBase*>(hypoExisting));
}
else {
// already storing the best hypo. discard incoming hypo
return StackAdd(false, const_cast<HypothesisBase*>(hypo));
}
}
assert(false);
}
Hypotheses &HypothesisColl::GetSortedAndPruneHypos(const ManagerBase &mgr) const
{
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);
}
return *m_sortedHypos;
}
void HypothesisColl::SortAndPruneHypos(const ManagerBase &mgr) const
{
size_t stackSize = mgr.system.stackSize;
Recycler<HypothesisBase*> &recycler = mgr.GetHypoRecycle();
/*
cerr << "UNSORTED hypos:" << endl;
for (size_t i = 0; i < hypos.size(); ++i) {
const Hypothesis *hypo = hypos[i];
cerr << *hypo << endl;
}
cerr << endl;
*/
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);
}
m_sortedHypos->resize(stackSize);
}
/*
cerr << "sorted hypos:" << endl;
for (size_t i = 0; i < hypos.size(); ++i) {
const Hypothesis *hypo = hypos[i];
cerr << hypo << " " << *hypo << endl;
}
cerr << endl;
*/
}
void HypothesisColl::Clear()
{
m_sortedHypos = NULL;
m_coll.clear();
}
} /* namespace Moses2 */

View File

@ -0,0 +1,51 @@
/*
* HypothesisColl.h
*
* Created on: 26 Feb 2016
* Author: hieu
*/
#pragma once
#include <boost/unordered_set.hpp>
#include "HypothesisBase.h"
#include "MemPool.h"
#include "legacy/Util2.h"
namespace Moses2 {
class ManagerBase;
typedef Array<const HypothesisBase*> Hypotheses;
class HypothesisColl
{
public:
typedef boost::unordered_set<const HypothesisBase*,
UnorderedComparer<HypothesisBase>,
UnorderedComparer<HypothesisBase>,
MemPoolAllocator<const HypothesisBase*>
> _HCType;
HypothesisColl(const ManagerBase &mgr);
StackAdd Add(const HypothesisBase *hypo);
_HCType &GetColl()
{ return m_coll; }
const _HCType &GetColl() const
{ return m_coll; }
void Clear();
Hypotheses &GetSortedAndPruneHypos(const ManagerBase &mgr) const;
protected:
_HCType m_coll;
mutable Hypotheses *m_sortedHypos;
void SortAndPruneHypos(const ManagerBase &mgr) const;
};
} /* namespace Moses2 */