// $Id$ // vim:tabstop=2 /*********************************************************************** Moses - factored phrase-based language decoder Copyright (C) 2010 Hieu Hoang This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ***********************************************************************/ #pragma once #include #include "ChartHypothesis.h" #include "RuleCube.h" namespace Moses { class ChartSearchGraphWriter; class AllOptions; //! functor to compare (chart) hypotheses by (descending) score class ChartHypothesisScoreOrderer { public: bool operator()(const ChartHypothesis* hypoA, const ChartHypothesis* hypoB) const { return hypoA->GetFutureScore() > hypoB->GetFutureScore(); } }; /** Contains a set of unique hypos that have the same HS non-term. * ie. 1 of these for each target LHS in each cell */ class ChartHypothesisCollection { friend std::ostream& operator<<(std::ostream&, const ChartHypothesisCollection&); protected: //typedef std::set HCType; typedef boost::unordered_set< ChartHypothesis*, UnorderedComparer, UnorderedComparer > HCType; HCType m_hypos; HypoList m_hyposOrdered; float m_bestScore; /**< score of the best hypothesis in collection */ float m_beamWidth; /**< minimum score due to threashold pruning */ size_t m_maxHypoStackSize; /**< maximum number of hypothesis allowed in this stack */ bool m_nBestIsEnabled; /**< flag to determine whether to keep track of old arcs */ std::pair Add(ChartHypothesis *hypo, ChartManager &manager); public: typedef HCType::iterator iterator; typedef HCType::const_iterator const_iterator; //! iterators const_iterator begin() const { return m_hypos.begin(); } const_iterator end() const { return m_hypos.end(); } ChartHypothesisCollection(AllOptions const& opts); ~ChartHypothesisCollection(); bool AddHypothesis(ChartHypothesis *hypo, ChartManager &manager); void Detach(const HCType::iterator &iter); void Remove(const HCType::iterator &iter); void PruneToSize(ChartManager &manager); size_t GetSize() const { return m_hypos.size(); } size_t GetHypo() const { return m_hypos.size(); } void SortHypotheses(); void CleanupArcList(); //! return vector of hypothesis that has been sorted by score const HypoList &GetSortedHypotheses() const { return m_hyposOrdered; } //! return the best total score of all hypos in this collection float GetBestScore() const { return m_bestScore; } void WriteSearchGraph(const ChartSearchGraphWriter& writer, const std::map &reachable) const; }; } // namespace