diff options
author | Hieu Hoang <hieu@hoang.co.uk> | 2013-06-05 01:09:21 +0400 |
---|---|---|
committer | Hieu Hoang <hieu@hoang.co.uk> | 2013-06-05 01:09:21 +0400 |
commit | fc7e4f455011f02928c45265b2fa2b3a27e6d80f (patch) | |
tree | fac4eb33f67362b4bd5a727a22d0c67d4bac5d9c | |
parent | 7f1a6041badb9d63cd5ca3063dc6902934fc43d6 (diff) |
minor cleanup of InputFeature
-rw-r--r-- | moses/FF/InputFeature.cpp | 39 | ||||
-rw-r--r-- | moses/FF/InputFeature.h | 14 | ||||
-rw-r--r-- | moses/StaticData.cpp | 29 | ||||
-rw-r--r-- | moses/StaticData.h | 6 |
4 files changed, 58 insertions, 30 deletions
diff --git a/moses/FF/InputFeature.cpp b/moses/FF/InputFeature.cpp index 1ef394f9f..8cdaf3f0b 100644 --- a/moses/FF/InputFeature.cpp +++ b/moses/FF/InputFeature.cpp @@ -1,6 +1,7 @@ #include <stdexcept> - #include "InputFeature.h" +#include "moses/Util.h" +#include "util/check.hh" using namespace std; @@ -9,32 +10,20 @@ namespace Moses InputFeature::InputFeature(const std::string &line) :StatelessFeatureFunction("InputFeature", line) { - -} - -const InputFeature &InputFeature::GetInputFeature() -{ - static const InputFeature *staticObj = NULL; - - if (staticObj) { - return *staticObj; + for (size_t i = 0; i < m_args.size(); ++i) { + const vector<string> &args = m_args[i]; + CHECK(args.size() == 2); + + if (args[0] == "num-input-features") { + m_numInputScores = Scan<size_t>(args[1]); + } else if (args[0] == "real-word-count") { + m_numRealWordCount = Scan<size_t>(args[1]); + } else { + throw "Unknown argument " + args[0]; + } } - // 1st time looking up the feature - const std::vector<const StatelessFeatureFunction*> &statefulFFs = StatelessFeatureFunction::GetStatelessFeatureFunctions(); - for (size_t i = 0; i < statefulFFs.size(); ++i) { - const StatelessFeatureFunction *ff = statefulFFs[i]; - const InputFeature *lm = dynamic_cast<const InputFeature*>(ff); - - if (lm) { - staticObj = lm; - return *staticObj; - } - } - - throw std::logic_error("No input feature."); - } -} +} // namespace diff --git a/moses/FF/InputFeature.h b/moses/FF/InputFeature.h index fe02801e6..911aff81f 100644 --- a/moses/FF/InputFeature.h +++ b/moses/FF/InputFeature.h @@ -9,13 +9,21 @@ namespace Moses class InputFeature : public StatelessFeatureFunction { - +protected: + size_t m_numInputScores; + size_t m_numRealWordCount; public: InputFeature(const std::string &line); - // miscellaenous ad-hoc features - static const InputFeature &GetInputFeature(); + bool IsUseable(const FactorMask &mask) const + { return true; } + + size_t GetNumInputScores() const + { return m_numInputScores; } + size_t GetNumRealWordsInInput() const + { return m_numRealWordCount; } + }; diff --git a/moses/StaticData.cpp b/moses/StaticData.cpp index 58c4ada51..cfea7514a 100644 --- a/moses/StaticData.cpp +++ b/moses/StaticData.cpp @@ -60,6 +60,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "moses/FF/PhraseLengthFeature.h" #include "moses/FF/DistortionScoreProducer.h" #include "moses/FF/WordPenaltyProducer.h" +#include "moses/FF/InputFeature.h" #include "LM/Ken.h" #ifdef LM_IRST @@ -96,6 +97,9 @@ StaticData::StaticData() ,m_needAlignmentInfo(false) ,m_numInputScores(0) ,m_numRealWordsInInput(0) + ,m_inputFeature(NULL) + ,m_wpProducer(NULL) + ,m_unknownWordPenaltyProducer(NULL) { m_xmlBrackets.first="<"; m_xmlBrackets.second=">"; @@ -653,14 +657,17 @@ bool StaticData::LoadData(Parameter *parameter) WordPenaltyProducer *model = new WordPenaltyProducer(line); vector<float> weights = m_parameter->GetWeights(model->GetScoreProducerDescription()); SetWeights(model, weights); - m_wpProducer = model; } else if (feature == "UnknownWordPenalty") { UnknownWordPenaltyProducer *model = new UnknownWordPenaltyProducer(line); vector<float> weights = m_parameter->GetWeights(model->GetScoreProducerDescription()); if (weights.size() == 0) weights.push_back(1.0f); SetWeights(model, weights); - m_unknownWordPenaltyProducer = model; + } else if (feature == "InputFeature") { + InputFeature *model = new InputFeature(line); + vector<float> weights = m_parameter->GetWeights(model->GetScoreProducerDescription()); + SetWeights(model, weights); + } else if (feature == "PhraseDictionaryBinary") { PhraseDictionaryTreeAdaptor* model = new PhraseDictionaryTreeAdaptor(line); vector<float> weights = m_parameter->GetWeights(model->GetScoreProducerDescription()); @@ -1147,6 +1154,24 @@ void StaticData::LoadFeatureFunctions() m_generationDictionary.push_back(generation); } + WordPenaltyProducer *wpProducer = dynamic_cast<WordPenaltyProducer*>(ff); + if (wpProducer) { + CHECK(m_wpProducer == NULL); // max 1 feature; + m_wpProducer = wpProducer; + } + + UnknownWordPenaltyProducer *unknownWordPenaltyProducer = dynamic_cast<UnknownWordPenaltyProducer*>(ff); + if (unknownWordPenaltyProducer) { + CHECK(m_unknownWordPenaltyProducer == NULL); // max 1 feature; + m_unknownWordPenaltyProducer = unknownWordPenaltyProducer; + } + + const InputFeature *inputFeature = dynamic_cast<const InputFeature*>(ff); + if (inputFeature) { + CHECK(m_inputFeature == NULL); // max 1 input feature; + m_inputFeature = inputFeature; + } + PhraseDictionary *pt = dynamic_cast<PhraseDictionary*>(ff); if (pt) { m_phraseDictionary.push_back(pt); diff --git a/moses/StaticData.h b/moses/StaticData.h index 82bf6b23c..1e9d8c0da 100644 --- a/moses/StaticData.h +++ b/moses/StaticData.h @@ -56,6 +56,7 @@ class GenerationDictionary; class DecodeStep; class WordPenaltyProducer; class UnknownWordPenaltyProducer; +class InputFeature; typedef std::pair<std::string, float> UnknownLHSEntry; typedef std::vector<UnknownLHSEntry> UnknownLHSList; @@ -129,6 +130,7 @@ protected: mutable size_t m_verboseLevel; WordPenaltyProducer* m_wpProducer; UnknownWordPenaltyProducer *m_unknownWordPenaltyProducer; + const InputFeature *m_inputFeature; bool m_reportSegmentation; bool m_reportAllFactors; @@ -435,6 +437,10 @@ public: return m_unknownWordPenaltyProducer; } + const InputFeature *GetInputFeature() const { + return m_inputFeature; + } + size_t GetNumInputScores() const { return m_numInputScores; } |