00001
00002 #pragma once
00003
00004 #include "FeatureFunction.h"
00005
00006
00007 namespace Moses
00008 {
00009 class FFState;
00010
00011 namespace Syntax
00012 {
00013 struct SHyperedge;
00014 }
00015
00019 class StatefulFeatureFunction: public FeatureFunction
00020 {
00021
00022 static std::vector<const StatefulFeatureFunction*> m_statefulFFs;
00023
00024 public:
00025 static const std::vector<const StatefulFeatureFunction*>&
00026 GetStatefulFeatureFunctions() {
00027 return m_statefulFFs;
00028 }
00029
00030 StatefulFeatureFunction(const std::string &line, bool registerNow);
00031 StatefulFeatureFunction(size_t numScoreComponents, const std::string &line);
00032
00040 virtual FFState* EvaluateWhenApplied(
00041 const Hypothesis& cur_hypo,
00042 const FFState* prev_state,
00043 ScoreComponentCollection* accumulator) const = 0;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 virtual FFState* EvaluateWhenApplied(
00054 const ChartHypothesis& ,
00055 int ,
00056 ScoreComponentCollection* accumulator) const = 0;
00057
00058 virtual FFState* EvaluateWhenApplied(
00059 const Syntax::SHyperedge& ,
00060 int ,
00061 ScoreComponentCollection* accumulator) const {
00062 assert(false);
00063 return 0;
00064 }
00065
00067 virtual const FFState* EmptyHypothesisState(const InputType &input) const = 0;
00068
00069 bool IsStateless() const {
00070 return false;
00071 }
00072
00073
00074 virtual void
00075 EvaluateInIsolation
00076 (Phrase const& source, TargetPhrase const& targetPhrase,
00077 ScoreComponentCollection &scoreBreakdown,
00078 ScoreComponentCollection &estimatedScores) const {}
00079
00080 virtual void
00081 EvaluateWithSourceContext
00082 (InputType const&input, InputPath const& inputPath, TargetPhrase const& targetPhrase,
00083 StackVec const* stackVec, ScoreComponentCollection &scoreBreakdown,
00084 ScoreComponentCollection *estimatedFutureScore = NULL) const {}
00085
00086 virtual void
00087 EvaluateTranslationOptionListWithSourceContext
00088 (const InputType &input, const TranslationOptionList &translationOptionList) const {}
00089
00090 };
00091
00092
00093 }
00094
00095
00096