00001 #ifndef SEARCH_EDGE_GENERATOR__
00002 #define SEARCH_EDGE_GENERATOR__
00003
00004 #include "search/edge.hh"
00005 #include "search/types.hh"
00006
00007 #include <queue>
00008
00009 namespace lm {
00010 namespace ngram {
00011 struct ChartState;
00012 }
00013 }
00014
00015 namespace search {
00016
00017 template <class Model> class Context;
00018
00019 class EdgeGenerator {
00020 public:
00021 EdgeGenerator() {}
00022
00023 PartialEdge AllocateEdge(Arity arity) {
00024 return PartialEdge(partial_edge_pool_, arity);
00025 }
00026
00027 void AddEdge(PartialEdge edge) {
00028 generate_.push(edge);
00029 }
00030
00031 bool Empty() const { return generate_.empty(); }
00032
00033
00034 template <class Model> PartialEdge Pop(Context<Model> &context);
00035
00036 template <class Model, class Output> void Search(Context<Model> &context, Output &output) {
00037 unsigned to_pop = context.PopLimit();
00038 while (to_pop > 0 && !generate_.empty()) {
00039 PartialEdge got(Pop(context));
00040 if (got.Valid()) {
00041 output.NewHypothesis(got);
00042 --to_pop;
00043 }
00044 }
00045 output.FinishedSearch();
00046 }
00047
00048 private:
00049 util::Pool partial_edge_pool_;
00050
00051 typedef std::priority_queue<PartialEdge> Generate;
00052 Generate generate_;
00053 };
00054
00055 }
00056 #endif // SEARCH_EDGE_GENERATOR__