// -*- c++ -*- // written by Ulrich Germann #pragma once #include "moses/TranslationModel/UG/mm/ug_bitext.h" #include "util/exception.hh" #include "boost/format.hpp" #include "boost/foreach.hpp" namespace Moses { namespace bitext { template class PScorePfwd : public PhraseScorer { float conf; string denom; public: PScorePfwd(float const c, string d) { this->m_index = -1; conf = c; denom = d; size_t checksum = d.size(); BOOST_FOREACH(char const& x, denom) { if (x == '+') { --checksum; continue; } if (x != 'g' && x != 's' && x != 'r') continue; string s = (boost::format("pfwd-%c%.3f") % x % c).str(); this->m_feature_names.push_back(s); } this->m_num_feats = this->m_feature_names.size(); UTIL_THROW_IF2(this->m_feature_names.size() != checksum, "Unknown parameter in specification '" << d << "' for Pfwd phrase scorer at " << HERE); } void operator()(Bitext const& bt, PhrasePair & pp, vector * dest = NULL) const { if (!dest) dest = &pp.fvals; if (pp.joint > pp.good1) { pp.joint = pp.good1; // cerr<m_index; BOOST_FOREACH(char const& c, this->denom) { switch (c) { case 'g': (*dest)[i++] = log(lbop(pp.good1, pp.joint, conf)); break; case 's': (*dest)[i++] = log(lbop(pp.sample1, pp.joint, conf)); break; case 'r': (*dest)[i++] = log(lbop(pp.raw1, pp.joint, conf)); } } } }; } }