| #include "search/rule.hh" |
|
|
| #include "lm/model.hh" |
| #include "search/context.hh" |
|
|
| #include <ostream> |
|
|
| #include <cmath> |
|
|
| namespace search { |
|
|
| template <class Model> ScoreRuleRet ScoreRule(const Model &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing) { |
| ScoreRuleRet ret; |
| ret.prob = 0.0; |
| ret.oov = 0; |
| const lm::WordIndex oov = model.GetVocabulary().NotFound(), bos = model.GetVocabulary().BeginSentence(); |
| lm::ngram::RuleScore<Model> scorer(model, *(writing++)); |
| std::vector<lm::WordIndex>::const_iterator word = words.begin(); |
| if (word != words.end() && *word == bos) { |
| scorer.BeginSentence(); |
| ++word; |
| } |
| for (; word != words.end(); ++word) { |
| if (*word == kNonTerminal) { |
| ret.prob += scorer.Finish(); |
| scorer.Reset(*(writing++)); |
| } else { |
| if (*word == oov) ++ret.oov; |
| scorer.Terminal(*word); |
| } |
| } |
| ret.prob += scorer.Finish(); |
| return ret; |
| } |
|
|
| template ScoreRuleRet ScoreRule(const lm::ngram::RestProbingModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
| template ScoreRuleRet ScoreRule(const lm::ngram::ProbingModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
| template ScoreRuleRet ScoreRule(const lm::ngram::TrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
| template ScoreRuleRet ScoreRule(const lm::ngram::QuantTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
| template ScoreRuleRet ScoreRule(const lm::ngram::ArrayTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
| template ScoreRuleRet ScoreRule(const lm::ngram::QuantArrayTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing); |
|
|
| } |
|
|