7 class HeapValue
: public vector
<float> {
9 bool operator() (int v1
,int v2
) {
10 return (*this)[v1
] > (*this)[v2
];
15 void find_path(const Lattice
&w
)
17 vector
<int> back_traces
;
19 vector
<int> candidates
;
22 int i
,n
= w
.get_word_count();
25 back_traces
.resize(n
+1);
27 candidates
.reserve(n
+1);
29 candidates
.push_back(0);
36 pop_heap(candidates
.begin(),candidates
.end(),val
);
37 int v
= candidates
.back();
38 candidates
.pop_back();
39 cerr
<< "got " << v
<< " " << val
[v
] << endl
;
41 const WordEntryRefs
&wers
= w
.get_we(v
);
42 int vv
,ii
,nn
= wers
.size();
44 for (ii
= 0;ii
< nn
;ii
++) {
45 vv
= wers
[ii
]->pos
+wers
[ii
]->len
;
46 value
= val
[v
]+wers
[ii
]->node
.node
->get_prob();
47 cerr
<< "examine " << vv
<< "(" << wers
[ii
]->node
<< ")";
49 candidates
.push_back(vv
);
52 push_heap(candidates
.begin(),candidates
.end(),val
);
53 back_traces
[vv
] = wers
[ii
]->id
;
54 cerr
<< " add " << val
[vv
] << "=" << v
<< "+"<<wers
[ii
]->node
.node
->get_prob();
58 if (val
[vv
] > value
) {
60 vector
<int>::iterator iter
= find(candidates
.begin(),candidates
.end(),vv
);
62 push_heap(candidates
.begin(),iter
);
63 if (iter
!= candidates
.end())
68 back_traces
[vv
] = wers
[ii
]->id
;
69 cerr
<< " val " << val
[vv
] << "=" << v
<< "+"<<wers
[ii
]->node
.node
->get_prob();
78 const WordEntries
&we
= *w
.we
;
80 int l
= we
[back_traces
[p
]].len
;
81 P
.push_back(back_traces
[p
]);
84 for (i
= P
.size()-1;i
>= 0;i
--) {
85 cerr
<< we
[P
[i
]] << endl
;
88 cerr
<< "done" << endl
;
91 int main(int argc
,char **argv
)
93 dic_init(argc
> 1 ? new WordNode(get_sarch()["<root>"]) : new FuzzyWordNode(get_sarch()["<root>"]));
95 cerr
<< "Loading... ";
96 get_root()->load("wordlist.wl");
97 cerr
<< "done" << endl
;
99 get_sarch().set_blocked(true);
103 while (getline(cin
,s
)) {
105 if (count
% 200 == 0) cerr
<< count
<< endl
;
106 if (s
.empty()) continue;
108 sentences_split(s
,ss
);
109 for (int i
= 0;i
< ss
.size();i
++) {