#ifndef PATH_TRIE_H #define PATH_TRIE_H #include #include #include #include #include #include "fst/fst-decl.h" #include "alphabet.h" namespace fst { template class SortedMatcher; } /* Trie tree for prefix storing and manipulating, with a dictionary in * finite-state transducer for spelling correction. */ class PathTrie { public: using FstType = fst::ConstFst; PathTrie(); ~PathTrie(); // get new prefix after appending new char PathTrie* get_path_trie(unsigned int new_char, unsigned int new_timestep, float log_prob_c, bool reset = true); // get the prefix data in correct time order from root to current node void get_path_vec(std::vector& output, std::vector& timesteps); // get the prefix data in correct time order from beginning of last grapheme to current node PathTrie* get_prev_grapheme(std::vector& output, std::vector& timesteps, const Alphabet& alphabet); // get the distance from current node to the first codepoint boundary, and the byte value at the boundary int distance_to_codepoint_boundary(unsigned char *first_byte, const Alphabet& alphabet); // get the prefix data in correct time order from beginning of last word to current node PathTrie* get_prev_word(std::vector& output, std::vector& timesteps, const Alphabet& alphabet); // update log probs void iterate_to_vec(std::vector& output); // set dictionary for FST void set_dictionary(std::shared_ptr dictionary); void set_matcher(std::shared_ptr>); bool is_empty() { return ROOT_ == character; } // remove current path from root void remove(); #ifdef DEBUG void vec(std::vector& out); void print(const Alphabet& a); #endif // DEBUG float log_prob_b_prev; float log_prob_nb_prev; float log_prob_b_cur; float log_prob_nb_cur; float log_prob_c; float score; float approx_ctc; unsigned int character; unsigned int timestep; PathTrie* parent; private: int ROOT_; bool exists_; bool has_dictionary_; std::vector> children_; // pointer to dictionary of FST std::shared_ptr dictionary_; int dictionary_state_; std::shared_ptr> matcher_; }; #endif // PATH_TRIE_H