|
#pragma once |
|
|
|
#include <cassert> |
|
|
|
#include <queue> |
|
#include <vector> |
|
|
|
#include <boost/unordered_map.hpp> |
|
#include <boost/unordered_set.hpp> |
|
#include <boost/weak_ptr.hpp> |
|
|
|
#include "moses/ScoreComponentCollection.h" |
|
#include "moses/FF/InternalTree.h" |
|
|
|
#include "SHyperedge.h" |
|
#include "SVertex.h" |
|
|
|
namespace Moses |
|
{ |
|
namespace Syntax |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KBestExtractor |
|
{ |
|
public: |
|
struct KVertex; |
|
|
|
struct KHyperedge { |
|
KHyperedge(const SHyperedge &e) : shyperedge(e) {} |
|
|
|
const SHyperedge ­peredge; |
|
boost::shared_ptr<KVertex> head; |
|
std::vector<boost::shared_ptr<KVertex> > tail; |
|
}; |
|
|
|
struct Derivation { |
|
Derivation(const boost::shared_ptr<KHyperedge> &); |
|
Derivation(const Derivation &, std::size_t); |
|
|
|
boost::shared_ptr<KHyperedge> edge; |
|
std::vector<std::size_t> backPointers; |
|
std::vector<boost::shared_ptr<Derivation> > subderivations; |
|
ScoreComponentCollection scoreBreakdown; |
|
float score; |
|
}; |
|
|
|
struct DerivationOrderer { |
|
bool operator()(const boost::weak_ptr<Derivation> &d1, |
|
const boost::weak_ptr<Derivation> &d2) const { |
|
boost::shared_ptr<Derivation> s1(d1); |
|
boost::shared_ptr<Derivation> s2(d2); |
|
return s1->score < s2->score; |
|
} |
|
}; |
|
|
|
struct KVertex { |
|
typedef std::priority_queue<boost::weak_ptr<Derivation>, |
|
std::vector<boost::weak_ptr<Derivation> >, |
|
DerivationOrderer> DerivationQueue; |
|
|
|
KVertex(const SVertex &v) : svertex(v), visited(false) {} |
|
|
|
const SVertex &svertex; |
|
std::vector<boost::weak_ptr<Derivation> > kBestList; |
|
DerivationQueue candidates; |
|
bool visited; |
|
}; |
|
|
|
typedef std::vector<boost::shared_ptr<Derivation> > KBestVec; |
|
|
|
|
|
|
|
void Extract(const std::vector<boost::shared_ptr<SVertex> > &, std::size_t, |
|
KBestVec &); |
|
|
|
static Phrase GetOutputPhrase(const Derivation &); |
|
static TreePointer GetOutputTree(const Derivation &); |
|
|
|
private: |
|
typedef boost::unordered_map<const SVertex *, |
|
boost::shared_ptr<KVertex> > VertexMap; |
|
|
|
struct DerivationHasher { |
|
std::size_t operator()(const boost::shared_ptr<Derivation> &d) const { |
|
std::size_t seed = 0; |
|
boost::hash_combine(seed, &(d->edge->shyperedge)); |
|
boost::hash_combine(seed, d->backPointers); |
|
return seed; |
|
} |
|
}; |
|
|
|
struct DerivationEqualityPred { |
|
bool operator()(const boost::shared_ptr<Derivation> &d1, |
|
const boost::shared_ptr<Derivation> &d2) const { |
|
return &(d1->edge->shyperedge) == &(d2->edge->shyperedge) && |
|
d1->backPointers == d2->backPointers; |
|
} |
|
}; |
|
|
|
typedef boost::unordered_set<boost::shared_ptr<Derivation>, DerivationHasher, |
|
DerivationEqualityPred> DerivationSet; |
|
|
|
boost::shared_ptr<KVertex> FindOrCreateVertex(const SVertex &); |
|
void GetCandidates(boost::shared_ptr<KVertex>, std::size_t); |
|
void LazyKthBest(boost::shared_ptr<KVertex>, std::size_t, std::size_t); |
|
void LazyNext(KVertex &, const Derivation &, std::size_t); |
|
|
|
VertexMap m_vertexMap; |
|
DerivationSet m_derivations; |
|
}; |
|
|
|
} |
|
} |
|
|