00001 #pragma once
00002
00003 #include <queue>
00004 #include <vector>
00005 #include <utility>
00006
00007 #include <boost/unordered_set.hpp>
00008
00009 #include "SHyperedge.h"
00010 #include "SHyperedgeBundle.h"
00011
00012 namespace Moses
00013 {
00014 namespace Syntax
00015 {
00016
00017
00018
00019
00020 class Cube
00021 {
00022 public:
00023 Cube(const SHyperedgeBundle &);
00024 ~Cube();
00025
00026 SHyperedge *Pop();
00027
00028 SHyperedge *Top() const {
00029 return m_queue.top().first;
00030 }
00031
00032 bool IsEmpty() const {
00033 return m_queue.empty();
00034 }
00035
00036 private:
00037 typedef boost::unordered_set<std::vector<int> > CoordinateSet;
00038
00039 typedef std::pair<SHyperedge *, const std::vector<int> *> QueueItem;
00040
00041 class QueueItemOrderer
00042 {
00043 public:
00044 bool operator()(const QueueItem &p, const QueueItem &q) const {
00045 return p.first->label.futureScore < q.first->label.futureScore;
00046 }
00047 };
00048
00049 typedef std::priority_queue<QueueItem, std::vector<QueueItem>,
00050 QueueItemOrderer> Queue;
00051
00052 SHyperedge *CreateHyperedge(const std::vector<int> &);
00053 void CreateNeighbour(const std::vector<int> &);
00054 void CreateNeighbours(const std::vector<int> &);
00055
00056 const SHyperedgeBundle &m_bundle;
00057 CoordinateSet m_visited;
00058 Queue m_queue;
00059 };
00060
00061 }
00062 }