00001 #include "search/rule.hh"
00002
00003 #include "lm/model.hh"
00004 #include "search/context.hh"
00005
00006 #include <ostream>
00007
00008 #include <cmath>
00009
00010 namespace search {
00011
00012 template <class Model> ScoreRuleRet ScoreRule(const Model &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing) {
00013 ScoreRuleRet ret;
00014 ret.prob = 0.0;
00015 ret.oov = 0;
00016 const lm::WordIndex oov = model.GetVocabulary().NotFound(), bos = model.GetVocabulary().BeginSentence();
00017 lm::ngram::RuleScore<Model> scorer(model, *(writing++));
00018 std::vector<lm::WordIndex>::const_iterator word = words.begin();
00019 if (word != words.end() && *word == bos) {
00020 scorer.BeginSentence();
00021 ++word;
00022 }
00023 for (; word != words.end(); ++word) {
00024 if (*word == kNonTerminal) {
00025 ret.prob += scorer.Finish();
00026 scorer.Reset(*(writing++));
00027 } else {
00028 if (*word == oov) ++ret.oov;
00029 scorer.Terminal(*word);
00030 }
00031 }
00032 ret.prob += scorer.Finish();
00033 return ret;
00034 }
00035
00036 template ScoreRuleRet ScoreRule(const lm::ngram::RestProbingModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00037 template ScoreRuleRet ScoreRule(const lm::ngram::ProbingModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00038 template ScoreRuleRet ScoreRule(const lm::ngram::TrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00039 template ScoreRuleRet ScoreRule(const lm::ngram::QuantTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00040 template ScoreRuleRet ScoreRule(const lm::ngram::ArrayTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00041 template ScoreRuleRet ScoreRule(const lm::ngram::QuantArrayTrieModel &model, const std::vector<lm::WordIndex> &words, lm::ngram::ChartState *writing);
00042
00043 }