| |
| |
| |
| |
| |
| |
|
|
| #include <boost/foreach.hpp> |
| #include <vector> |
| #include <cstddef> |
| #include <stdio.h> |
| #include "Scores.h" |
| #include "Weights.h" |
| #include "System.h" |
| #include "FF/FeatureFunction.h" |
| #include "FF/FeatureFunctions.h" |
| #include "legacy/Util2.h" |
|
|
| using namespace std; |
|
|
| namespace Moses2 |
| { |
|
|
| Scores::Scores(const System &system, MemPool &pool, size_t numScores) : |
| m_total(0) |
| { |
| if (system.options.nbest.nbest_size) { |
| m_scores = new (pool.Allocate<SCORE>(numScores)) SCORE[numScores]; |
| Init<SCORE>(m_scores, numScores, 0); |
| } else { |
| m_scores = NULL; |
| } |
| } |
|
|
| Scores::Scores(const System &system, MemPool &pool, size_t numScores, |
| const Scores &origScores) : |
| m_total(origScores.m_total) |
| { |
| if (system.options.nbest.nbest_size) { |
| m_scores = new (pool.Allocate<SCORE>(numScores)) SCORE[numScores]; |
| memcpy(m_scores, origScores.m_scores, sizeof(SCORE) * numScores); |
| } else { |
| m_scores = NULL; |
| } |
| } |
|
|
| Scores::~Scores() |
| { |
|
|
| } |
|
|
| const SCORE *Scores::GetScores(const FeatureFunction &featureFunction) const |
| { |
| assert(m_scores); |
| size_t ffStartInd = featureFunction.GetStartInd(); |
| const SCORE &scores = m_scores[ffStartInd]; |
| return &scores; |
| } |
|
|
| void Scores::Reset(const System &system) |
| { |
| if (system.options.nbest.nbest_size) { |
| size_t numScores = system.featureFunctions.GetNumScores(); |
| Init<SCORE>(m_scores, numScores, 0); |
| } |
| m_total = 0; |
| } |
|
|
| void Scores::PlusEquals(const System &system, |
| const FeatureFunction &featureFunction, const SCORE &score) |
| { |
| assert(featureFunction.GetNumScores() == 1); |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| if (system.options.nbest.nbest_size) { |
| m_scores[ffStartInd] += score; |
| } |
| SCORE weight = weights[ffStartInd]; |
| m_total += score * weight; |
| } |
|
|
| void Scores::PlusEquals(const System &system, |
| const FeatureFunction &featureFunction, const SCORE &score, size_t offset) |
| { |
| assert(offset < featureFunction.GetNumScores()); |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| if (system.options.nbest.nbest_size) { |
| m_scores[ffStartInd + offset] += score; |
| } |
| SCORE weight = weights[ffStartInd + offset]; |
| m_total += score * weight; |
| } |
|
|
| void Scores::PlusEquals(const System &system, |
| const FeatureFunction &featureFunction, const std::vector<SCORE> &scores) |
| { |
| assert(scores.size() == featureFunction.GetNumScores()); |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| for (size_t i = 0; i < scores.size(); ++i) { |
| SCORE incrScore = scores[i]; |
| if (system.options.nbest.nbest_size) { |
| m_scores[ffStartInd + i] += incrScore; |
| } |
| |
| SCORE weight = weights[ffStartInd + i]; |
| m_total += incrScore * weight; |
| } |
| } |
|
|
| void Scores::PlusEquals(const System &system, |
| const FeatureFunction &featureFunction, SCORE scores[]) |
| { |
| |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| for (size_t i = 0; i < featureFunction.GetNumScores(); ++i) { |
| SCORE incrScore = scores[i]; |
| if (system.options.nbest.nbest_size) { |
| m_scores[ffStartInd + i] += incrScore; |
| } |
| |
| SCORE weight = weights[ffStartInd + i]; |
| m_total += incrScore * weight; |
| } |
| } |
|
|
| void Scores::PlusEquals(const System &system, const Scores &other) |
| { |
| size_t numScores = system.featureFunctions.GetNumScores(); |
| if (system.options.nbest.nbest_size) { |
| for (size_t i = 0; i < numScores; ++i) { |
| m_scores[i] += other.m_scores[i]; |
| } |
| } |
| m_total += other.m_total; |
| } |
|
|
| void Scores::MinusEquals(const System &system, const Scores &other) |
| { |
| size_t numScores = system.featureFunctions.GetNumScores(); |
| if (system.options.nbest.nbest_size) { |
| for (size_t i = 0; i < numScores; ++i) { |
| m_scores[i] -= other.m_scores[i]; |
| } |
| } |
| m_total -= other.m_total; |
| } |
|
|
| void Scores::Assign(const System &system, |
| const FeatureFunction &featureFunction, const SCORE &score) |
| { |
| assert(featureFunction.GetNumScores() == 1); |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
|
|
| if (system.options.nbest.nbest_size) { |
| assert(m_scores[ffStartInd] == 0); |
| m_scores[ffStartInd] = score; |
| } |
| SCORE weight = weights[ffStartInd]; |
| m_total += score * weight; |
|
|
| } |
|
|
| void Scores::Assign(const System &system, |
| const FeatureFunction &featureFunction, const std::vector<SCORE> &scores) |
| { |
| assert(scores.size() == featureFunction.GetNumScores()); |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| for (size_t i = 0; i < scores.size(); ++i) { |
| SCORE incrScore = scores[i]; |
|
|
| if (system.options.nbest.nbest_size) { |
| assert(m_scores[ffStartInd + i] == 0); |
| m_scores[ffStartInd + i] = incrScore; |
| } |
| |
| SCORE weight = weights[ffStartInd + i]; |
| m_total += incrScore * weight; |
| } |
| } |
|
|
| void Scores::CreateFromString(const std::string &str, |
| const FeatureFunction &featureFunction, const System &system, |
| bool transformScores) |
| { |
| vector<SCORE> scores = Tokenize<SCORE>(str); |
| if (transformScores) { |
| std::transform(scores.begin(), scores.end(), scores.begin(), |
| TransformScore); |
| std::transform(scores.begin(), scores.end(), scores.begin(), FloorScore); |
| } |
|
|
| |
| |
| |
| |
|
|
| PlusEquals(system, featureFunction, scores); |
| } |
|
|
| std::string Scores::Debug(const System &system) const |
| { |
| stringstream out; |
| out << "total=" << m_total; |
|
|
| if (system.options.nbest.nbest_size) { |
| out << ", "; |
| BOOST_FOREACH(const FeatureFunction *ff, system.featureFunctions.GetFeatureFunctions()) { |
| out << ff->GetName() << "= "; |
| for (size_t i = ff->GetStartInd(); i < (ff->GetStartInd() + ff->GetNumScores()); ++i) { |
| out << m_scores[i] << " "; |
| } |
| } |
| } |
|
|
| return out.str(); |
| } |
|
|
| void Scores::OutputBreakdown(std::ostream &out, const System &system) const |
| { |
| if (system.options.nbest.nbest_size) { |
| BOOST_FOREACH(const FeatureFunction *ff, system.featureFunctions.GetFeatureFunctions()) { |
| if (ff->IsTuneable()) { |
| out << ff->GetName() << "= "; |
| for (size_t i = ff->GetStartInd(); i < (ff->GetStartInd() + ff->GetNumScores()); ++i) { |
| out << m_scores[i] << " "; |
| } |
| } |
| } |
| } |
| } |
|
|
| |
| SCORE Scores::CalcWeightedScore(const System &system, |
| const FeatureFunction &featureFunction, SCORE scores[]) |
| { |
| SCORE ret = 0; |
|
|
| const Weights &weights = system.weights; |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| for (size_t i = 0; i < featureFunction.GetNumScores(); ++i) { |
| SCORE incrScore = scores[i]; |
|
|
| |
| SCORE weight = weights[ffStartInd + i]; |
| ret += incrScore * weight; |
| } |
|
|
| return ret; |
| } |
|
|
| SCORE Scores::CalcWeightedScore(const System &system, |
| const FeatureFunction &featureFunction, SCORE score) |
| { |
| const Weights &weights = system.weights; |
| assert(featureFunction.GetNumScores() == 1); |
|
|
| size_t ffStartInd = featureFunction.GetStartInd(); |
| SCORE weight = weights[ffStartInd]; |
| SCORE ret = score * weight; |
|
|
| return ret; |
| } |
|
|
| } |
|
|
|
|