189 std::deque<std::tuple<int, int>> best_choices;
190 ExtractBestPaths(&best_nodes, &second_nodes);
192 DebugPath(unicharset, best_nodes);
193 ExtractPathAsUnicharIds(second_nodes, &unichar_ids, &certs, &ratings,
195 tprintf(
"\nSecond choice path:\n");
196 DebugUnicharPath(unicharset, second_nodes, unichar_ids, certs, ratings,
202 if (lstm_choice_mode == 2) {
203 ExtractPathAsUnicharIds(best_nodes, &unichar_ids, &certs, &ratings,
204 &xcoords, &best_choices);
205 if (best_choices.size() > 0) {
206 timestepEnd = std::get<1>(best_choices.front());
207 best_choices.pop_front();
210 ExtractPathAsUnicharIds(best_nodes, &unichar_ids, &certs, &ratings,
213 int num_ids = unichar_ids.
size();
215 DebugUnicharPath(unicharset, best_nodes, unichar_ids, certs, ratings,
220 float prev_space_cert = 0.0f;
221 for (
int word_start = 0; word_start < num_ids; word_start = word_end) {
222 for (word_end = word_start + 1; word_end < num_ids; ++word_end) {
227 int index = xcoords[word_end];
228 if (best_nodes[index]->start_of_word)
break;
234 float space_cert = 0.0f;
235 if (word_end < num_ids && unichar_ids[word_end] ==
UNICHAR_SPACE)
236 space_cert = certs[word_end];
238 word_start > 0 && unichar_ids[word_start - 1] ==
UNICHAR_SPACE;
240 WERD_RES* word_res = InitializeWord(
241 leading_space, line_box, word_start, word_end,
242 std::min(space_cert, prev_space_cert), unicharset, xcoords, scale_factor);
243 if (lstm_choice_mode == 1) {
244 for (
size_t i = timestepEnd; i < xcoords[word_end]; i++) {
247 timestepEnd = xcoords[word_end];
248 }
else if (lstm_choice_mode == 2){
251 std::vector<std::pair<const char*, float>> choice_pairs;
252 for (
size_t i = timestepEnd; i < xcoords[word_end]; i++) {
253 for (std::pair<const char*, float> choice :
timesteps[i]) {
254 if (std::strcmp(choice.first,
"")) {
255 sum += choice.second;
256 choice_pairs.push_back(choice);
259 if ((best_choices.size() > 0 && i == std::get<1>(best_choices.front()) - 1)
260 || i == xcoords[word_end]-1) {
261 std::map<const char*, float> summed_propabilities;
262 for (
auto & choice_pair : choice_pairs) {
263 summed_propabilities[choice_pair.first] += choice_pair.second;
265 std::vector<std::pair<const char*, float>> accumulated_timestep;
266 for (
auto& summed_propability : summed_propabilities) {
268 summed_propability.second/=sum;
270 while (accumulated_timestep.size() > pos
271 && accumulated_timestep[pos].second > summed_propability.second) {
274 accumulated_timestep.insert(accumulated_timestep.begin() + pos,
275 std::pair<const char*,float>(summed_propability.first,
276 summed_propability.second));
278 if (best_choices.size() > 0) {
279 best_choices.pop_front();
281 choice_pairs.clear();
282 word_res->
timesteps.push_back(accumulated_timestep);
286 timestepEnd = xcoords[word_end];
288 for (
int i = word_start; i < word_end; ++i) {
289 auto* choices =
new BLOB_CHOICE_LIST;
290 BLOB_CHOICE_IT bc_it(choices);
292 unichar_ids[i], ratings[i], certs[i], -1, 1.0f,
294 int col = i - word_start;
295 choice->set_matrix_cell(col, col);
296 bc_it.add_after_then_move(choice);
299 int index = xcoords[word_end - 1];
302 prev_space_cert = space_cert;
303 if (word_end < num_ids && unichar_ids[word_end] ==
UNICHAR_SPACE)
std::vector< std::vector< std::pair< const char *, float > > > timesteps
void FakeWordFromRatings(PermuterType permuter)
bool IsSpaceDelimited(UNICHAR_ID unichar_id) const
std::vector< std::vector< std::pair< const char *, float > > > timesteps
void put(ICOORD pos, const T &thing)
DLLSYM void tprintf(const char *format,...)