10#ifndef ROOT_Minuit2_FumiliFCNAdapter
11#define ROOT_Minuit2_FumiliFCNAdapter
42template <
class Function>
47 typedef typename Function::Type_t
Type_t;
53 double operator()(
const std::vector<double> &
v)
const override {
return fFunc.operator()(&
v[0]); }
55 double Up()
const override {
return fUp; }
76template <
class Function>
79 MnPrint print(
"FumiliFCNAdapter");
84 unsigned int npar = Dimension();
86 print.
Error(
"npar",
npar,
"v.size()",
v.size());
90 std::vector<double> &grad = Gradient();
91 std::vector<double> &
hess = Hessian();
94 grad.assign(
npar, 0.0);
97 unsigned int ndata = fFunc.NPoints();
99 std::vector<double>
gf(
npar);
100 std::vector<double>
h(
hess.size());
105 if (fFunc.Type() == Function::kLeastSquare) {
106 print.
Debug(
"Chi2 FCN: Evaluate gradient and Hessian");
108 for (
unsigned int i = 0; i <
ndata; ++i) {
110 double fval = fFunc.DataElement(&
v.front(), i, &
gf[0]);
112 for (
unsigned int j = 0;
j <
npar; ++
j) {
114 for (
unsigned int k =
j; k <
npar; ++k) {
115 int idx =
j + k * (k + 1) / 2;
120 }
else if (fFunc.Type() == Function::kLogLikelihood) {
121 print.
Debug(
"LogLikelihood FCN: Evaluate gradient and Hessian");
122 for (
unsigned int i = 0; i <
ndata; ++i) {
125 fFunc.DataElement(&
v.front(), i, &
gf[0]);
127 for (
unsigned int j = 0;
j <
npar; ++
j) {
130 for (
unsigned int k =
j; k <
npar; ++k) {
131 int idx =
j + k * (k + 1) / 2;
136 }
else if (fFunc.Type() == Function::kPoissonLikelihood) {
137 print.
Debug(
"Poisson Likelihood FCN: Evaluate gradient and Hessian");
139 for (
unsigned int i = 0; i <
ndata; ++i) {
141 fFunc.DataElement(&
v.front(), i,
gf.data(),
h.data());
142 for (
size_t j = 0;
j <
npar; ++
j) {
144 for (
unsigned int k =
j; k <
npar; ++k) {
145 int idx =
j + k * (k + 1) / 2;
151 print.
Error(
"Type of fit method is not supported, it must be chi2 or log-likelihood or Poisson Likelihood");
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Double_t(* Function)(Double_t)
template wrapped class for adapting to FumiliFCNBase signature
double Up() const override
Error definition of the function.
double operator()(const double *v) const
void SetErrorDef(double up) override
add interface to set dynamically a new error definition Re-implement this function if needed.
void EvaluateAll(const std::vector< double > &v) override
evaluate gradient hessian and function value needed by fumili
double operator()(const std::vector< double > &v) const override
The meaning of the vector of parameters is of course defined by the user, who uses the values of thos...
FumiliFCNAdapter(const Function &f, unsigned int ndim, double up=1.)
~FumiliFCNAdapter() override
Extension of the FCNBase for the Fumili method.
void Debug(const Ts &... args)
void Error(const Ts &... args)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...