35#ifdef USE_FUMILI_FUNCTION
46template<
class MethodFunc>
57 fObjFunc =
dynamic_cast<const MethodFunc *
>(func);
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) {
93 for (
unsigned int k = 0; k <
npar; ++k) {
105 double DoEval(
const double *
x )
const {
106 return (*fObjFunc)(
x);
147#ifdef USE_STATIC_TMINUIT
188 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
202 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
210#ifdef USE_FUMILI_FUNCTION
255 unsigned int ndata = 0;
256 unsigned int npar = 0;
269 std::vector<double>
gf(
npar);
274 for (
unsigned int ipar = 0; ipar <
npar; ++ipar)
281 std::cout <<
"=============================================";
282 std::cout <<
"par = ";
283 for (
unsigned int ipar = 0; ipar <
npar; ++ipar)
284 std::cout <<
x[ipar] <<
"\t";
285 std::cout << std::endl;
286 if (
fgFunc) std::cout <<
"type " <<
fgFunc->Type() << std::endl;
296 for (
unsigned int i = 0; i <
ndata; ++i) {
312 for (
unsigned int j = 0;
j <
npar; ++
j) {
314 for (
unsigned int k =
j; k <
npar; ++ k) {
315 int idx =
j + k*(k+1)/2;
317 hess[idx] += 0.5 *
h[idx];
330 for (
unsigned int i = 0; i <
ndata; ++i) {
345 for (
unsigned int j = 0;
j <
npar; ++
j) {
347 for (
unsigned int k =
j; k <
npar; ++ k) {
348 int idx =
j + k*(k+1)/2;
358 for (
unsigned int i = 0; i <
ndata; ++i) {
371 for (
unsigned int j = 0;
j <
npar; ++
j) {
374 for (
unsigned int k =
j; k <
npar; ++k) {
375 int idx =
j + k * (k + 1) / 2;
381 Error(
"EvaluateFCN",
" type of fit method is not supported, it must be chi2 or log-likelihood");
392 for (
unsigned int i = 0; i <
npar; ++i) {
393 for (
unsigned int j = 0;
j <= i; ++
j) {
394 if (
pl0[i] > 0 &&
pl0[
j] > 0) {
402 std::cout <<
"FCN value " <<
sum <<
" grad ";
403 for (
unsigned int ipar = 0; ipar <
npar; ++ipar)
404 std::cout << grad[ipar] <<
"\t";
405 std::cout << std::endl << std::endl;
420 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
424 std::cout <<
"set variable " <<
ivar <<
" " <<
name <<
" value " << val <<
" step " << step << std::endl;
429 Error(
"SetVariable",
"Error for parameter %d ",
ivar);
438 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
442 std::cout <<
"set limited variable " <<
ivar <<
" " <<
name <<
" value " << val <<
" step " << step << std::endl;
446 Error(
"SetLimitedVariable",
"Error for parameter %d ",
ivar);
452bool Fumili2Minimizer::SetLowerLimitedVariable(
unsigned int ivar ,
const std::string &
name ,
double val ,
double step ,
double lower ) {
454 double s = val-
lower;
455 double upper = s*1.0E15;
456 if (s != 0)
upper = 1.0E15;
464 if (fFumili ==
nullptr) {
465 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
470 int ierr = fFumili->SetParameter(
ivar,
name.c_str(), val, 0., val, val );
471 fFumili->FixParameter(
ivar);
474 std::cout <<
"Fix variable " <<
ivar <<
" " <<
name <<
" value " << std::endl;
478 Error(
"SetFixedVariable",
"Error for parameter %d ",
ivar);
486 if (fFumili ==
nullptr) {
487 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
494 Error(
"SetVariableValue",
"Error for parameter %d ",
ivar);
498 std::cout <<
"set variable " <<
ivar <<
" " <<
name <<
" value "
499 << val <<
" step " <<
verr << std::endl;
504 Error(
"SetVariableValue",
"Error for parameter %d ",
ivar);
516 if (fFumili ==
nullptr) {
517 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
538 fFumili->ExecuteCommand(
"SET NOW",
arglist,0);
540 fFumili->ExecuteCommand(
"SET WAR",
arglist,0);
543 fFumili->ExecuteCommand(
"SET NOD",
arglist,0);
545 fFumili->ExecuteCommand(
"SET DEB",
arglist,0);
549 arglist[0] = MaxFunctionCalls();
553 std::cout <<
"Minimize using TFumili with tolerance = " << Tolerance()
554 <<
" max calls " << MaxFunctionCalls() << std::endl;
556 int iret = fFumili->ExecuteCommand(
"MIGRAD",
arglist,2);
583 assert (
static_cast<unsigned int>(
ntot) == fDim);
584 assert(
nfree == fFumili->GetNumberFreeParameters() );
590 fParams.resize( fDim);
591 fErrors.resize( fDim);
592 fCovar.resize(fDim*fDim);
593 const double *
cv = fFumili->GetCovarianceMatrix();
595 for (
unsigned int i = 0; i < fDim; ++i) {
596 fParams[i] = fFumili->GetParameter( i );
597 fErrors[i] = fFumili->GetParError( i );
599 if ( !fFumili->IsFixed(i) ) {
600 for (
unsigned int j = 0;
j <=i ; ++
j) {
601 if ( !fFumili->IsFixed(
j) ) {
602 fCovar[i*fDim +
j] =
cv[
l];
603 fCovar[
j*fDim + i] = fCovar[i*fDim +
j];
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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) ...
Type_t
enumeration specifying the possible fit method types
FunctionType::BaseFunc BaseFunction
Documentation for the abstract class IBaseFunctionMultiDim.
virtual bool HasGradient() const
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
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)
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
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
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
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
static uint64_t sum(uint64_t i)