1 #include "pfs.h" // -*- tab-width: 2 -*-
5 class HeapValue
: public vector
<float> {
7 bool operator() (uint v1
,uint v2
) {
8 return (*this)[v1
] > (*this)[v2
];
14 void PFS::segment_best(const Lattice &w,Segmentation &seps)
17 vector<bool> seen; // true if a node is seen
18 vector<uint> candidates; // examining nodes
21 int n = w.get_word_count();
25 val.resize(w.we->size()+1);
26 last.resize(w.we->size()+1);
27 seen.resize(w.we->size()+1);
28 candidates.reserve(w.we->size()+1);
30 const WordEntryRefs &wers_start = w.get_we(0);
31 int ii,nn = wers_start.size();
32 for (ii = 0; ii < nn;ii ++) {
33 int v = wers_start[ii]->id;
34 candidates.push_back(v);
35 push_heap(candidates.begin(),candidates.end(),val);
41 // while there is a node to examine
42 while (!candidates.empty()) {
45 pop_heap(candidates.begin(),candidates.end(),val);
46 int v = candidates.back();
47 candidates.pop_back();
49 //cerr << "got " << (*w.we)[v].node << " " << val[v] << endl;
51 int next = (*w.we)[v].pos+(*w.we)[v].len;
54 int vv = w.we->size();
59 //cerr << " end " << val[vv] << "=" << v << endl;
61 if (val[vv] > val[v]) {
64 //cerr << " new end " << val[vv] << "=" << v << endl;
70 const WordEntryRefs &wers = w.get_we(next);
76 vi[0] = (*w.we)[v].node.node->get_id();
77 for (ii = 0;ii < nn;ii ++) {
79 //value = val[v]+wers[ii]->node.node->get_prob();
80 //vi[0] = (*w.we)[last[v]].node.node->get_id();
81 add = (-get_ngram().wordProb((*w.we)[vv].node.node->get_id(),vi));
83 //cerr << "examine " << vv << "(" << wers[ii]->node << ")";
86 candidates.push_back(vv);
89 push_heap(candidates.begin(),candidates.end(),val);
91 //cerr << " add " << val[vv] << "=" << v << "+"<< add;
93 if (val[vv] > value) {
97 // re-heap if necessary
98 vector<uint>::iterator iter = find(candidates.begin(),candidates.end(),vv);
100 push_heap(candidates.begin(),iter,val);
101 if (iter != candidates.end())
106 //cerr << " val " << val[vv] << "=" << v << "+"<< add;
113 const WordEntries &we = *w.we;
116 //cerr << v << "->" << last[v] << endl;
123 reverse(seps.begin(),seps.end());
125 //cerr << "done" << endl;
129 void PFS::search(const DAG
&dag
,Path
&seps
)
132 vector
<bool> seen
; // true if a node is seen
133 vector
<uint
> candidates
; // examining nodes
136 uint n
= dag
.node_count();
141 candidates
.reserve(n
+1);
143 vector
<uint
> next_nodes
;
144 v
= dag
.node_begin();
148 candidates
.push_back(v
);
149 int ii
,nn
= next_nodes
.size();
151 dag.get_next(dag.node_begin(),next_nodes);
152 int ii,nn = next_nodes.size();
153 for (ii = 0; ii < nn;ii ++) {
155 candidates.push_back(v);
156 push_heap(candidates.begin(),candidates.end(),val);
159 last[v] = dag.node_begin();
163 // while there is a node to examine
164 while (!candidates
.empty()) {
167 pop_heap(candidates
.begin(),candidates
.end(),val
);
168 v
= candidates
.back();
169 candidates
.pop_back();
171 //cerr << "check " << v << " " << val[v] << endl;
174 dag
.get_next(v
,next_nodes
);
177 nn
= next_nodes
.size();
179 for (ii
= 0;ii
< nn
;ii
++) {
181 add
= dag
.edge_value(v
,vv
);
182 value
= val
[v
] + add
;
183 //cerr << "examine " << vv << "(" << vv << ")";
186 candidates
.push_back(vv
);
189 push_heap(candidates
.begin(),candidates
.end(),val
);
191 //cerr << " add " << val[vv] << "=" << v << "+"<< add;
193 if (val
[vv
] > value
) {
197 // re-heap if necessary
198 vector
<uint
>::iterator iter
= find(candidates
.begin(),candidates
.end(),vv
);
200 push_heap(candidates
.begin(),iter
,val
);
201 if (iter
!= candidates
.end())
206 //cerr << " val " << val[vv] << "=" << v << "+"<< add;
215 return; // ARGH! NO WAY TO THE END!!!
220 } while (v
!= last
[v
]);
222 reverse(seps
.begin(),seps
.end());
224 //cerr << "done" << endl;