R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BHuberRegression.h
Go to the documentation of this file.
1#pragma once
2
3#include "R3BValueError.h"
4#include <Math/Factory.h>
5#include <Math/Minimizer.h>
6#include <cstddef>
7#include <fmt/base.h>
8#include <memory>
9#include <span>
10#include <utility>
11#include <vector>
12
13namespace R3B
14{
16 {
17 static constexpr auto DEFAULT_TOLERANCE = 0.01;
18 static constexpr auto DEFAULT_EPSILON = 1.35;
19 static constexpr auto DEFAULT_REG_RATE = 0.0001;
20
21 struct ParConfig
22 {
23 ParConfig() = default;
24 double init = 0.;
25 double learning_rate = 1.;
26 };
28
34 };
35
37 {
38 public:
39 struct Result
40 {
41 bool is_success = false;
42 int iteration = 0;
43 std::size_t n_data = 0;
46 };
48 static constexpr auto DEFAULT_SIGMA = 20;
49
50 explicit HuberRegressor(
51 Config config = Config{},
52 std::unique_ptr<ROOT::Math::Minimizer> minimizer = std::unique_ptr<ROOT::Math::Minimizer>{
53 ROOT::Math::Factory::CreateMinimizer("Minuit2") });
54
55 auto train_from_data(const std::vector<double>& x_vals, const std::vector<double>& y_vals) -> bool;
56 auto calculate_p_value(const std::vector<double>& y_errs, double scale = 1.) -> double;
57 void reset_parameters();
58
59 auto get_config_ref() -> Config& { return config_; }
60 [[nodiscard]] auto get_result() const -> const Result& { return result_; }
61 [[nodiscard]] auto check_outlier(double x_val, double y_val) const -> std::pair<bool, double>;
62 [[nodiscard]] auto check_outlier(double x_val, double y_val, const std::pair<double, double>& weight_bias) const
63 -> std::pair<bool, double>;
64
65 private:
66 static constexpr auto n_pars = 2;
70 std::span<const double> x_vals_;
71 std::span<const double> y_vals_;
72 std::unique_ptr<ROOT::Math::Minimizer> minimizer_;
73
74 auto calculate_loss(const double* raw_pars) -> double;
75 void set_par_values(const double* raw_pars_ptr);
76 void set_par_errors(const double* raw_error_ptr);
77 };
78
79} // namespace R3B
80
81#ifndef __CLING__
82
83template <>
84class fmt::formatter<R3B::HuberRegressor::Result>
85{
86 public:
87 static constexpr auto parse(format_parse_context& ctx) { return ctx.end(); }
88 template <typename FmtContent>
89 constexpr auto format(const R3B::HuberRegressor::Result& result, FmtContent& ctn) const
90 {
91 return fmt::format_to(ctn.out(),
92 "{{iteration: {}, weight: {}, bias: {}, is_success: {}}}",
93 result.iteration,
94 result.weight,
95 result.bias,
96 result.is_success);
97 }
98};
99#endif
HuberRegressor(Config config=Config{}, std::unique_ptr< ROOT::Math::Minimizer > minimizer=std::unique_ptr< ROOT::Math::Minimizer >{ ROOT::Math::Factory::CreateMinimizer("Minuit2") })
std::unique_ptr< ROOT::Math::Minimizer > minimizer_
auto get_result() const -> const Result &
auto train_from_data(const std::vector< double > &x_vals, const std::vector< double > &y_vals) -> bool
std::span< const double > x_vals_
static constexpr auto n_pars
std::span< const double > y_vals_
void set_par_errors(const double *raw_error_ptr)
auto check_outlier(double x_val, double y_val) const -> std::pair< bool, double >
auto calculate_p_value(const std::vector< double > &y_errs, double scale=1.) -> double
void set_par_values(const double *raw_pars_ptr)
auto calculate_loss(const double *raw_pars) -> double
HuberRegressorConfig Config
static constexpr auto DEFAULT_SIGMA
auto get_config_ref() -> Config &
constexpr auto format(const R3B::HuberRegressor::Result &result, FmtContent &ctn) const
static constexpr auto parse(format_parse_context &ctx)
ValueError< double > ValueErrorD
static constexpr auto DEFAULT_EPSILON
static constexpr auto DEFAULT_REG_RATE
static constexpr auto DEFAULT_TOLERANCE