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
175 if (
this == &
rhs)
return *
this;
201 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
215 Error(
"SetFunction",
"Wrong Fit method function type used for Fumili");
223#ifdef USE_FUMILI_FUNCTION
268 unsigned int ndata = 0;
269 unsigned int npar = 0;
282 std::vector<double>
gf(
npar);
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;
299 if (
fgFunc) std::cout <<
"type " <<
fgFunc->Type() << std::endl;
309 for (
unsigned int i = 0; i <
ndata; ++i) {
325 for (
unsigned int j = 0;
j <
npar; ++
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;
394 Error(
"EvaluateFCN",
" type of fit method is not supported, it must be chi2 or log-likelihood");
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) {
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;
475 if (fFumili ==
nullptr) {
476 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
481 int ierr = fFumili->SetParameter(
ivar,
name.c_str(), val, 0., val, val );
482 fFumili->FixParameter(
ivar);
485 std::cout <<
"Fix variable " <<
ivar <<
" " <<
name <<
" value " << std::endl;
489 Error(
"SetFixedVariable",
"Error for parameter %d ",
ivar);
497 if (fFumili ==
nullptr) {
498 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
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);
527 if (fFumili ==
nullptr) {
528 Error(
"SetVariableValue",
"invalid TFumili pointer. Set function first ");
549 else fFumili->ExecuteCommand(
"SET WAR",
arglist,0);
554 arglist[0] = MaxFunctionCalls();
558 std::cout <<
"Minimize using TFumili with tolerance = " << Tolerance()
559 <<
" max calls " << MaxFunctionCalls() << std::endl;
561 int iret = fFumili->ExecuteCommand(
"MIGRAD",
arglist,2);
585 assert (
static_cast<unsigned int>(
ntot) == fDim);
586 assert(
nfree == fFumili->GetNumberFreeParameters() );
592 fParams.resize( fDim);
593 fErrors.resize( fDim);
594 fCovar.resize(fDim*fDim);
595 const double * cv = fFumili->GetCovarianceMatrix();
597 for (
unsigned int i = 0; i < fDim; ++i) {
598 fParams[i] = fFumili->GetParameter( i );
599 fErrors[i] = fFumili->GetParError( i );
601 if ( !fFumili->IsFixed(i) ) {
602 for (
unsigned int j = 0;
j <=i ; ++
j) {
603 if ( !fFumili->IsFixed(
j) ) {
604 fCovar[i*fDim +
j] = cv[
l];
605 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
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
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)