1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#include <boost/tuple/tuple.hpp>
#include <gtest/gtest.h>
#include "cfg.h"
#include "hg_test.h"
#include "cfg_options.h"
#include "show.h"
/* TODO: easiest way to get meaningful confirmations that things work: implement conversion back to hg, and compare viterbi/inside etc. stats for equality to original hg. or you can define CSHOW_V and see lots of output */
using namespace boost;
#define CSHOW_V 0
#if CSHOW_V
# define CSHOWDO(x) x;
#else
# define CSHOWDO(x)
#endif
#define CSHOW(x) CSHOWDO(cerr<<#x<<'='<<x<<endl;)
typedef std::pair<string,string> HgW; // hg file,weights
struct CFGTest : public TestWithParam<HgW> {
string hgfile;
Hypergraph hg;
CFG cfg;
CFGFormat form;
SparseVector<double> weights;
static void JsonFN(Hypergraph &hg,CFG &cfg,SparseVector<double> &featw,std::string file
,std::string const& wts="Model_0 1 EgivenF 1 f1 1")
{
istringstream ws(wts);
EXPECT_TRUE(ws>>featw);
CSHOW(featw)
std::string path(boost::unit_test::framework::master_test_suite().argc == 2 ? boost::unit_test::framework::master_test_suite().argv[1] : TEST_DATA);
HGSetup::JsonTestFile(&hg,path,file);
hg.Reweight(featw);
cfg.Init(hg,true,true,false);
}
static void SetUpTestCase() {
}
static void TearDownTestCase() {
}
CFGTest() {
hgfile=GetParam().first;
JsonFN(hg,cfg,weights,hgfile,GetParam().second);
CSHOWDO(cerr<<"\nCFG Test: ")
CSHOW(hgfile);
form.nt_span=true;
form.comma_nt=false;
}
~CFGTest() { }
};
TEST_P(CFGTest,Binarize) {
CFGBinarize b;
b.bin_name_nts=1;
CFG cfgu=cfg;
EXPECT_EQ(cfgu,cfg);
int nrules=cfg.rules.size();
CSHOWDO(cerr<<"\nUniqing: "<<nrules<<"\n");
int nrem=cfgu.UniqRules();
cerr<<"\nCFG "<<hgfile<<" Uniqed - remaining: "<<nrem<<" of "<<nrules<<"\n";
if (nrem==nrules) {
EXPECT_EQ(cfgu,cfg);
//TODO - check that 1best is still the same (that we removed only worse edges)
}
for (int i=-1;i<8;++i) {
bool uniq;
if (i>=0) {
int f=i<<1;
b.bin_l2r=1;
b.bin_unary=(f>>=1)&1;
b.bin_topo=(f>>=1)&1;
uniq=(f>>=1)&1;
} else
b.bin_l2r=0;
CFG cc=uniq?cfgu:cfg;
CSHOW("\nBinarizing "<<(uniq?"uniqued ":"")<<": "<<i<<" "<<b);
cc.Binarize(b);
cerr<<"Binarized "<<b<<" rules size "<<cfg.rules_size()<<" => "<<cc.rules_size()<<"\n";
CSHOWDO(cc.Print(cerr,form);cerr<<"\n\n";);
}
}
INSTANTIATE_TEST_CASE_P(HypergraphsWeights,CFGTest,
Values(
HgW(perro_json,perro_wts)
, HgW(small_json,small_wts)
,HgW(urdu_json,urdu_wts)
));
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
|