Scores LexicalReorderingTableTree::auxFindScoreForContext(const Candidates& cands, const Phrase& context) { if(m_FactorsC.empty()) { CHECK(cands.size() <= 1); return (1 == cands.size())?(cands[0].GetScore(0)):(Scores()); } else { std::vector<std::string> cvec; for(size_t i = 0; i < context.GetSize(); ++i) { /* old code std::string s = context.GetWord(i).ToString(m_FactorsC); cvec.push_back(s.substr(0,s.size()-1)); */ cvec.push_back(context.GetWord(i).GetString(m_FactorsC, false)); } IPhrase c = m_Table->ConvertPhrase(cvec,TargetVocId); IPhrase sub_c; IPhrase::iterator start = c.begin(); for(size_t j = 0; j <= context.GetSize(); ++j, ++start) { sub_c.assign(start, c.end()); for(size_t cand = 0; cand < cands.size(); ++cand) { IPhrase p = cands[cand].GetPhrase(0); if(cands[cand].GetPhrase(0) == sub_c) { return cands[cand].GetScore(0); } } } return Scores(); } }
Scores LexicalReorderingTableTree:: auxFindScoreForContext(const Candidates& cands, const Phrase& context) { if(m_FactorsC.empty()) { UTIL_THROW_IF2(cands.size() > 1, "Error"); return (cands.size() == 1) ? cands[0].GetScore(0) : Scores(); } else { std::vector<std::string> cvec; for(size_t i = 0; i < context.GetSize(); ++i) cvec.push_back(context.GetWord(i).GetString(m_FactorsC, false)); IPhrase c = m_Table->ConvertPhrase(cvec,TargetVocId); IPhrase sub_c; IPhrase::iterator start = c.begin(); for(size_t j = 0; j <= context.GetSize(); ++j, ++start) { sub_c.assign(start, c.end()); for(size_t cand = 0; cand < cands.size(); ++cand) { IPhrase p = cands[cand].GetPhrase(0); if(cands[cand].GetPhrase(0) == sub_c) return cands[cand].GetScore(0); } } return Scores(); } }
Scores LexicalReorderingTableTree:: GetScore(const Phrase& f, const Phrase& e, const Phrase& c) { if((!m_FactorsF.empty() && 0 == f.GetSize()) || (!m_FactorsE.empty() && 0 == e.GetSize())) { //NOTE: no check for c as c might be empty, e.g. start of sentence //not a proper key // phi: commented out, since e may be empty (drop-unknown) //std::cerr << "Not a proper key!\n"; return Scores(); } CacheType::iterator i; if(m_UseCache) { std::pair<CacheType::iterator, bool> r; r = m_Cache.insert(std::make_pair(MakeCacheKey(f,e),Candidates())); if(!r.second) return auxFindScoreForContext((r.first)->second, c); i = r.first; } else if((i = m_Cache.find(MakeCacheKey(f,e))) != m_Cache.end()) // although we might not be caching now, cache might be none empty! return auxFindScoreForContext(i->second, c); // not in cache => go to file... Candidates cands; m_Table->GetCandidates(MakeTableKey(f,e), &cands); if(cands.empty()) return Scores(); if(m_UseCache) i->second = cands; if(m_FactorsC.empty()) { UTIL_THROW_IF2(1 != cands.size(), "Error"); return cands[0].GetScore(0); } else return auxFindScoreForContext(cands, c); };
std::vector<float> LexicalReorderingTableCompact::GetScore(const Phrase& f, const Phrase& e, const Phrase& c) { std::string key; Scores scores; if(0 == c.GetSize()) key = MakeKey(f, e, c); else for(size_t i = 0; i <= c.GetSize(); ++i) { Phrase sub_c(c.GetSubString(WordsRange(i,c.GetSize()-1))); key = MakeKey(f,e,sub_c); } size_t index = m_hash[key]; if(m_hash.GetSize() != index) { std::string scoresString; if(m_inMemory) scoresString = m_scoresMemory[index]; else scoresString = m_scoresMapped[index]; BitWrapper<> bitStream(scoresString); for(size_t i = 0; i < m_numScoreComponent; i++) scores.push_back(m_scoreTrees[m_multipleScoreTrees ? i : 0]->Read(bitStream)); return scores; } return Scores(); }
std::vector<float> LexicalReorderingTableMemory::GetScore(const Phrase& f, const Phrase& e, const Phrase& c) { //rather complicated because of const can't use []... as [] might enter new things into std::map //also can't have to be careful with words range if c is empty can't use c.GetSize()-1 will underflow and be large TableType::const_iterator r; std::string key; if(0 == c.GetSize()) { key = MakeKey(f,e,c); r = m_Table.find(key); if(m_Table.end() != r) { return r->second; } } else { //right try from large to smaller context for(size_t i = 0; i <= c.GetSize(); ++i) { Phrase sub_c(c.GetSubString(WordsRange(i,c.GetSize()-1))); key = MakeKey(f,e,sub_c); r = m_Table.find(key); if(m_Table.end() != r) { return r->second; } } } return Scores(); }
vector<Scores> eval_on_dirs(shared_ptr<Model>model, vector<string> testDirs) { // setup parameters vector<Scores> scores; map<string,Scores> scoresByPose; // default values scores = vector<Scores>(testDirs.size()); // open the output file FileStorage best_detections(params::out_dir() + "best_detections.yml",FileStorage::WRITE); TaskBlock test_each_directory("eval_model"); for(int iter = 0; iter < testDirs.size(); iter++) { test_each_directory.add_callee([&,iter]() { test_model(*model,testDirs[iter],scores[iter], scoresByPose, [&](string filename,DetectorResult&det,DetectorResult&closest,bool correct) { write_best_det(best_detections,filename,det,closest,correct); }); //if(POSE == "") //eval_pose_estimation(*model,testDirs[iter],scores[iter]); }); } test_each_directory.execute(); // release the output directory best_detections.release(); // log the results for(int iter = 0; iter < testDirs.size(); iter++) eval_log_result(testDirs[iter],scores[iter]); // by pose for(auto pose_score : scoresByPose) eval_log_result(pose_score.first,pose_score.second); // total eval_log_result("TOTAL",Scores(scores)); return scores; }
std::vector<float> Scores(MutationType mutationType, int position, char base) const { return Scores(mutationType, position, base, 0.0f); }
std::vector<float> Scores(const Mutation& m) const { return Scores(m, 0.0f); }
std::vector<double> Scores(MutationType mutationType, int position, char base) { return Scores(mutationType, position, base, 0.0); }
std::vector<double> Scores(const Mutation& m) { return Scores(m, 0.0); }