00001
00002 #ifndef moses_FeatureFunction_h
00003 #define moses_FeatureFunction_h
00004
00005 #include <vector>
00006 #include <set>
00007 #include <string>
00008 #include "moses/FeatureVector.h"
00009 #include "moses/TypeDef.h"
00010 #include "moses/parameters/AllOptions.h"
00011 #include <boost/shared_ptr.hpp>
00012
00013 namespace Moses
00014 {
00015
00016 class AllOptions;
00017 class Phrase;
00018 class TargetPhrase;
00019 class TranslationOptionList;
00020 class TranslationOption;
00021 class Hypothesis;
00022 class ChartHypothesis;
00023 class InputType;
00024 class ScoreComponentCollection;
00025 class Bitmap;
00026 class Range;
00027 class FactorMask;
00028 class InputPath;
00029 class StackVec;
00030 class DistortionScoreProducer;
00031 class TranslationTask;
00032
00035 class FeatureFunction
00036 {
00037 protected:
00039 static std::vector<FeatureFunction*> s_staticColl;
00040
00041 std::string m_description, m_argLine;
00042 std::vector<std::vector<std::string> > m_args;
00043 bool m_tuneable;
00044 bool m_requireSortingAfterSourceContext;
00045 size_t m_verbosity;
00046 size_t m_numScoreComponents;
00047 size_t m_index;
00048 std::vector<bool> m_tuneableComponents;
00049 size_t m_numTuneableComponents;
00050 AllOptions::ptr m_options;
00051
00052 static std::multiset<std::string> description_counts;
00053
00054 public:
00055 static void Register(FeatureFunction* ff);
00056 private:
00057
00058 void ParseLine(const std::string &line);
00059
00060 public:
00061 static const std::vector<FeatureFunction*>& GetFeatureFunctions() {
00062 return s_staticColl;
00063 }
00064
00065 static FeatureFunction &FindFeatureFunction(const std::string& name);
00066 static void Destroy();
00067
00068 FeatureFunction(const std::string &line, bool registerNow);
00069 FeatureFunction(size_t numScoreComponents, const std::string &line, bool registerNow = true);
00070 virtual bool IsStateless() const = 0;
00071 virtual ~FeatureFunction();
00072
00074 virtual void Load(AllOptions::ptr const& opts) {
00075 m_options = opts;
00076 }
00077
00078 AllOptions::ptr const&
00079 options() const {
00080 return m_options;
00081 }
00082
00083 static void ResetDescriptionCounts() {
00084 description_counts.clear();
00085 }
00086
00089 size_t GetNumScoreComponents() const {
00090 return m_numScoreComponents;
00091 }
00092
00094 const std::string& GetScoreProducerDescription() const {
00095 return m_description;
00096 }
00097
00098 FName GetFeatureName(const std::string& name) const {
00099 return FName(GetScoreProducerDescription(), name);
00100 }
00101
00102
00104
00105 virtual bool IsTuneable() const {
00106 return m_tuneable;
00107 }
00108
00109 virtual bool HasTuneableComponents() const {
00110 return m_numTuneableComponents;
00111 }
00112
00113 virtual bool IsTuneableComponent(size_t i) const {
00114 if (m_numTuneableComponents == m_numScoreComponents) {
00115 return true;
00116 }
00117 return m_tuneableComponents[i];
00118 }
00119
00120 virtual bool RequireSortingAfterSourceContext() const {
00121 return m_requireSortingAfterSourceContext;
00122 }
00123
00124 virtual std::vector<float> DefaultWeights() const;
00125
00126 size_t GetIndex() const;
00127 size_t SetIndex(size_t const idx);
00128
00129 protected:
00130 virtual void
00131 CleanUpAfterSentenceProcessing(InputType const& source) { }
00132
00133 public:
00135 virtual void
00136 InitializeForInput(ttasksptr const& ttask) { };
00137
00138
00139 virtual void
00140 CleanUpAfterSentenceProcessing(ttasksptr const& ttask);
00141
00142 const std::string &
00143 GetArgLine() const {
00144 return m_argLine;
00145 }
00146
00147
00148
00149 virtual bool IsUseable(const FactorMask &mask) const = 0;
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 virtual void
00161 EvaluateInIsolation(const Phrase &source, const TargetPhrase &targetPhrase,
00162 ScoreComponentCollection& scoreBreakdown,
00163 ScoreComponentCollection& estimatedScores) const = 0;
00164
00165
00166 static void SetupAll(TranslationTask const& task);
00167 virtual void Setup(TranslationTask const& task) const { };
00168
00169
00170
00171
00172
00173
00174
00175
00176 virtual void EvaluateWithSourceContext(const InputType &input
00177 , const InputPath &inputPath
00178 , const TargetPhrase &targetPhrase
00179 , const StackVec *stackVec
00180 , ScoreComponentCollection &scoreBreakdown
00181 , ScoreComponentCollection *estimatedScores = NULL) const = 0;
00182
00183
00184
00185
00186
00187
00188
00189
00190 virtual void EvaluateTranslationOptionListWithSourceContext(const InputType &input
00191 , const TranslationOptionList &translationOptionList) const = 0;
00192
00193 virtual void SetParameter(const std::string& key, const std::string& value);
00194 virtual void ReadParameters();
00195 virtual void SetTuneableComponents(const std::string& value);
00196 };
00197
00198 }
00199
00200 #endif