diff --git a/contrib/other-builds/moses2/HypothesisColl.cpp b/contrib/other-builds/moses2/HypothesisColl.cpp new file mode 100644 index 000000000..51179382d --- /dev/null +++ b/contrib/other-builds/moses2/HypothesisColl.cpp @@ -0,0 +1,115 @@ +/* + * HypothesisColl.cpp + * + * Created on: 26 Feb 2016 + * Author: hieu + */ +#include +#include +#include "HypothesisColl.h" +#include "ManagerBase.h" +#include "System.h" + +namespace Moses2 { + +HypothesisColl::HypothesisColl(const ManagerBase &mgr) +:m_coll(MemPoolAllocator(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(hypoExisting1); + hypoExisting2 = hypo; + + return StackAdd(true, const_cast(hypoExisting)); + } + else { + // already storing the best hypo. discard incoming hypo + return StackAdd(false, const_cast(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(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 &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((*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 */ diff --git a/contrib/other-builds/moses2/HypothesisColl.h b/contrib/other-builds/moses2/HypothesisColl.h new file mode 100644 index 000000000..21afdf963 --- /dev/null +++ b/contrib/other-builds/moses2/HypothesisColl.h @@ -0,0 +1,51 @@ +/* + * HypothesisColl.h + * + * Created on: 26 Feb 2016 + * Author: hieu + */ +#pragma once +#include +#include "HypothesisBase.h" +#include "MemPool.h" +#include "legacy/Util2.h" + +namespace Moses2 { + +class ManagerBase; + +typedef Array Hypotheses; + +class HypothesisColl +{ +public: + typedef boost::unordered_set, + UnorderedComparer, + MemPoolAllocator + > _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 */ +