#include #include "util/check.hh" #include "util/exception.hh" #include "FeatureFunction.h" #include "moses/Hypothesis.h" #include "moses/Manager.h" #include "moses/TranslationOption.h" using namespace std; namespace Moses { multiset FeatureFunction::description_counts; std::vector FeatureFunction::m_producers; std::vector StatelessFeatureFunction::m_statelessFFs; std::vector StatefulFeatureFunction::m_statefulFFs; FeatureFunction &FeatureFunction::FindFeatureFunction(const std::string& name) { for (size_t i = 0; i < m_producers.size(); ++i) { FeatureFunction &ff = *m_producers[i]; if (ff.GetScoreProducerDescription() == name) { return ff; } } throw "Unknown feature " + name; } FeatureFunction::FeatureFunction(const std::string& description, const std::string &line) : m_tuneable(true) { Initialize(description, line); } FeatureFunction::FeatureFunction(const std::string& description, size_t numScoreComponents, const std::string &line) : m_numScoreComponents(numScoreComponents) , m_tuneable(true) { Initialize(description, line); } void FeatureFunction::Initialize(const std::string& description, const std::string &line) { ParseLine(description, line); size_t ind = 0; while (ind < m_args.size()) { vector &args = m_args[ind]; bool consumed = OverrideParameter(args[0], args[1]); if (consumed) { m_args.erase(m_args.begin() + ind); } else { ++ind; } } if (m_description == "") { size_t index = description_counts.count(description); ostringstream dstream; dstream << description; dstream << index; description_counts.insert(description); m_description = dstream.str(); } ScoreComponentCollection::RegisterScoreProducer(this); m_producers.push_back(this); } FeatureFunction::~FeatureFunction() {} void FeatureFunction::ParseLine(const std::string& description, const std::string &line) { vector toks = Tokenize(line); CHECK(toks.size()); //CHECK(toks[0] == description); for (size_t i = 1; i < toks.size(); ++i) { vector args = Tokenize(toks[i], "="); CHECK(args.size() == 2); m_args.push_back(args); } } bool FeatureFunction::OverrideParameter(const std::string& key, const std::string& value) { if (key == "num-features") { m_numScoreComponents = Scan(value); } else if (key == "name") { m_description = value; } else if (key == "tuneable") { m_tuneable = Scan(value); } else { //UTIL_THROW(util::Exception, "unknown key" << key); return false; } return true; } }