00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "ChartCell.h"
00023 #include "ChartCellCollection.h"
00024 #include "ChartTranslationOptions.h"
00025 #include "RuleCube.h"
00026 #include "RuleCubeQueue.h"
00027 #include "StaticData.h"
00028 #include "Util.h"
00029 #include "Range.h"
00030 #include <boost/functional/hash.hpp>
00031
00032 using namespace std;
00033
00034 namespace Moses
00035 {
00036
00037
00038 RuleCube::RuleCube(const ChartTranslationOptions &transOpt,
00039 const ChartCellCollection &allChartCells,
00040 ChartManager &manager)
00041 : m_transOpt(transOpt)
00042 {
00043 RuleCubeItem *item = new RuleCubeItem(transOpt, allChartCells);
00044 m_covered.insert(item);
00045 if (StaticData::Instance().options()->cube.lazy_scoring) {
00046 item->EstimateScore();
00047 } else {
00048 item->CreateHypothesis(transOpt, manager);
00049 }
00050 m_queue.push(item);
00051 }
00052
00053 RuleCube::~RuleCube()
00054 {
00055 RemoveAllInColl(m_covered);
00056 }
00057
00058 RuleCubeItem *RuleCube::Pop(ChartManager &manager)
00059 {
00060 RuleCubeItem *item = m_queue.top();
00061 m_queue.pop();
00062 CreateNeighbors(*item, manager);
00063 return item;
00064 }
00065
00066
00067 void RuleCube::CreateNeighbors(const RuleCubeItem &item, ChartManager &manager)
00068 {
00069
00070 const TranslationDimension &translationDimension =
00071 item.GetTranslationDimension();
00072 if (translationDimension.HasMoreTranslations()) {
00073 CreateNeighbor(item, -1, manager);
00074 }
00075
00076
00077 for (size_t i = 0; i < item.GetHypothesisDimensions().size(); ++i) {
00078 const HypothesisDimension &dimension = item.GetHypothesisDimensions()[i];
00079 if (dimension.HasMoreHypo()) {
00080 CreateNeighbor(item, i, manager);
00081 }
00082 }
00083 }
00084
00085 void RuleCube::CreateNeighbor(const RuleCubeItem &item, int dimensionIndex,
00086 ChartManager &manager)
00087 {
00088 RuleCubeItem *newItem = new RuleCubeItem(item, dimensionIndex);
00089 std::pair<ItemSet::iterator, bool> result = m_covered.insert(newItem);
00090 if (!result.second) {
00091 delete newItem;
00092 } else {
00093 if (StaticData::Instance().options()->cube.lazy_scoring) {
00094 newItem->EstimateScore();
00095 } else {
00096 newItem->CreateHypothesis(m_transOpt, manager);
00097 }
00098 m_queue.push(newItem);
00099 }
00100 }
00101
00102 std::ostream& operator<<(std::ostream &out, const RuleCube &obj)
00103 {
00104 out << obj.GetItemSetSize();
00105 return out;
00106 }
00107 }