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;
 
  147#ifdef USE_STATIC_TMINUIT 
  175   if (
this == &rhs) 
return *
this;  
 
  194      Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
 
  202#ifdef USE_FUMILI_FUNCTION 
  224      Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
 
  268   unsigned int ndata = 0;
 
  269   unsigned int npar = 0;
 
  282   std::vector<double> gf(npar);
 
  283   std::vector<double> hess(npar*(npar+1)/2);
 
  284   std::vector<double> 
h(npar*(npar+1)/2);
 
  287   for (
unsigned int ipar = 0; ipar < npar; ++ipar)
 
  294   std::cout << 
"=============================================";
 
  295   std::cout << 
"par = ";
 
  296   for (
unsigned int ipar = 0; ipar < npar; ++ipar)
 
  297      std::cout << 
x[ipar] << 
"\t";
 
  298   std::cout << std::endl;
 
  309      for (
unsigned int i = 0; i < ndata; ++i) {
 
  323         sum += 0.5 * fval * fval; 
 
  325         for (
unsigned int j = 0; j < npar; ++j) {
 
  326            grad[j] +=  fval * gf[j];
 
  327            for (
unsigned int k = j; k < npar; ++ k) {
 
  328               int idx =  j + k*(k+1)/2;
 
  330               hess[idx] += 0.5 * 
h[idx]; 
 
  343      for (
unsigned int i = 0; i < ndata; ++i) {
 
  358         for (
unsigned int j = 0; j < npar; ++j) {
 
  360            for (
unsigned int k = j; k < npar; ++ k) {
 
  361               int idx =  j + k*(k+1)/2;
 
  371      for (
unsigned int i = 0; i < ndata; ++i) {
 
  384         for (
unsigned int j = 0; j < npar; ++j) {
 
  387            for (
unsigned int k = j; k < npar; ++k) {
 
  388               int idx = j + k * (k + 1) / 2;
 
  389               hess[idx] += gfj * gf[k]; 
 
  394      Error(
"EvaluateFCN", 
" type of fit method is not supported, it must be chi2 or log-likelihood");
 
  401   assert(zmatrix != 0);
 
  405   for (
unsigned int i = 0; i < npar; ++i) {
 
  406         for (
unsigned int j = 0; j <= i; ++j) {
 
  407            if (pl0[i] > 0 && pl0[j] > 0) { 
 
  408               zmatrix[
l++] = hess[k];
 
  415   std::cout << 
"FCN value " << 
sum << 
" grad ";
 
  416   for (
unsigned int ipar = 0; ipar < npar; ++ipar)
 
  417      std::cout << grad[ipar] << 
"\t";
 
  418   std::cout << std::endl << std::endl;
 
  431      Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
 
  435   std::cout << 
"set variable " << ivar << 
" " << 
name << 
" value " << val << 
" step " << step << std::endl;
 
  440      Error(
"SetVariable",
"Error for parameter %d ",ivar);
 
  449      Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
 
  453   std::cout << 
"set limited variable " << ivar << 
" " << 
name << 
" value " << val << 
" step " << step << std::endl;
 
  457      Error(
"SetLimitedVariable",
"Error for parameter %d ",ivar);
 
  463bool Fumili2Minimizer::SetLowerLimitedVariable(
unsigned int ivar , 
const std::string & 
name , 
double val , 
double step , 
double lower ) {
 
  465   double s = val-lower;
 
  466   double upper = s*1.0E15;
 
  467   if (s != 0)  upper = 1.0E15;
 
  468   return SetLimitedVariable(ivar, 
name, val, step, lower,upper);
 
  476      Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
 
  485   std::cout << 
"Fix variable " << ivar << 
" " << 
name << 
" value " << std::endl;
 
  489      Error(
"SetFixedVariable",
"Error for parameter %d ",ivar);
 
  498      Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
 
  502   double  oldval, verr, vlow, vhigh = 0;
 
  505      Error(
"SetVariableValue",
"Error for parameter %d ",ivar);
 
  509   std::cout << 
"set variable " << ivar << 
" " << 
name << 
" value " 
  510             << val << 
" step " <<  verr << std::endl;
 
  515      Error(
"SetVariableValue",
"Error for parameter %d ",ivar);
 
  528      Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
 
  558      std::cout << 
"Minimize using TFumili with tolerance = " << 
Tolerance()
 
  585   assert (
static_cast<unsigned int>(ntot) == 
fDim);
 
  597   for (
unsigned int i = 0; i < 
fDim; ++i) {
 
  602         for (
unsigned int j = 0; j <=i ; ++j) {
 
  612   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
 
FunctionType::BaseFunc BaseFunction
 
virtual unsigned int NDim() const
Number of dimension (parameters) .
 
virtual void UpdateNCalls() const
update number of calls
 
Documentation for the abstract class IBaseFunctionMultiDim.
 
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
 
Interface (abstract class) for multi-dimensional functions providing a gradient calculation.
 
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
minimizer configuration parameters
 
Param Functor class for Multidimensional functions.
 
TFumiliMinimizer class: minimizer implementation based on TFumili.
 
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
 
TFumiliMinimizer & operator=(const TFumiliMinimizer &rhs)
Assignment operator.
 
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
 
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
 
static uint64_t sum(uint64_t i)