#ifndef LM_INTERPOLATE_UNIVERSAL_VOCAB_H #define LM_INTERPOLATE_UNIVERSAL_VOCAB_H #include "../word_index.hh" #include #include namespace lm { namespace interpolate { class UniversalVocab { public: explicit UniversalVocab(const std::vector& model_vocab_sizes); // GetUniversalIndex takes the model number and index for the specific // model and returns the universal model number WordIndex GetUniversalIdx(std::size_t model_num, WordIndex model_word_index) const { return model_index_map_[model_num][model_word_index]; } const WordIndex *Mapping(std::size_t model) const { return &*model_index_map_[model].begin(); } WordIndex SlowConvertToModel(std::size_t model, WordIndex index) const { std::vector::const_iterator i = lower_bound(model_index_map_[model].begin(), model_index_map_[model].end(), index); if (i == model_index_map_[model].end() || *i != index) return 0; return i - model_index_map_[model].begin(); } void InsertUniversalIdx(std::size_t model_num, WordIndex word_index, WordIndex universal_word_index) { model_index_map_[model_num][word_index] = universal_word_index; } private: std::vector > model_index_map_; }; } // namespace interpolate } // namespace lm #endif // LM_INTERPOLATE_UNIVERSAL_VOCAB_H