23 const std::function<double(
double)> l1_norm = [](
double term) {
return std::abs(term); };
24 const std::function<double(
double)> l2_norm = [](
double term) {
return term * term; };
26 const std::map<std::string, std::function<std::unique_ptr<ObjectiveMetric>()>> metric_factory = {
27 {
"chi2", []() {
return std::make_unique<Chi2Metric>(); }},
28 {
"poisson-like", []() {
return std::make_unique<PoissonLikeMetric>(); }},
29 {
"log", []() {
return std::make_unique<LogMetric>(); }},
30 {
"reldiff", []() {
return std::make_unique<RelativeDifferenceMetric>(); }},
31 {
"rq4", []() {
return std::make_unique<RQ4Metric>(); }}};
32 const std::string default_metric_name =
"poisson-like";
34 const std::map<std::string, std::function<double(
double)>> norm_factory = {{
"l1", l1_norm},
36 const std::string default_norm_name =
"l2";
38 template <
class U> std::vector<std::string> keys(
const std::map<std::string, U>& map)
40 std::vector<std::string> result;
41 result.reserve(map.size());
42 for (
auto& item : map)
43 result.push_back(item.first);
66 std::transform(metric.begin(), metric.end(), metric.begin(), ::tolower);
67 std::transform(norm.begin(), norm.end(), norm.begin(), ::tolower);
68 const auto metric_iter = metric_factory.find(metric);
69 const auto norm_iter = norm_factory.find(norm);
70 if (metric_iter == metric_factory.end() || norm_iter == norm_factory.end()) {
72 ss <<
"Error in ObjectiveMetricUtils::createMetric: either metric (" << metric
73 <<
") or norm (" << norm <<
") name is unknown.\n";
75 throw std::runtime_error(ss.str());
78 auto result = metric_iter->second();
79 result->setNorm(norm_iter->second);
86 ss <<
"Available metrics:\n";
88 ss <<
"\t" << item <<
"\n";
90 ss <<
"Available norms:\n";
92 ss <<
"\t" << item <<
"\n";
99 return keys(norm_factory);
104 return keys(metric_factory);
109 return default_norm_name;
114 return default_metric_name;
Defines ObjectiveMetric utilities and corresponding namespace.
Defines ObjectiveMetric classes.
const std::function< double(double)> l2Norm()
Returns L2 normalization function.
std::string defaultMetricName()
Returns default metric name.
std::string defaultNormName()
Returns default norm name.
std::string availableMetricOptions()
Prints available metric options.
std::unique_ptr< ObjectiveMetric > createMetric(const std::string &metric)
Creates the specified metric with the default norm.
std::vector< std::string > metricNames()
Returns the names of the objective metrics used.
const std::function< double(double)> l1Norm()
Returns L1 normalization function.
std::vector< std::string > normNames()
Returns the names of the norms used by ObjectiveMetric.