00001 #include <vector>
00002 #include "NieceTerminal.h"
00003 #include "moses/ScoreComponentCollection.h"
00004 #include "moses/TargetPhrase.h"
00005 #include "moses/ChartCellLabel.h"
00006 #include "moses/InputType.h"
00007
00008 using namespace std;
00009
00010 namespace Moses
00011 {
00012 NieceTerminal::NieceTerminal(const std::string &line)
00013 :StatelessFeatureFunction(line,true)
00014 ,m_hardConstraint(false)
00015 {
00016 ReadParameters();
00017 }
00018
00019 std::vector<float> NieceTerminal::DefaultWeights() const
00020 {
00021 UTIL_THROW_IF2(m_numScoreComponents != 1,
00022 "NieceTerminal must only have 1 score");
00023 vector<float> ret(1, 1);
00024 return ret;
00025 }
00026
00027 void NieceTerminal::EvaluateInIsolation(const Phrase &source
00028 , const TargetPhrase &targetPhrase
00029 , ScoreComponentCollection &scoreBreakdown
00030 , ScoreComponentCollection &estimatedScores) const
00031 {
00032 targetPhrase.SetRuleSource(source);
00033 }
00034
00035 void NieceTerminal::EvaluateWithSourceContext(const InputType &input
00036 , const InputPath &inputPath
00037 , const TargetPhrase &targetPhrase
00038 , const StackVec *stackVec
00039 , ScoreComponentCollection &scoreBreakdown
00040 , ScoreComponentCollection *estimatedScores) const
00041 {
00042 assert(stackVec);
00043
00044 const Phrase *ruleSource = targetPhrase.GetRuleSource();
00045 assert(ruleSource);
00046
00047 boost::unordered_set<Word> terms;
00048 for (size_t i = 0; i < ruleSource->GetSize(); ++i) {
00049 const Word &word = ruleSource->GetWord(i);
00050 if (!word.IsNonTerminal()) {
00051 terms.insert(word);
00052 }
00053 }
00054
00055 for (size_t i = 0; i < stackVec->size(); ++i) {
00056 const ChartCellLabel &cell = *stackVec->at(i);
00057 const Range &ntRange = cell.GetCoverage();
00058 bool containTerm = ContainTerm(input, ntRange, terms);
00059
00060 if (containTerm) {
00061
00062
00063
00064
00065 float score = m_hardConstraint ? - std::numeric_limits<float>::infinity() : 1;
00066 scoreBreakdown.PlusEquals(this, score);
00067 return;
00068 }
00069 }
00070
00071 }
00072
00073 void NieceTerminal::EvaluateWhenApplied(const Hypothesis& hypo,
00074 ScoreComponentCollection* accumulator) const
00075 {}
00076
00077 void NieceTerminal::EvaluateWhenApplied(const ChartHypothesis &hypo,
00078 ScoreComponentCollection* accumulator) const
00079 {}
00080
00081 bool NieceTerminal::ContainTerm(const InputType &input,
00082 const Range &ntRange,
00083 const boost::unordered_set<Word> &terms) const
00084 {
00085 boost::unordered_set<Word>::const_iterator iter;
00086
00087 for (size_t pos = ntRange.GetStartPos(); pos <= ntRange.GetEndPos(); ++pos) {
00088 const Word &word = input.GetWord(pos);
00089 iter = terms.find(word);
00090
00091 if (iter != terms.end()) {
00092 return true;
00093 }
00094 }
00095 return false;
00096 }
00097
00098 void NieceTerminal::SetParameter(const std::string& key, const std::string& value)
00099 {
00100 if (key == "hard-constraint") {
00101 m_hardConstraint = Scan<bool>(value);
00102 } else {
00103 StatelessFeatureFunction::SetParameter(key, value);
00104 }
00105 }
00106
00107
00108 }
00109
00110