#ifndef LM_WRAPPERS_NPLM_H #define LM_WRAPPERS_NPLM_H #include "../facade.hh" #include "../max_order.hh" #include "../../util/string_piece.hh" #include #include /* Wrapper to NPLM "by Ashish Vaswani, with contributions from David Chiang * and Victoria Fossum." * http://nlg.isi.edu/software/nplm/ */ namespace nplm { class vocabulary; class neuralLM; } // namespace nplm namespace lm { namespace np { class Vocabulary : public base::Vocabulary { public: Vocabulary(const nplm::vocabulary &vocab); ~Vocabulary(); WordIndex Index(const std::string &str) const; // TODO: lobby them to support StringPiece WordIndex Index(const StringPiece &str) const { return Index(std::string(str.data(), str.size())); } lm::WordIndex NullWord() const { return null_word_; } private: const nplm::vocabulary &vocab_; const lm::WordIndex null_word_; }; // Sorry for imposing my limitations on your code. #define NPLM_MAX_ORDER 7 struct State { WordIndex words[NPLM_MAX_ORDER - 1]; }; class Backend; class Model : public lm::base::ModelFacade { private: typedef lm::base::ModelFacade P; public: // Does this look like an NPLM? static bool Recognize(const std::string &file); explicit Model(const std::string &file, std::size_t cache_size = 1 << 20); ~Model(); FullScoreReturn FullScore(const State &from, const WordIndex new_word, State &out_state) const; FullScoreReturn FullScoreForgotState(const WordIndex *context_rbegin, const WordIndex *context_rend, const WordIndex new_word, State &out_state) const; private: boost::scoped_ptr base_instance_; mutable boost::thread_specific_ptr backend_; Vocabulary vocab_; lm::WordIndex null_word_; const std::size_t cache_size_; }; } // namespace np } // namespace lm #endif // LM_WRAPPERS_NPLM_H