diff options
Diffstat (limited to 'python/cdec/py_scorer.h')
-rw-r--r-- | python/cdec/py_scorer.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/python/cdec/py_scorer.h b/python/cdec/py_scorer.h new file mode 100644 index 00000000..22dc9fee --- /dev/null +++ b/python/cdec/py_scorer.h @@ -0,0 +1,44 @@ +#include "ns.h" +#include "tdict.h" + +typedef float (*MetricScoreCallback)(void*, SufficientStats* stats); +typedef void (*MetricStatsCallback)(void*, + std::string *hyp, + std::vector<std::string> *refs, + SufficientStats* out); + +struct PythonEvaluationMetric : public EvaluationMetric { + + PythonEvaluationMetric(const std::string& id) : EvaluationMetric(id) {} + + static EvaluationMetric* Instance(const std::string& id, + void* obj, + MetricStatsCallback statscb, + MetricScoreCallback scorecb) { + PythonEvaluationMetric* metric = new PythonEvaluationMetric(id); + metric->pymetric = obj; + metric->_compute_score = scorecb; + metric->_compute_sufficient_stats = statscb; + return metric; + } + + float ComputeScore(const SufficientStats& stats) const { + SufficientStats stats_(stats); + return _compute_score(pymetric, &stats_); + } + + void ComputeSufficientStatistics(const std::vector<WordID>& hyp, + const std::vector<std::vector<WordID> >& refs, + SufficientStats* out) const { + std::string hyp_(TD::GetString(hyp)); + std::vector<std::string> refs_; + for(unsigned i = 0; i < refs.size(); ++i) { + refs_.push_back(TD::GetString(refs[i])); + } + _compute_sufficient_stats(pymetric, &hyp_, &refs_, out); + } + + void* pymetric; + MetricStatsCallback _compute_sufficient_stats; + MetricScoreCallback _compute_score; +}; |