2010-07-18 03:23:09 +04:00
|
|
|
// $Id$
|
2010-04-12 14:15:49 +04:00
|
|
|
// vim:tabstop=2
|
|
|
|
/***********************************************************************
|
|
|
|
Moses - factored phrase-based language decoder
|
|
|
|
Copyright (C) 2010 Hieu Hoang
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2010-04-12 14:15:49 +04:00
|
|
|
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.
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2010-04-12 14:15:49 +04:00
|
|
|
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.
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2010-04-12 14:15:49 +04:00
|
|
|
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
|
|
|
|
***********************************************************************/
|
2010-04-08 21:16:10 +04:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
#include "RuleCubeItem.h"
|
|
|
|
|
|
|
|
#include <boost/functional/hash.hpp>
|
|
|
|
#include <boost/unordered_set.hpp>
|
|
|
|
#include <boost/version.hpp>
|
|
|
|
|
2011-11-18 16:07:41 +04:00
|
|
|
#include "util/check.hh"
|
2010-04-08 21:16:10 +04:00
|
|
|
#include <queue>
|
|
|
|
#include <set>
|
2011-06-27 19:13:15 +04:00
|
|
|
#include <vector>
|
2010-04-08 21:16:10 +04:00
|
|
|
|
|
|
|
namespace Moses
|
|
|
|
{
|
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
class ChartCellCollection;
|
|
|
|
class ChartManager;
|
2012-09-25 20:34:43 +04:00
|
|
|
class ChartTranslationOptions;
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2012-06-29 02:29:46 +04:00
|
|
|
/** Define an ordering between RuleCubeItems based on their scores.
|
|
|
|
* This is used to order items in the cube's priority queue.
|
|
|
|
*/
|
2011-06-27 19:13:15 +04:00
|
|
|
class RuleCubeItemScoreOrderer
|
2010-04-08 21:16:10 +04:00
|
|
|
{
|
2013-05-29 21:16:15 +04:00
|
|
|
public:
|
2011-06-27 19:13:15 +04:00
|
|
|
bool operator()(const RuleCubeItem *p, const RuleCubeItem *q) const {
|
|
|
|
return p->GetScore() < q->GetScore();
|
2011-02-24 15:36:50 +03:00
|
|
|
}
|
2011-06-27 19:13:15 +04:00
|
|
|
};
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2012-06-29 02:29:46 +04:00
|
|
|
/** Define an ordering between RuleCubeItems based on their positions in the
|
|
|
|
* cube. This is used to record which positions in the cube have been covered
|
|
|
|
* during search.
|
|
|
|
*/
|
2011-06-27 19:13:15 +04:00
|
|
|
class RuleCubeItemPositionOrderer
|
|
|
|
{
|
2013-05-29 21:16:15 +04:00
|
|
|
public:
|
2011-06-27 19:13:15 +04:00
|
|
|
bool operator()(const RuleCubeItem *p, const RuleCubeItem *q) const {
|
|
|
|
return *p < *q;
|
2011-02-24 15:36:50 +03:00
|
|
|
}
|
2011-06-27 19:13:15 +04:00
|
|
|
};
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2012-06-29 02:29:46 +04:00
|
|
|
/** @todo what is this?
|
|
|
|
*/
|
2011-06-27 19:13:15 +04:00
|
|
|
class RuleCubeItemHasher
|
|
|
|
{
|
2013-05-29 21:16:15 +04:00
|
|
|
public:
|
2011-06-27 19:13:15 +04:00
|
|
|
size_t operator()(const RuleCubeItem *p) const {
|
|
|
|
size_t seed = 0;
|
|
|
|
boost::hash_combine(seed, p->GetHypothesisDimensions());
|
2013-08-13 13:33:04 +04:00
|
|
|
boost::hash_combine(seed, p->GetTranslationDimension().GetTranslationOption());
|
2011-06-27 19:13:15 +04:00
|
|
|
return seed;
|
2011-02-24 15:36:50 +03:00
|
|
|
}
|
2011-06-27 19:13:15 +04:00
|
|
|
};
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2012-06-29 02:29:46 +04:00
|
|
|
/** @todo what is this?
|
|
|
|
*/
|
2011-06-27 19:13:15 +04:00
|
|
|
class RuleCubeItemEqualityPred
|
|
|
|
{
|
2013-05-29 21:16:15 +04:00
|
|
|
public:
|
2011-06-27 19:13:15 +04:00
|
|
|
bool operator()(const RuleCubeItem *p, const RuleCubeItem *q) const {
|
|
|
|
return p->GetHypothesisDimensions() == q->GetHypothesisDimensions() &&
|
|
|
|
p->GetTranslationDimension() == q->GetTranslationDimension();
|
2011-02-24 15:36:50 +03:00
|
|
|
}
|
2010-04-08 21:16:10 +04:00
|
|
|
};
|
|
|
|
|
2012-06-29 02:29:46 +04:00
|
|
|
/** @todo what is this?
|
|
|
|
*/
|
2011-03-11 19:28:36 +03:00
|
|
|
class RuleCube
|
2010-04-08 21:16:10 +04:00
|
|
|
{
|
2013-05-29 21:16:15 +04:00
|
|
|
public:
|
2012-09-25 20:34:43 +04:00
|
|
|
RuleCube(const ChartTranslationOptions &, const ChartCellCollection &,
|
2011-06-27 19:13:15 +04:00
|
|
|
ChartManager &);
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
~RuleCube();
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
float GetTopScore() const {
|
2011-11-18 16:07:41 +04:00
|
|
|
CHECK(!m_queue.empty());
|
2011-06-27 19:13:15 +04:00
|
|
|
RuleCubeItem *item = m_queue.top();
|
|
|
|
return item->GetScore();
|
|
|
|
}
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
RuleCubeItem *Pop(ChartManager &);
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2013-05-29 21:16:15 +04:00
|
|
|
bool IsEmpty() const {
|
|
|
|
return m_queue.empty();
|
|
|
|
}
|
2011-02-24 15:36:50 +03:00
|
|
|
|
2012-09-25 20:34:43 +04:00
|
|
|
const ChartTranslationOptions &GetTranslationOption() const {
|
2011-02-24 15:36:50 +03:00
|
|
|
return m_transOpt;
|
|
|
|
}
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2013-05-29 21:16:15 +04:00
|
|
|
private:
|
2011-06-27 19:13:15 +04:00
|
|
|
#if defined(BOOST_VERSION) && (BOOST_VERSION >= 104200)
|
|
|
|
typedef boost::unordered_set<RuleCubeItem*,
|
2013-05-29 21:16:15 +04:00
|
|
|
RuleCubeItemHasher,
|
|
|
|
RuleCubeItemEqualityPred
|
|
|
|
> ItemSet;
|
2011-06-27 19:13:15 +04:00
|
|
|
#else
|
|
|
|
typedef std::set<RuleCubeItem*, RuleCubeItemPositionOrderer> ItemSet;
|
|
|
|
#endif
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
typedef std::priority_queue<RuleCubeItem*,
|
2013-05-29 21:16:15 +04:00
|
|
|
std::vector<RuleCubeItem*>,
|
|
|
|
RuleCubeItemScoreOrderer
|
|
|
|
> Queue;
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
RuleCube(const RuleCube &); // Not implemented
|
|
|
|
RuleCube &operator=(const RuleCube &); // Not implemented
|
2010-04-08 21:16:10 +04:00
|
|
|
|
2011-06-27 19:13:15 +04:00
|
|
|
void CreateNeighbors(const RuleCubeItem &, ChartManager &);
|
|
|
|
void CreateNeighbor(const RuleCubeItem &, int, ChartManager &);
|
|
|
|
|
2012-09-25 20:34:43 +04:00
|
|
|
const ChartTranslationOptions &m_transOpt;
|
2011-06-27 19:13:15 +04:00
|
|
|
ItemSet m_covered;
|
|
|
|
Queue m_queue;
|
|
|
|
};
|
2010-10-01 01:10:25 +04:00
|
|
|
|
2010-04-08 21:16:10 +04:00
|
|
|
}
|