00001
00002 #pragma once
00003
00004 #include <vector>
00005 #include <string>
00006
00007 #include "FFState.h"
00008 #include "Hypothesis.h"
00009 #include "LexicalReordering.h"
00010 #include "WordsRange.h"
00011 #include "WordsBitmap.h"
00012 #include "ReorderingStack.h"
00013 #include "TranslationOption.h"
00014
00015
00016 namespace Moses
00017 {
00018 class LexicalReorderingState;
00019
00021 class LexicalReorderingConfiguration
00022 {
00023 public:
00024 enum ModelType {Monotonic, MSD, MSLR, LeftRight, None};
00025 enum Direction {Forward, Backward, Bidirectional};
00026 enum Condition {F, E, FE};
00027
00028 LexicalReorderingConfiguration(ScoreProducer *scoreProducer, const std::string &modelType);
00029
00030 LexicalReorderingState *CreateLexicalReorderingState(const InputType &input) const;
00031
00032 size_t GetNumScoreComponents() const;
00033 size_t GetNumberOfTypes() const;
00034
00035 ScoreProducer *GetScoreProducer() const {
00036 return m_scoreProducer;
00037 }
00038
00039 ModelType GetModelType() const {
00040 return m_modelType;
00041 }
00042
00043 Direction GetDirection() const {
00044 return m_direction;
00045 }
00046
00047 Condition GetCondition() const {
00048 return m_condition;
00049 }
00050
00051 bool IsPhraseBased() const {
00052 return m_phraseBased;
00053 }
00054
00055 bool CollapseScores() const {
00056 return m_collapseScores;
00057 }
00058
00059 private:
00060 ScoreProducer *m_scoreProducer;
00061 ModelType m_modelType;
00062 bool m_phraseBased;
00063 bool m_collapseScores;
00064 Direction m_direction;
00065 Condition m_condition;
00066 };
00067
00069 class LexicalReorderingState : public FFState
00070 {
00071 public:
00072
00073 virtual int Compare(const FFState& o) const = 0;
00074 virtual LexicalReorderingState* Expand(const TranslationOption& hypo, Scores& scores) const = 0;
00075
00076 static LexicalReorderingState* CreateLexicalReorderingState(const std::vector<std::string>& config,
00077 LexicalReorderingConfiguration::Direction dir, const InputType &input);
00078
00079 protected:
00080 typedef int ReorderingType;
00081
00082 const LexicalReorderingConfiguration &m_configuration;
00083
00084 LexicalReorderingConfiguration::Direction m_direction;
00085 size_t m_offset;
00086 const Scores *m_prevScore;
00087
00088 inline LexicalReorderingState(const LexicalReorderingState *prev, const TranslationOption &topt) :
00089 m_configuration(prev->m_configuration), m_direction(prev->m_direction), m_offset(prev->m_offset),
00090 m_prevScore(topt.GetCachedScores(m_configuration.GetScoreProducer())) {}
00091
00092 inline LexicalReorderingState(const LexicalReorderingConfiguration &config, LexicalReorderingConfiguration::Direction dir, size_t offset)
00093 : m_configuration(config), m_direction(dir), m_offset(offset), m_prevScore(NULL) {}
00094
00095
00096 void CopyScores(Scores& scores, const TranslationOption& topt, ReorderingType reoType) const;
00097 void ClearScores(Scores& scores) const;
00098 int ComparePrevScores(const Scores *other) const;
00099
00100
00101 static const ReorderingType M = 0;
00102 static const ReorderingType NM = 1;
00103 static const ReorderingType S = 1;
00104 static const ReorderingType D = 2;
00105 static const ReorderingType DL = 2;
00106 static const ReorderingType DR = 3;
00107 static const ReorderingType R = 0;
00108 static const ReorderingType L = 1;
00109 };
00110
00111 class BidirectionalReorderingState : public LexicalReorderingState
00112 {
00113 private:
00114 const LexicalReorderingState *m_backward;
00115 const LexicalReorderingState *m_forward;
00116 public:
00117 BidirectionalReorderingState(const LexicalReorderingConfiguration &config, const LexicalReorderingState *bw, const LexicalReorderingState *fw, size_t offset) :
00118 LexicalReorderingState(config, LexicalReorderingConfiguration::Bidirectional, offset), m_backward(bw), m_forward(fw) {}
00119
00120 ~BidirectionalReorderingState() {
00121 delete m_backward;
00122 delete m_forward;
00123 }
00124
00125 virtual int Compare(const FFState& o) const;
00126 virtual LexicalReorderingState* Expand(const TranslationOption& topt, Scores& scores) const;
00127 };
00128
00131 class PhraseBasedReorderingState : public LexicalReorderingState
00132 {
00133 private:
00134 WordsRange m_prevRange;
00135 bool m_first;
00136 public:
00137 PhraseBasedReorderingState(const LexicalReorderingConfiguration &config, LexicalReorderingConfiguration::Direction dir, size_t offset);
00138 PhraseBasedReorderingState(const PhraseBasedReorderingState *prev, const TranslationOption &topt);
00139
00140 virtual int Compare(const FFState& o) const;
00141 virtual LexicalReorderingState* Expand(const TranslationOption& topt, Scores& scores) const;
00142
00143 ReorderingType GetOrientationTypeMSD(WordsRange currRange) const;
00144 ReorderingType GetOrientationTypeMSLR(WordsRange currRange) const;
00145 ReorderingType GetOrientationTypeMonotonic(WordsRange currRange) const;
00146 ReorderingType GetOrientationTypeLeftRight(WordsRange currRange) const;
00147 };
00148
00152 class HierarchicalReorderingBackwardState : public LexicalReorderingState
00153 {
00154 private:
00155 ReorderingStack m_reoStack;
00156 public:
00157 HierarchicalReorderingBackwardState(const LexicalReorderingConfiguration &config, size_t offset);
00158 HierarchicalReorderingBackwardState(const HierarchicalReorderingBackwardState *prev,
00159 const TranslationOption &topt, ReorderingStack reoStack);
00160
00161 virtual int Compare(const FFState& o) const;
00162 virtual LexicalReorderingState* Expand(const TranslationOption& hypo, Scores& scores) const;
00163
00164 private:
00165 ReorderingType GetOrientationTypeMSD(int reoDistance) const;
00166 ReorderingType GetOrientationTypeMSLR(int reoDistance) const;
00167 ReorderingType GetOrientationTypeMonotonic(int reoDistance) const;
00168 ReorderingType GetOrientationTypeLeftRight(int reoDistance) const;
00169 };
00170
00171
00173 class HierarchicalReorderingForwardState : public LexicalReorderingState
00174 {
00175 private:
00176 bool m_first;
00177 WordsRange m_prevRange;
00178 WordsBitmap m_coverage;
00179
00180 public:
00181 HierarchicalReorderingForwardState(const LexicalReorderingConfiguration &config, size_t sentenceLength, size_t offset);
00182 HierarchicalReorderingForwardState(const HierarchicalReorderingForwardState *prev, const TranslationOption &topt);
00183
00184 virtual int Compare(const FFState& o) const;
00185 virtual LexicalReorderingState* Expand(const TranslationOption& hypo, Scores& scores) const;
00186
00187 private:
00188 ReorderingType GetOrientationTypeMSD(WordsRange currRange, WordsBitmap coverage) const;
00189 ReorderingType GetOrientationTypeMSLR(WordsRange currRange, WordsBitmap coverage) const;
00190 ReorderingType GetOrientationTypeMonotonic(WordsRange currRange, WordsBitmap coverage) const;
00191 ReorderingType GetOrientationTypeLeftRight(WordsRange currRange, WordsBitmap coverage) const;
00192 };
00193
00194 }