10#ifndef ROOT_Minuit2_FumiliFCNAdapter
11#define ROOT_Minuit2_FumiliFCNAdapter
42template <
class Function>
47 typedef typename Function::Type_t
Type_t;
51 double operator()(std::vector<double>
const &
v)
const override {
return fFunc.operator()(&
v[0]); }
53 double Up()
const override {
return fUp; }
72template <
class Function>
75 MnPrint print(
"FumiliFCNAdapter");
78 unsigned int npar = Dimension();
80 print.
Error(
"npar", npar,
"v.size()",
v.size());
81 assert(npar ==
v.size());
84 std::vector<double> &grad = Gradient();
85 std::vector<double> &hess = Hessian();
87 assert(grad.size() == npar);
88 grad.assign(npar, 0.0);
89 hess.assign(hess.size(), 0.0);
91 unsigned int ndata = fFunc.NPoints();
93 std::vector<double> gf(npar);
94 std::vector<double>
h(hess.size());
99 if (fFunc.Type() == Function::kLeastSquare) {
100 print.
Debug(
"Chi2 FCN: Evaluate gradient and Hessian");
102 for (
unsigned int i = 0; i < ndata; ++i) {
104 double fval = fFunc.DataElement(&
v.front(), i, &gf[0]);
106 for (
unsigned int j = 0; j < npar; ++j) {
107 grad[j] += 2. * fval * gf[j];
108 for (
unsigned int k = j; k < npar; ++k) {
109 int idx = j + k * (k + 1) / 2;
110 hess[idx] += 2.0 * gf[j] * gf[k];
114 }
else if (fFunc.Type() == Function::kLogLikelihood) {
115 print.
Debug(
"LogLikelihood FCN: Evaluate gradient and Hessian");
116 for (
unsigned int i = 0; i < ndata; ++i) {
119 fFunc.DataElement(&
v.front(), i, &gf[0]);
121 for (
unsigned int j = 0; j < npar; ++j) {
124 for (
unsigned int k = j; k < npar; ++k) {
125 int idx = j + k * (k + 1) / 2;
126 hess[idx] += gfj * gf[k];
130 }
else if (fFunc.Type() == Function::kPoissonLikelihood) {
131 print.
Debug(
"Poisson Likelihood FCN: Evaluate gradient and Hessian");
133 for (
unsigned int i = 0; i < ndata; ++i) {
135 fFunc.DataElement(&
v.front(), i, gf.data(),
h.data());
136 for (
size_t j = 0; j < npar; ++j) {
138 for (
unsigned int k = j; k < npar; ++k) {
139 int idx = j + k * (k + 1) / 2;
145 print.
Error(
"Type of fit method is not supported, it must be chi2 or log-likelihood or Poisson Likelihood");
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(std::vector< double > const &v) override
evaluate gradient hessian and function value needed by fumili
FumiliFCNAdapter(const Function &f, unsigned int ndim, double up=1.)
double operator()(std::vector< double > const &v) const override
The meaning of the vector of parameters is of course defined by the user, who uses the values of thos...
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...