61 if (prevErrorIgnoreLevel < 1001) {
63 return prevErrorIgnoreLevel;
86 : Minimizer(), fDim(0), fMinimizer(0), fMinuitFCN(0), fMinimum(0)
96 std::string algoname(
type);
98 std::transform(algoname.begin(), algoname.end(), algoname.begin(), (
int (*)(
int))tolower);
101 if (algoname ==
"simplex")
103 if (algoname ==
"minimize")
105 if (algoname ==
"scan")
107 if (algoname ==
"fumili" || algoname ==
"fumili2")
109 if (algoname ==
"bfgs")
192 print.
Info(
"Parameter",
name,
"has zero or invalid step size - consider it as constant");
198 if (minuit2Index != ivar) {
199 print.
Warn(
"Wrong index", minuit2Index,
"used for the variable",
name);
229 double lower,
double upper)
243 double step = (val != 0) ? 0.1 * std::abs(val) : 0.1;
255 return std::string();
281 for (
unsigned int ivar = 0; ivar <
n; ++ivar)
348 print.
Error(
"Wrong variable index");
359 print.
Error(
"Wrong variable index");
391 print.
Error(
"Wrong Fit method function for Fumili");
411 print.
Error(
"Wrong Fit method function for Fumili");
435 print.
Error(
"FCN function has not been set");
448 const int strategyLevel =
Strategy();
454 int maxfcn_used = maxfcn;
455 if (maxfcn_used == 0) {
457 maxfcn_used = 200 + 100 * nvar + 5 * nvar * nvar;
459 std::cout <<
"Minuit2Minimizer: Minimize with max-calls " << maxfcn_used <<
" convergence for edm < " << tol
460 <<
" strategy " << strategyLevel << std::endl;
488 minuit2Opt->
GetValue(
"GradientNCycles", nGradCycles);
489 minuit2Opt->
GetValue(
"HessianNCycles", nHessCycles);
490 minuit2Opt->
GetValue(
"HessianGradientNCycles", nHessGradCycles);
492 minuit2Opt->
GetValue(
"GradientTolerance", gradTol);
493 minuit2Opt->
GetValue(
"GradientStepTolerance", gradStepTol);
494 minuit2Opt->
GetValue(
"HessianStepTolerance", hessStepTol);
495 minuit2Opt->
GetValue(
"HessianG2Tolerance", hessG2Tol);
506 int storageLevel = 1;
507 bool ret = minuit2Opt->
GetValue(
"StorageLevel", storageLevel);
511 if (printLevel > 0) {
512 std::cout <<
"Minuit2Minimizer::Minuit - Changing default options" << std::endl;
521 if (printLevel == 10 &&
gROOT) {
529 if (printLevel == 20 || printLevel == 30 || printLevel == 40 || (printLevel >= 20000 && printLevel < 30000)) {
530 int parNumber = printLevel - 20000;
531 if (printLevel == 20)
533 if (printLevel == 30)
535 if (printLevel == 40)
540 if (printLevel == 100 || (printLevel >= 10000 && printLevel < 20000)) {
541 int parNumber = printLevel - 10000;
590 if (debugLevel >= 3) {
592 const std::vector<ROOT::Minuit2::MinimumState> &iterationStates = min.
States();
593 std::cout <<
"Number of iterations " << iterationStates.size() << std::endl;
594 for (
unsigned int i = 0; i < iterationStates.size(); ++i) {
597 std::cout <<
"----------> Iteration " << i << std::endl;
598 int pr = std::cout.precision(12);
599 std::cout <<
" FVAL = " << st.
Fval() <<
" Edm = " << st.
Edm() <<
" Nfcn = " << st.
NFcn()
601 std::cout.precision(pr);
603 std::cout <<
" Error matrix change = " << st.
Error().
Dcovar() << std::endl;
605 std::cout <<
" Parameters : ";
607 for (
int j = 0; j < st.
size(); ++j)
609 std::cout << std::endl;
619 txt =
"Covar is not pos def";
623 txt =
"Covar was made pos def";
627 txt =
"Hesse is not valid";
631 txt =
"Edm is above max";
635 txt =
"Reached call limit";
639 MnPrint print(
"Minuit2Minimizer::Minimize", debugLevel);
640 bool validMinimum = min.
IsValid();
644 if (
fStatus != 0 && debugLevel > 0)
650 txt =
"unknown failure";
653 print.
Warn(
"Minimization did NOT converge,", txt);
661 if (paramsObj.size() == 0)
663 assert(
fDim == paramsObj.size());
667 for (
unsigned int i = 0; i <
fDim; ++i) {
668 fValues[i] = paramsObj[i].Value();
681 std::cout <<
"Minuit2Minimizer : Valid minimum - status = " <<
fStatus << std::endl;
682 int pr = std::cout.precision(18);
683 std::cout <<
"FVAL = " <<
fState.
Fval() << std::endl;
684 std::cout <<
"Edm = " <<
fState.
Edm() << std::endl;
685 std::cout.precision(pr);
686 std::cout <<
"Nfcn = " <<
fState.
NFcn() << std::endl;
689 std::cout << par.
Name() <<
"\t = " << par.
Value() <<
"\t ";
691 std::cout <<
"(fixed)" << std::endl;
693 std::cout <<
"(const)" << std::endl;
695 std::cout <<
"+/- " << par.
Error() <<
"\t(limited)" << std::endl;
697 std::cout <<
"+/- " << par.
Error() << std::endl;
700 std::cout <<
"Minuit2Minimizer : Invalid Minimum - status = " <<
fStatus << std::endl;
701 std::cout <<
"FVAL = " <<
fState.
Fval() << std::endl;
702 std::cout <<
"Edm = " <<
fState.
Edm() << std::endl;
703 std::cout <<
"Nfcn = " <<
fState.
NFcn() << std::endl;
711 if (paramsObj.size() == 0)
713 assert(
fDim == paramsObj.size());
718 for (
unsigned int i = 0; i <
fDim; ++i) {
750 for (
unsigned int i = 0; i <
fDim; ++i) {
752 for (
unsigned int j = 0; j <
fDim; ++j) {
753 cov[i *
fDim + j] = 0;
757 for (
unsigned int j = 0; j <
fDim; ++j) {
759 int k = i *
fDim + j;
780 for (
unsigned int i = 0; i <
fDim; ++i) {
782 for (
unsigned int j = 0; j <
fDim; ++j) {
783 hess[i *
fDim + j] = 0;
787 for (
unsigned int j = 0; j <
fDim; ++j) {
789 int k = i *
fDim + j;
867 print.
Error(
"Failed - no function minimum existing");
872 print.
Error(
"Failed - invalid function minimum");
885 if ((mstatus & 8) != 0) {
886 print.
Info([&](std::ostream &os) {
887 os <<
"Found a new minimum: run again the Minimization starting from the new point";
890 os <<
'\n' << par.Name() <<
"\t = " << par.Value();
899 print.
Info(
"Run now again Minos from the new found Minimum");
909 bool isValid = ((mstatus & 1) == 0) && ((mstatus & 2) == 0);
916 bool runLower = runopt != 2;
917 bool runUpper = runopt != 1;
941 tol = std::max(tol, 0.01);
944 int maxfcn_used = maxfcn;
945 if (maxfcn_used == 0) {
947 maxfcn_used = 2 * (nvar + 1) * (200 + 100 * nvar + 5 * nvar * nvar);
951 if (debugLevel >= 1) {
952 std::cout <<
"************************************************************************************************"
954 std::cout <<
"Minuit2Minimizer::GetMinosError - Run MINOS LOWER error for parameter #" << i <<
" : "
955 << par_name <<
" using max-calls " << maxfcn_used <<
", tolerance " << tol << std::endl;
957 low =
minos.Loval(i, maxfcn, tol);
960 if (debugLevel >= 1) {
961 std::cout <<
"************************************************************************************************"
963 std::cout <<
"Minuit2Minimizer::GetMinosError - Run MINOS UPPER error for parameter #" << i <<
" : "
964 << par_name <<
" using max-calls " << maxfcn_used <<
", tolerance " << tol << std::endl;
966 up =
minos.Upval(i, maxfcn, tol);
983 if (debugLevel > 0) {
986 std::cout <<
"Minos: Invalid lower error for parameter " << par_name << std::endl;
988 std::cout <<
"Minos: Parameter : " << par_name <<
" is at Lower limit; error is " << me.
Lower()
991 std::cout <<
"Minos: Maximum number of function calls exceeded when running for lower error for parameter "
992 << par_name << std::endl;
994 std::cout <<
"Minos: New Minimum found while running Minos for lower error for parameter " << par_name
998 std::cout <<
"Minos: Lower error for parameter " << par_name <<
" : " << me.
Lower() << std::endl;
1002 std::cout <<
"Minos: Invalid upper error for parameter " << par_name << std::endl;
1004 std::cout <<
"Minos: Parameter " << par_name <<
" is at Upper limit; error is " << me.
Upper() << std::endl;
1006 std::cout <<
"Minos: Maximum number of function calls exceeded when running for upper error for parameter "
1007 << par_name << std::endl;
1009 std::cout <<
"Minos: New Minimum found while running Minos for upper error for parameter " << par_name
1013 std::cout <<
"Minos: Upper error for parameter " << par_name <<
" : " << me.
Upper() << std::endl;
1018 bool lowerInvalid = (runLower && !me.
LowerValid());
1019 bool upperInvalid = (runUpper && !me.
UpperValid());
1036 if (lowerInvalid || upperInvalid) {
1062 errLow = me.
Lower();
1088 print.
Error(
"Function must be set before using Scan");
1093 print.
Error(
"Invalid number; minimizer variables must be set before using Scan");
1106 double amin = scan.
Fval();
1109 std::vector<std::pair<double, double>>
result = scan(ipar, nstep - 1,
xmin,
xmax);
1112 if (prev_level > -2)
1116 if (
result.size() != nstep) {
1117 print.
Error(
"Invalid result from MnParameterScan");
1123 for (
unsigned int i = 0; i < nstep; ++i) {
1130 if (scan.
Fval() < amin) {
1131 print.
Info(
"A new minimum has been found");
1146 print.
Error(
"No function minimum existing; must minimize function before");
1151 print.
Error(
"Invalid function minimum");
1176 if (prev_level > -2)
1181 std::vector<std::pair<double, double>>
result =
contour(ipar, jpar, npoints);
1182 if (
result.size() != npoints) {
1183 print.
Error(
"Invalid result from MnContours");
1186 for (
unsigned int i = 0; i < npoints; ++i) {
1204 print.
Error(
"FCN function has not been set");
1210 print.
Info(
"Using max-calls", maxfcn);
1243 if (prev_level > -2)
1248 std::cout <<
"Minuit2Minimizer::Hesse - State returned from Hesse " << std::endl;
1249 std::cout <<
fState << std::endl;
1253 std::string covStatusType =
"not valid";
1255 covStatusType =
"approximate";
1257 covStatusType =
"full but made positive defined";
1259 covStatusType =
"accurate";
1275 print.
Warn(
"Hesse failed - matrix is", covStatusType);
1276 print.
Warn(hstatus);
1282 print.
Info(
"Hesse is valid - matrix is", covStatusType);
RooPlot * contour(RooRealVar &var1, RooRealVar &var2, double n1=1, double n2=2, double n3=0.0, double n4=0.0, double n5=0.0, double n6=0.0)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
void Set(const std::string &name, double value, double step)
set value and name (unlimited parameter)
void SetLimits(double low, double up)
set a double side limit, if low == up the parameter is fixed if low > up the limits are removed The c...
void SetUpperLimit(double up)
set a single upper limit
void Fix()
fix the parameter
void SetLowerLimit(double low)
set a single lower limit
FitMethodFunction class Interface for objective functions (like chi2 and likelihood used in the fit) ...
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.
Generic interface for defining configuration options of a numerical algorithm.
virtual void Print(std::ostream &=std::cout) const
print options
bool GetValue(const char *name, T &t) const
static ROOT::Math::IOptions * FindDefault(const char *name)
Find an extra options and return a nullptr if it is not existing.
double Tolerance() const
absolute tolerance
unsigned int MaxFunctionCalls() const
max number of function calls
double Precision() const
precision of minimizer in the evaluation of the objective function ( a value <=0 corresponds to the l...
int fStatus
status of minimizer
int Strategy() const
strategy
double ErrorDef() const
return the statistical scale used for calculate the error is typically 1 for Chi2 and 0....
bool IsValidError() const
return true if Minimizer has performed a detailed error validation (e.g. run Hesse for Minuit)
int PrintLevel() const
minimizer configuration parameters
Combined minimizer: combination of Migrad and Simplex.
template wrapped class for adapting to FCNBase signature
virtual void SetErrorDef(double)
add interface to set dynamically a new error definition Re-implement this function if needed.
template wrapped class for adapting to FCNBase signature a IGradFunction
void SetHessianFunction(Func f)
template wrapped class for adapting to FumiliFCNBase signature
Instantiates the seed generator and Minimum builder for the Fumili minimization method.
class holding the full result of the minimization; both internal and external (MnUserParameterState) ...
const std::vector< MinimumState > & States() const
const MinimumError & Error() const
bool HasAccurateCovar() const
bool HasReachedCallLimit() const
const MnUserParameterState & UserState() const
const MinimumState & State() const
bool HasMadePosDefCovar() const
bool IsAboveMaxEdm() const
bool HasValidCovariance() const
bool HasPosDefCovar() const
bool HasCovariance() const
void SetErrorDef(double up)
virtual void SetStorageLevel(int level)
virtual void SetPrintLevel(int level)
virtual void SetTraceObject(MnTraceObject &obj)
bool InvertFailed() const
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
bool HasParameters() const
const MinimumError & Error() const
const MnAlgebraicVector & Vec() const
bool HasCovariance() const
Class holding the result of Minos (lower and upper values) for a specific parameter.
bool AtUpperLimit() const
bool AtLowerMaxFcn() const
bool AtUpperMaxFcn() const
bool AtLowerLimit() const
Minuit2Minimizer class implementing the ROOT::Math::Minimizer interface for Minuit2 minimization algo...
bool ExamineMinimum(const ROOT::Minuit2::FunctionMinimum &min)
examine the minimum result
Minuit2Minimizer(ROOT::Minuit2::EMinimizerType type=ROOT::Minuit2::kMigrad)
Default constructor.
void SetStorageLevel(int level)
set storage level = 1 : store all iteration states (default) = 0 : store only first and last state to...
Minuit2Minimizer & operator=(const Minuit2Minimizer &rhs)
Assignment operator.
std::vector< double > fValues
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 )
bool Contour(unsigned int i, unsigned int j, unsigned int &npoints, double *xi, double *xj) override
find the contour points (xi,xj) of the function for parameter i and j around the minimum The contour ...
bool IsFixedVariable(unsigned int ivar) const override
query if an existing variable is fixed (i.e.
bool SetVariableUpperLimit(unsigned int ivar, double upper) override
set the upper-limit of an already existing variable
double GlobalCC(unsigned int i) const override
get global correlation coefficient for the variable i.
bool SetVariableValues(const double *val) override
set the values of all existing variables (array must be dimensioned to the size of the existing param...
bool SetVariable(unsigned int ivar, const std::string &name, double val, double step) override
set free variable
virtual const ROOT::Minuit2::FCNBase * GetFCN() const
const double * Errors() const override
return errors at the minimum
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
bool SetVariableStepSize(unsigned int ivar, double step) override
set the step size of an already existing variable
bool GetCovMatrix(double *cov) const override
Fill the passed array with the covariance matrix elements if the variable is fixed or const the value...
bool ReleaseVariable(unsigned int ivar) override
release an existing variable
void SetHessianFunction(std::function< bool(const std::vector< double > &, double *)> hfunc) override
set the function implementing Hessian computation
bool GetVariableSettings(unsigned int ivar, ROOT::Fit::ParameterSettings &varObj) const override
get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
bool Hesse() override
perform a full calculation of the Hessian matrix for error calculation If a valid minimum exists the ...
std::vector< double > fErrors
ROOT::Minuit2::ModularFunctionMinimizer * fMinimizer
bool GetMinosError(unsigned int i, double &errLow, double &errUp, int=0) override
get the minos error for parameter i, return false if Minos failed A minimizaiton must be performed be...
std::string VariableName(unsigned int ivar) const override
get name of variables (override if minimizer support storing of variable names)
int RunMinosError(unsigned int i, double &errLow, double &errUp, int runopt)
bool SetVariableLimits(unsigned int ivar, double lower, double upper) override
set the limits of an already existing variable
double Correlation(unsigned int i, unsigned int j) const override
return correlation coefficient between variable i and j.
bool SetLowerLimitedVariable(unsigned int ivar, const std::string &name, double val, double step, double lower) override
set lower limit variable (override if minimizer supports them )
void SetTraceObject(MnTraceObject &obj)
set an object to trace operation for each iteration The object must be a (or inherit from) ROOT::Minu...
virtual const ROOT::Minuit2::ModularFunctionMinimizer * GetMinimizer() const
double CovMatrix(unsigned int i, unsigned int j) const override
return covariance matrix elements if the variable is fixed or const the value is zero The ordering of...
void SetMinimizerType(ROOT::Minuit2::EMinimizerType type)
bool SetVariableValue(unsigned int ivar, double val) override
set variable
bool Scan(unsigned int i, unsigned int &nstep, double *x, double *y, double xmin=0, double xmax=0) override
scan a parameter i around the minimum.
int VariableIndex(const std::string &name) const override
get index of variable given a variable given a name return -1 if variable is not found
bool SetUpperLimitedVariable(unsigned int ivar, const std::string &name, double val, double step, double upper) override
set upper limit variable (override if minimizer supports them )
ROOT::Minuit2::MnUserParameterState fState
bool SetVariableLowerLimit(unsigned int ivar, double lower) override
set the lower-limit of an already existing variable
bool FixVariable(unsigned int ivar) override
fix an existing variable
virtual void SetMinimizer(ROOT::Minuit2::ModularFunctionMinimizer *m)
bool Minimize() override
method to perform the minimization.
ROOT::Minuit2::FunctionMinimum * fMinimum
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
bool GetHessianMatrix(double *h) const override
Fill the passed array with the Hessian matrix elements The Hessian matrix is the matrix of the second...
ROOT::Minuit2::FCNBase * fMinuitFCN
void PrintResults() override
return reference to the objective function virtual const ROOT::Math::IGenFunction & Function() const;
void Clear() override
reset for consecutive minimization - implement if needed
~Minuit2Minimizer() override
Destructor (no operations)
int CovMatrixStatus() const override
return the status of the covariance matrix status = -1 : not available (inversion failed or Hesse fai...
class for the individual Minuit Parameter with Name and number; contains the input numbers for the mi...
double LowerLimit() const
double UpperLimit() const
const char * Name() const
bool HasLowerLimit() const
bool HasUpperLimit() const
API class for Contours Error analysis (2-dim errors); minimization has to be done before and Minimum ...
const MnUserParameterState & State() const
const std::vector< double > & GlobalCC() const
API class for calculating the numerical covariance matrix (== 2x Inverse Hessian == 2x Inverse 2nd de...
API class for Minos Error analysis (asymmetric errors); minimization has to be done before and Minimu...
Scans the values of FCN as a function of one Parameter and retains the best function and Parameter va...
const MnUserParameters & Parameters() const
void Error(const Ts &... args)
void Info(const Ts &... args)
static int SetGlobalLevel(int level)
void Warn(const Ts &... args)
API class for defining three levels of strategies: low (0), medium (1), high (>=2); acts on: Migrad (...
double HessianG2Tolerance() const
unsigned int HessianGradientNCycles() const
double GradientStepTolerance() const
void SetHessianNCycles(unsigned int n)
void SetHessianStepTolerance(double stp)
double GradientTolerance() const
void SetGradientTolerance(double toler)
double HessianStepTolerance() const
unsigned int HessianNCycles() const
unsigned int GradientNCycles() const
void SetGradientNCycles(unsigned int n)
void SetGradientStepTolerance(double stp)
void SetHessianGradientNCycles(unsigned int n)
void SetHessianG2Tolerance(double toler)
virtual void Init(const MnUserParameterState &state)
class which holds the external user and/or internal Minuit representation of the parameters and error...
void SetLimits(unsigned int, double, double)
const MnUserParameters & Parameters() const
double Value(unsigned int) const
void RemoveLimits(unsigned int)
unsigned int NFcn() const
unsigned int Index(const std::string &) const
const std::string & GetName(unsigned int) const
double Int2ext(unsigned int, double) const
const MnGlobalCorrelationCoeff & GlobalCC() const
void Release(unsigned int)
unsigned int VariableParameters() const
const MinuitParameter & Parameter(unsigned int i) const
void SetValue(unsigned int, double)
void Add(const std::string &name, double val, double err)
const char * Name(unsigned int) const
MnUserCovariance Hessian() const
const std::vector< ROOT::Minuit2::MinuitParameter > & MinuitParameters() const
facade: forward interface of MnUserParameters and MnUserTransformation
void SetPrecision(double eps)
unsigned int IntOfExt(unsigned int) const
const MnUserTransformation & Trafo() const
void SetUpperLimit(unsigned int, double)
const MnUserCovariance & IntCovariance() const
const MnUserCovariance & Covariance() const
int CovarianceStatus() const
void SetError(unsigned int, double)
void SetLowerLimit(unsigned int, double)
bool HasCovariance() const
double Value(unsigned int) const
virtual const MinimumBuilder & Builder() const =0
FunctionMinimum Minimize(const FCNBase &, const std::vector< double > &, const std::vector< double > &, unsigned int stra=1, unsigned int maxfcn=0, double toler=0.1) const override
Class implementing the required methods for a minimization using SCAN API is provided in the upper RO...
Class implementing the required methods for a minimization using Simplex.
Instantiates the SeedGenerator and MinimumBuilder for Variable Metric Minimization method.
Mother of all ROOT objects.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
Namespace for new Math classes and functions.
void RestoreGlobalPrintLevel(int)
int TurnOffPrintInfoLevel()
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.