bool Dawg::match_words(WERD_CHOICE *word, inT32 index, NODE_REF node, UNICHAR_ID wildcard) const { EDGE_REF edge; inT32 word_end; if (wildcard != INVALID_UNICHAR_ID && word->unichar_id(index) == wildcard) { bool any_matched = false; NodeChildVector vec; this->unichar_ids_of(node, &vec); for (int i = 0; i < vec.size(); ++i) { word->set_unichar_id(vec[i].unichar_id, index); if (match_words(word, index, node, wildcard)) any_matched = true; } word->set_unichar_id(wildcard, index); return any_matched; } else { word_end = index == word->length() - 1; edge = edge_char_of(node, word->unichar_id(index), word_end); if (edge != NO_EDGE) { // normal edge in DAWG node = next_node(edge); if (word_end) { if (debug_level_ > 1) word->print("match_words() found: "); return true; } else if (node != 0) { return match_words(word, index+1, node, wildcard); } } } return false; }
int TessLangModEdge::CreateChildren(CubeRecoContext *cntxt, const Dawg *dawg, NODE_REF parent_node, LangModEdge **edge_array) { int edge_cnt = 0; NodeChildVector vec; dawg->unichar_ids_of(parent_node, &vec, false); // find all children for (int i = 0; i < vec.size(); ++i) { const NodeChild &child = vec[i]; if (child.unichar_id == INVALID_UNICHAR_ID) continue; edge_array[edge_cnt++] = new TessLangModEdge(cntxt, dawg, child.edge_ref, child.unichar_id); } return edge_cnt; }
void Dawg::iterate_words_rec(const WERD_CHOICE &word_so_far, NODE_REF to_explore, TessCallback1<const WERD_CHOICE *> *cb) const { NodeChildVector children; this->unichar_ids_of(to_explore, &children, false); for (int i = 0; i < children.size(); i++) { WERD_CHOICE next_word(word_so_far); next_word.append_unichar_id(children[i].unichar_id, 1, 0.0, 0.0); if (this->end_of_word(children[i].edge_ref)) { cb->Run(&next_word); } NODE_REF next = next_node(children[i].edge_ref); if (next != 0) { iterate_words_rec(next_word, next, cb); } } }
void Dawg::iterate_words_rec(const WERD_CHOICE &word_so_far, NODE_REF to_explore, TessCallback1<const char *> *cb) const { NodeChildVector children; this->unichar_ids_of(to_explore, &children); for (int i = 0; i < children.size(); i++) { WERD_CHOICE next_word(word_so_far); next_word.append_unichar_id(children[i].unichar_id, 1, 0.0, 0.0); if (this->end_of_word(children[i].edge_ref)) { STRING s; next_word.string_and_lengths(&s, NULL); cb->Run(s.string()); } NODE_REF next = next_node(children[i].edge_ref); if (next != 0) { iterate_words_rec(next_word, next, cb); } } }