00001 #include <iostream>
00002
00003 #define BOOST_TEST_MODULE MertForestRescore
00004 #include <boost/test/unit_test.hpp>
00005
00006 #include "Hypergraph.h"
00007
00008 using namespace std;
00009 using namespace MosesTuning;
00010
00011 BOOST_AUTO_TEST_CASE(prune)
00012 {
00013 Vocab vocab;
00014 WordVec words;
00015 string wordStrings[] =
00016 {"<s>", "</s>", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"};
00017 for (size_t i = 0; i < 13; ++i) {
00018 words.push_back(&(vocab.FindOrAdd((wordStrings[i]))));
00019 }
00020
00021 const string f1 = "foo";
00022 const string f2 = "bar";
00023 Graph graph(vocab);
00024 graph.SetCounts(5,8);
00025
00026 Edge* e0 = graph.NewEdge();
00027 e0->AddWord(words[0]);
00028
00029 Vertex* v0 = graph.NewVertex();
00030 v0->AddEdge(e0);
00031
00032 Edge* e1 = graph.NewEdge();
00033 e1->AddWord(NULL);
00034 e1->AddChild(0);
00035 e1->AddWord(words[2]);
00036 e1->AddWord(words[3]);
00037 e1->AddFeature(f1,1);
00038 e1->AddFeature(f2,1);
00039 Edge* e5 = graph.NewEdge();
00040 e5->AddWord(NULL);
00041 e5->AddChild(0);
00042 e5->AddWord(words[9]);
00043 e5->AddWord(words[10]);
00044 e5->AddFeature(f1,2);
00045 e5->AddFeature(f2,-2);
00046
00047 Vertex* v1 = graph.NewVertex();
00048 v1->AddEdge(e1);
00049 v1->AddEdge(e5);
00050 v1->SetSourceCovered(1);
00051
00052 Edge* e2 = graph.NewEdge();
00053 e2->AddWord(NULL);
00054 e2->AddChild(1);
00055 e2->AddWord(words[4]);
00056 e2->AddWord(words[5]);
00057 e2->AddFeature(f2,3);
00058
00059 Vertex* v2 = graph.NewVertex();
00060 v2->AddEdge(e2);
00061 v2->SetSourceCovered(3);
00062
00063 Edge* e3 = graph.NewEdge();
00064 e3->AddWord(NULL);
00065 e3->AddChild(2);
00066 e3->AddWord(words[6]);
00067 e3->AddWord(words[7]);
00068 e3->AddWord(words[8]);
00069 e3->AddFeature(f1,1);
00070 Edge* e6 = graph.NewEdge();
00071 e6->AddWord(NULL);
00072 e6->AddChild(2);
00073 e6->AddWord(words[9]);
00074 e6->AddWord(words[12]);
00075 e6->AddFeature(f2,1);
00076 Edge* e7 = graph.NewEdge();
00077 e7->AddWord(NULL);
00078 e7->AddChild(1);
00079 e7->AddWord(words[11]);
00080 e7->AddWord(words[12]);
00081 e7->AddFeature(f1,2);
00082 e7->AddFeature(f2,3);
00083
00084 Vertex* v3 = graph.NewVertex();
00085 v3->AddEdge(e3);
00086 v3->AddEdge(e6);
00087 v3->AddEdge(e7);
00088 v3->SetSourceCovered(5);
00089
00090 Edge* e4 = graph.NewEdge();
00091 e4->AddWord(NULL);
00092 e4->AddChild(3);
00093 e4->AddWord(words[1]);
00094
00095 Vertex* v4 = graph.NewVertex();
00096 v4->AddEdge(e4);
00097 v4->SetSourceCovered(6);
00098
00099 SparseVector weights;
00100 weights.set(f1,2);
00101 weights.set(f2,1);
00102
00103 Graph pruned(vocab);
00104 graph.Prune(&pruned, weights, 5);
00105
00106 BOOST_CHECK_EQUAL(5, pruned.EdgeSize());
00107 BOOST_CHECK_EQUAL(4, pruned.VertexSize());
00108
00109
00110 BOOST_CHECK_EQUAL(1, pruned.GetVertex(0).GetIncoming().size());
00111 BOOST_CHECK_EQUAL(2, pruned.GetVertex(1).GetIncoming().size());
00112 BOOST_CHECK_EQUAL(1, pruned.GetVertex(2).GetIncoming().size());
00113 BOOST_CHECK_EQUAL(1, pruned.GetVertex(3).GetIncoming().size());
00114
00115 const Edge* edge;
00116
00117 edge = pruned.GetVertex(0).GetIncoming()[0];
00118 BOOST_CHECK_EQUAL(1, edge->Words().size());
00119 BOOST_CHECK_EQUAL(words[0], edge->Words()[0]);
00120
00121 edge = pruned.GetVertex(1).GetIncoming()[0];
00122 BOOST_CHECK_EQUAL(3, edge->Words().size());
00123 BOOST_CHECK_EQUAL((Vocab::Entry*)NULL, edge->Words()[0]);
00124 BOOST_CHECK_EQUAL(words[2]->first, edge->Words()[1]->first);
00125 BOOST_CHECK_EQUAL(words[3]->first, edge->Words()[2]->first);
00126
00127 edge = pruned.GetVertex(1).GetIncoming()[1];
00128 BOOST_CHECK_EQUAL(3, edge->Words().size());
00129 BOOST_CHECK_EQUAL((Vocab::Entry*)NULL, edge->Words()[0]);
00130 BOOST_CHECK_EQUAL(words[9]->first, edge->Words()[1]->first);
00131 BOOST_CHECK_EQUAL(words[10]->first, edge->Words()[2]->first);
00132
00133 edge = pruned.GetVertex(2).GetIncoming()[0];
00134 BOOST_CHECK_EQUAL(3, edge->Words().size());
00135 BOOST_CHECK_EQUAL((Vocab::Entry*)NULL, edge->Words()[0]);
00136 BOOST_CHECK_EQUAL(words[11]->first, edge->Words()[1]->first);
00137 BOOST_CHECK_EQUAL(words[12]->first, edge->Words()[2]->first);
00138
00139 edge = pruned.GetVertex(3).GetIncoming()[0];
00140 BOOST_CHECK_EQUAL(2, edge->Words().size());
00141 BOOST_CHECK_EQUAL((Vocab::Entry*)NULL, edge->Words()[0]);
00142 BOOST_CHECK_EQUAL(words[1]->first, edge->Words()[1]->first);
00143
00144
00145
00146
00147
00148
00149
00150
00151 }