00001 #ifndef moses_PhraseBoundaryFeature_h
00002 #define moses_PhraseBoundaryFeature_h
00003
00004 #include <stdexcept>
00005 #include <sstream>
00006 #include <string>
00007
00008 #include "StatefulFeatureFunction.h"
00009 #include "moses/FF/FFState.h"
00010 #include "moses/Word.h"
00011
00012 namespace Moses
00013 {
00014
00015 class PhraseBoundaryState : public FFState
00016 {
00017 public:
00018 PhraseBoundaryState(const Word* sourceWord, const Word* targetWord) :
00019 m_sourceWord(sourceWord), m_targetWord(targetWord) {}
00020 const Word* GetSourceWord() const {
00021 return m_sourceWord;
00022 }
00023 const Word* GetTargetWord() const {
00024 return m_targetWord;
00025 }
00026 virtual size_t hash() const;
00027 virtual bool operator==(const FFState& other) const;
00028
00029
00030 private:
00031 const Word* m_sourceWord;
00032 const Word* m_targetWord;
00033 };
00034
00035
00039 class PhraseBoundaryFeature : public StatefulFeatureFunction
00040 {
00041 public:
00042 PhraseBoundaryFeature(const std::string &line);
00043
00044 bool IsUseable(const FactorMask &mask) const;
00045
00046 virtual const FFState* EmptyHypothesisState(const InputType &) const;
00047
00048 virtual FFState* EvaluateWhenApplied(const Hypothesis& cur_hypo, const FFState* prev_state,
00049 ScoreComponentCollection* accumulator) const;
00050
00051 virtual FFState* EvaluateWhenApplied( const ChartHypothesis& ,
00052 int ,
00053 ScoreComponentCollection* ) const {
00054 throw std::logic_error("PhraseBoundaryState not supported in chart decoder, yet");
00055 }
00056
00057 void SetParameter(const std::string& key, const std::string& value);
00058
00059 private:
00060 void AddFeatures(
00061 const Word* leftWord, const Word* rightWord, const FactorList& factors,
00062 const std::string& side, ScoreComponentCollection* scores) const ;
00063 FactorList m_sourceFactors;
00064 FactorList m_targetFactors;
00065 };
00066
00067 }
00068
00069
00070 #endif