35#ifdef USE_FUMILI_FUNCTION
46template<
class MethodFunc>
57 fObjFunc =
dynamic_cast<const MethodFunc *
>(func);
58 assert(fObjFunc != 0);
62 fFumili->SetUserFunc(fModFunc);
67 FumiliFunction * Clone()
const {
return new FumiliFunction(fFumili, fObjFunc); }
71 double DataElement(
const double * ,
unsigned int i,
double *
g,
double *)
const {
76 unsigned int npar = fObjFunc->NDim();
79 const double *
x = fObjFunc->Data().GetPoint(i,
y,invError);
80 double fval = fFumili->EvalTFN(
g,
const_cast<double *
>(
x));
81 fFumili->Derivatives(
g,
const_cast<double *
>(
x));
85 for (
unsigned int k = 0; k < npar; ++k) {
86 g[k] *= (
y/fval - 1.) ;
92 double resVal = (
y-fval)*invError;
93 for (
unsigned int k = 0; k < npar; ++k) {
105 double DoEval(
const double *
x )
const {
106 return (*fObjFunc)(
x);
110 const MethodFunc * fObjFunc;
146#ifdef USE_STATIC_TMINUIT
187 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
201 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
209#ifdef USE_FUMILI_FUNCTION
254 unsigned int ndata = 0;
255 unsigned int npar = 0;
268 std::vector<double> gf(npar);
269 std::vector<double> hess(npar*(npar+1)/2);
270 std::vector<double>
h(npar*(npar+1)/2);
273 for (
unsigned int ipar = 0; ipar < npar; ++ipar)
280 std::cout <<
"=============================================";
281 std::cout <<
"par = ";
282 for (
unsigned int ipar = 0; ipar < npar; ++ipar)
283 std::cout <<
x[ipar] <<
"\t";
284 std::cout << std::endl;
295 for (
unsigned int i = 0; i < ndata; ++i) {
309 sum += 0.5 * fval * fval;
311 for (
unsigned int j = 0; j < npar; ++j) {
312 grad[j] += fval * gf[j];
313 for (
unsigned int k = j; k < npar; ++ k) {
314 int idx = j + k*(k+1)/2;
316 hess[idx] += 0.5 *
h[idx];
329 for (
unsigned int i = 0; i < ndata; ++i) {
344 for (
unsigned int j = 0; j < npar; ++j) {
346 for (
unsigned int k = j; k < npar; ++ k) {
347 int idx = j + k*(k+1)/2;
357 for (
unsigned int i = 0; i < ndata; ++i) {
370 for (
unsigned int j = 0; j < npar; ++j) {
373 for (
unsigned int k = j; k < npar; ++k) {
374 int idx = j + k * (k + 1) / 2;
375 hess[idx] += gfj * gf[k];
380 Error(
"EvaluateFCN",
" type of fit method is not supported, it must be chi2 or log-likelihood");
387 assert(zmatrix !=
nullptr);
388 assert(pl0 !=
nullptr);
391 for (
unsigned int i = 0; i < npar; ++i) {
392 for (
unsigned int j = 0; j <= i; ++j) {
393 if (pl0[i] > 0 && pl0[j] > 0) {
394 zmatrix[
l++] = hess[k];
401 std::cout <<
"FCN value " <<
sum <<
" grad ";
402 for (
unsigned int ipar = 0; ipar < npar; ++ipar)
403 std::cout << grad[ipar] <<
"\t";
404 std::cout << std::endl << std::endl;
419 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
423 std::cout <<
"set variable " << ivar <<
" " <<
name <<
" value " << val <<
" step " << step << std::endl;
428 Error(
"SetVariable",
"Error for parameter %d ",ivar);
437 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
441 std::cout <<
"set limited variable " << ivar <<
" " <<
name <<
" value " << val <<
" step " << step << std::endl;
445 Error(
"SetLimitedVariable",
"Error for parameter %d ",ivar);
451bool Fumili2Minimizer::SetLowerLimitedVariable(
unsigned int ivar ,
const std::string &
name ,
double val ,
double step ,
double lower ) {
453 double s = val-lower;
454 double upper = s*1.0E15;
455 if (s != 0) upper = 1.0E15;
456 return SetLimitedVariable(ivar,
name, val, step, lower,upper);
464 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
473 std::cout <<
"Fix variable " << ivar <<
" " <<
name <<
" value " << std::endl;
477 Error(
"SetFixedVariable",
"Error for parameter %d ",ivar);
486 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
490 double oldval, verr, vlow, vhigh = 0;
493 Error(
"SetVariableValue",
"Error for parameter %d ",ivar);
497 std::cout <<
"set variable " << ivar <<
" " <<
name <<
" value "
498 << val <<
" step " << verr << std::endl;
503 Error(
"SetVariableValue",
"Error for parameter %d ",ivar);
516 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
552 std::cout <<
"Minimize using TFumili with tolerance = " <<
Tolerance()
582 assert (
static_cast<unsigned int>(ntot) ==
fDim);
594 for (
unsigned int i = 0; i <
fDim; ++i) {
599 for (
unsigned int j = 0; j <=i ; ++j) {
609 return (iret==0) ? true :
false;
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Chi2FCN class for binned fits using the least square methods.
class evaluating the log likelihood for binned Poisson likelihood fits it is template to distinguish ...
FitMethodFunction class Interface for objective functions (like chi2 and likelihood used in the fit) ...
virtual Type_t Type() const
return the type of method, override if needed
Type_t
enumeration specifying the possible fit method types
virtual double DataElement(const double *x, unsigned int i, double *g=nullptr, double *h=nullptr, bool fullHessian=false) const =0
method returning the data i-th contribution to the fit objective function For example the residual fo...
virtual unsigned int NPoints() const
return the number of data points used in evaluating the function
unsigned int NDim() const override
Number of dimension (parameters) .
FunctionType::BaseFunc BaseFunction
virtual void UpdateNCalls() const
update number of calls
Documentation for the abstract class IBaseFunctionMultiDim.
virtual bool HasGradient() const
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
double Tolerance() const
Absolute tolerance.
unsigned int MaxFunctionCalls() const
Max number of function calls.
int fStatus
status of minimizer
int PrintLevel() const
Set print level.
Param Functor class for Multidimensional functions.
static ROOT::Math::FitMethodFunction * fgFunc
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
TFumiliMinimizer(int dummy=0)
Default constructor (an argument is needed by plug-in manager)
std::vector< double > fParams
bool SetLimitedVariable(unsigned int ivar, const std::string &name, double val, double step, double, double) override
set upper/lower limited variable (override if minimizer supports them )
static double EvaluateFCN(const double *x, double *g)
implementation of FCN for Fumili when user provided gradient is used
~TFumiliMinimizer() override
Destructor (no operations)
bool Minimize() override
method to perform the minimization
static ROOT::Math::FitMethodGradFunction * fgGradFunc
static TFumili * fgFumili
bool SetVariableValue(unsigned int ivar, double val) override
set the value of an existing variable
std::vector< double > fErrors
std::vector< double > fCovar
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
bool SetVariable(unsigned int ivar, const std::string &name, double val, double step) override
set free variable
static void Fcn(int &, double *, double &f, double *, int)
implementation of FCN for Fumili
Double_t GetParameter(Int_t ipar) const override
Return current value of parameter ipar.
Double_t GetParError(Int_t ipar) const override
Return error of parameter ipar.
Bool_t IsFixed(Int_t ipar) const override
Return kTRUE if parameter ipar is fixed, kFALSE otherwise)
Int_t ExecuteCommand(const char *command, Double_t *args, Int_t nargs) override
Execute MINUIT commands.
void PrintResults(Int_t k, Double_t p) const override
Prints fit results.
Int_t GetNumberFreeParameters() const override
Return the number of free parameters.
Double_t * GetCovarianceMatrix() const override
Return a pointer to the covariance matrix.
Int_t GetStats(Double_t &amin, Double_t &edm, Double_t &errdef, Int_t &nvpar, Int_t &nparx) const override
Return global fit parameters.
const char * GetParName(Int_t ipar) const override
Return name of parameter ipar.
void FixParameter(Int_t ipar) override
Fixes parameter number ipar.
Double_t * GetPL0() const
void SetParNumber(Int_t ParNum)
Int_t SetParameter(Int_t ipar, const char *parname, Double_t value, Double_t verr, Double_t vlow, Double_t vhigh) override
Sets for parameter number ipar initial parameter value, name parname, initial error verr and limits v...
virtual void SetFCN(void(*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t))
To set the address of the minimization objective function called by the native compiler (see function...
Namespace for new Math classes and functions.
T EvalLog(T x)
safe evaluation of log(x) with a protections against negative or zero argument to the log smooth line...
BasicFitMethodFunction< ROOT::Math::IMultiGenFunction > FitMethodFunction
static uint64_t sum(uint64_t i)