00001
00002
00003
00004
00005
00006
00007 #pragma once
00008 #include <vector>
00009 #include "Phrase.h"
00010 #include "RulePhrase.h"
00011 #include "Property.h"
00012 #include "moses/TypeDef.h"
00013
00014 class ConsistentPhrase;
00015 class AlignedSentence;
00016 class NonTerm;
00017 class Parameter;
00018
00019
00020 class Rule
00021 {
00022 public:
00023 typedef std::set<std::pair<int,int> > Alignments;
00024 typedef std::vector<Property> Properties;
00025
00026 Rule(const Rule ©);
00027
00028
00029 Rule(const NonTerm &lhsNonTerm, const AlignedSentence &alignedSentence);
00030
00031
00032 Rule(const Rule ©, const NonTerm &nonTerm);
00033
00034 virtual ~Rule();
00035
00036 bool IsValid() const {
00037 return m_isValid;
00038 }
00039
00040 bool CanRecurse() const {
00041 return m_canRecurse;
00042 }
00043
00044 const NonTerm &GetLHS() const {
00045 return m_lhs;
00046 }
00047
00048 const ConsistentPhrase &GetConsistentPhrase() const;
00049
00050 int GetNextSourcePosForNonTerm() const;
00051
00052 void SetCount(float count) {
00053 m_count = count;
00054 }
00055 float GetCount() const {
00056 return m_count;
00057 }
00058
00059 const Alignments &GetAlignments() const {
00060 return m_alignments;
00061 }
00062
00063 const Properties &GetProperties() const {
00064 return m_properties;
00065 }
00066
00067 std::string Debug() const;
00068 void Output(std::ostream &out, bool forward) const;
00069
00070 void Prevalidate(const Parameter ¶ms);
00071 void CreateTarget(const Parameter ¶ms);
00072 void CreateProperties(const Parameter ¶ms);
00073
00074 const RulePhrase &GetPhrase(Moses::FactorDirection direction) const {
00075 return (direction == Moses::Input) ? m_source : m_target;
00076 }
00077
00078 protected:
00079 const NonTerm &m_lhs;
00080 const AlignedSentence &m_alignedSentence;
00081 RulePhrase m_source, m_target;
00082 float m_count;
00083
00084 Alignments m_alignments;
00085
00086
00087 std::vector<const NonTerm*> m_nonterms;
00088
00089 bool m_isValid, m_canRecurse;
00090
00091
00092 Properties m_properties;
00093
00094 void CreateSource();
00095 void CreateAlignments();
00096 void CreateAlignments(int sourcePos, const std::set<const Word *> &targetWords);
00097 void CreateAlignments(int sourcePos, const RuleSymbol *targetSought);
00098
00099 bool ContainTerm(const ConsistentPhrase &cp, const std::set<const Word*> &terms) const;
00100 int GetScope(const Parameter ¶ms) const;
00101
00102 void NonTermContext(int sourceTarget, int factors, size_t ntInd, const ConsistentPhrase &cp, std::ostream &out) const;
00103
00104
00105 void NonTermContextFactor(int factor, const Word &word, std::ostream &out) const;
00106
00107 };
00108