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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include "apply_fsa_models.h"
#include "hg.h"
#include "ff_fsa_dynamic.h"
#include "ff_from_fsa.h"
#include "feature_vector.h"
#include "stringlib.h"
#include "apply_models.h"
#include <stdexcept>
#include <cassert>
#include "cfg.h"
using namespace std;
struct ApplyFsa {
ApplyFsa(HgCFG &i,
const SentenceMetadata& smeta,
const FsaFeatureFunction& fsa,
DenseWeightVector const& weights,
ApplyFsaBy const& by,
Hypergraph* oh
)
:hgcfg(i),smeta(smeta),fsa(fsa),weights(weights),by(by),oh(oh)
{
}
void Compute() {
if (by.IsBottomUp())
ApplyBottomUp();
else
ApplyEarley();
}
void ApplyBottomUp();
void ApplyEarley();
CFG const& GetCFG();
private:
CFG cfg;
HgCFG &hgcfg;
const SentenceMetadata& smeta;
const FsaFeatureFunction& fsa;
// WeightVector weight_vector;
DenseWeightVector weights;
ApplyFsaBy by;
Hypergraph* oh;
std::string cfg_out;
};
void ApplyFsa::ApplyBottomUp()
{
assert(by.IsBottomUp());
FeatureFunctionFromFsa<FsaFeatureFunctionFwd> buff(&fsa);
buff.Init(); // mandatory to call this (normally factory would do it)
vector<const FeatureFunction*> ffs(1,&buff);
ModelSet models(weights, ffs);
IntersectionConfiguration i(by.BottomUpAlgorithm(),by.pop_limit);
ApplyModelSet(hgcfg.ih,smeta,models,i,oh);
}
void ApplyFsa::ApplyEarley()
{
hgcfg.GiveCFG(cfg);
//TODO:
}
void ApplyFsaModels(HgCFG &i,
const SentenceMetadata& smeta,
const FsaFeatureFunction& fsa,
DenseWeightVector const& weight_vector,
ApplyFsaBy const& by,
Hypergraph* oh)
{
ApplyFsa a(i,smeta,fsa,weight_vector,by,oh);
a.Compute();
}
namespace {
char const* anames[]={
"BU_CUBE",
"BU_FULL",
"EARLEY",
0
};
}
//TODO: named enum type in boost?
std::string ApplyFsaBy::name() const {
return anames[algorithm];
}
std::string ApplyFsaBy::all_names() {
std::ostringstream o;
for (int i=0;i<N_ALGORITHMS;++i) {
assert(anames[i]);
if (i) o<<' ';
o<<anames[i];
}
return o.str();
}
ApplyFsaBy::ApplyFsaBy(std::string const& n, int pop_limit) : pop_limit(pop_limit) {
algorithm=0;
std::string uname=toupper(n);
while(anames[algorithm] && anames[algorithm] != uname) ++algorithm;
if (!anames[algorithm])
throw std::runtime_error("Unknown ApplyFsaBy type: "+n+" - legal types: "+all_names());
}
ApplyFsaBy::ApplyFsaBy(int i, int pop_limit) : pop_limit(pop_limit) {
assert (i>=0);
assert (i<N_ALGORITHMS);
algorithm=i;
}
int ApplyFsaBy::BottomUpAlgorithm() const {
assert(IsBottomUp());
return algorithm==BU_CUBE ?
IntersectionConfiguration::CUBE
:IntersectionConfiguration::FULL;
}
|