53 if (niter <=0 ) niter = 1000;
66 if (ivar >
fValues.size() )
return false;
80 std::map<unsigned int, std::pair<double, double> >::iterator iter =
fBounds.find(ivar);
91 if (!ret)
return false;
92 const double upper = std::numeric_limits<double>::infinity();
93 fBounds[ivar] = std::make_pair( lower, upper);
100 if (!ret)
return false;
101 const double lower = -std::numeric_limits<double>::infinity();
102 fBounds[ivar] = std::make_pair( lower, upper);
110 if (!ret)
return false;
111 fBounds[ivar] = std::make_pair( lower, upper);
119 if (!ret)
return false;
128 if (ivar >=
fValues.size() )
return false;
135 if (
x ==
nullptr)
return false;
142 if (ivar >
fValues.size() )
return false;
149 double upper = (
fBounds.count(ivar)) ?
fBounds[ivar].second : std::numeric_limits<double>::infinity();
155 double lower = (
fBounds.count(ivar)) ?
fBounds[ivar].
first : - std::numeric_limits<double>::infinity();
161 if (ivar >
fVarTypes.size() )
return false;
163 fBounds[ivar] = std::make_pair( lower, upper);
164 if (lower > upper || (lower == - std::numeric_limits<double>::infinity() &&
165 upper == std::numeric_limits<double>::infinity() ) ) {
169 else if (lower == upper)
172 if (lower == - std::numeric_limits<double>::infinity() )
174 else if (upper == std::numeric_limits<double>::infinity() )
184 if (ivar >=
fVarTypes.size() )
return false;
191 if (ivar >=
fVarTypes.size() )
return false;
192 if (
fBounds.count(ivar) == 0) {
196 if (
fBounds[ivar].
first == - std::numeric_limits<double>::infinity() )
198 else if (
fBounds[ivar].second == std::numeric_limits<double>::infinity() )
207 if (ivar >=
fVarTypes.size() )
return false;
212 if (ivar >=
fValues.size() )
return false;
215 std::map< unsigned int , std::pair< double, double> >::const_iterator itr =
fBounds.find(ivar);
217 double lower = (itr->second).
first;
218 double upper = (itr->second).second;
228 if (ivar >=
fNames.size() )
return "";
233 std::vector<std::string>::const_iterator itr = std::find(
fNames.begin(),
fNames.end(),
name);
234 if (itr ==
fNames.end() )
return -1;
235 return itr -
fNames.begin();
248 unsigned int npar =
fValues.size();
249 if (npar == 0 || npar <
fDim ) {
250 MATH_ERROR_MSGVAL(
"BasicMinimizer::CheckDimension",
"Wrong number of parameters",npar);
258 MATH_ERROR_MSG(
"BasicMinimizer::CheckFunction",
"Function has not been set");
267 bool doTransform = (
fBounds.size() > 0);
268 unsigned int ivar = 0;
269 while (!doTransform && ivar <
fVarTypes.size() ) {
273 startValues = std::vector<double>(
fValues.begin(),
fValues.end() );
279 doTransform &= (gradObjFunc !=
nullptr);
281 if (!doTransform)
return nullptr;
286 trFunc->InvTransformation(&
fValues.front(), &startValues[0]);
289 startValues.resize( trFunc->NDim() );
314 int pr = std::cout.precision(18);
315 std::cout <<
"FVAL = " <<
fMinVal << std::endl;
316 std::cout.precision(pr);
318 std::cout <<
"Niterations = " <<
NIterations() << std::endl;
319 unsigned int ncalls =
NCalls();
320 if (ncalls) std::cout <<
"NCalls = " << ncalls << std::endl;
321 for (
unsigned int i = 0; i <
fDim; ++i)
322 std::cout <<
fNames[i] <<
"\t = " <<
fValues[i] << std::endl;
332 unsigned int nfree =
fValues.size();
333 for (
unsigned int i = 0; i <
fVarTypes.size(); ++i)
#define MATH_ERROR_MSGVAL(loc, txt, x)
#define MATH_ERROR_MSG(loc, str)
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
~BasicMinimizer() override
Destructor.
bool IsFixedVariable(unsigned int ivar) const override
query if an existing variable is fixed (i.e.
void PrintResult() const
print result of minimization
BasicMinimizer()
Default constructor.
const ROOT::Math::IMultiGenFunction * fObjFunc
unsigned int NFree() const override
number of free variables (real dimension of the problem)
unsigned int NDim() const override
number of dimensions
bool SetVariableStepSize(unsigned int ivar, double step) override
set the step size of an already existing variable
std::vector< ROOT::Math::EMinimVariableType > fVarTypes
vector specifying the type of variables
bool CheckObjFunction() const
void SetFinalValues(const double *x, const MinimTransformFunction *func=nullptr)
bool SetVariable(unsigned int ivar, const std::string &name, double val, double step) override
set free variable
MinimTransformFunction * CreateTransformation(std::vector< double > &startValues, const ROOT::Math::IMultiGradFunction *func=nullptr)
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 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 SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
bool SetVariableLowerLimit(unsigned int ivar, double lower) override
set the lower-limit of an already existing variable
bool SetVariableValues(const double *x) override
set the values of all existing variables (array must be dimensioned to the size of existing parameter...
bool Minimize() override
method to perform the minimization
std::vector< double > fSteps
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
bool GetVariableSettings(unsigned int ivar, ROOT::Fit::ParameterSettings &varObj) const override
get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
std::map< unsigned int, std::pair< double, double > > fBounds
map specifying the bound using as key the parameter index
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 )
bool CheckDimension() const
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 ReleaseVariable(unsigned int ivar) override
release an existing variable
bool SetVariableLimits(unsigned int ivar, double lower, double upper) override
set the limits of an already existing variable
std::vector< double > fValues
bool FixVariable(unsigned int ivar) override
fix an existing variable
const ROOT::Math::IMultiGradFunction * GradObjFunction() const
return pointer to used gradient object function (NULL if gradient is not supported)
std::vector< std::string > fNames
std::string VariableName(unsigned int ivar) const override
get name of variables (override if minimizer support storing of variable names)
bool SetVariableValue(unsigned int ivar, double val) override
set the value of an existing variable
bool SetVariableUpperLimit(unsigned int ivar, double upper) override
set the upper-limit of an already existing variable
Documentation for the abstract class IBaseFunctionMultiDim.
virtual IBaseFunctionMultiDimTempl< T > * Clone() const =0
Clone a function.
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
Interface (abstract class) for multi-dimensional functions providing a gradient calculation.
static int DefaultPrintLevel()
static int DefaultMaxIterations()
virtual unsigned int NIterations() const
number of iterations to reach the minimum
void SetMaxIterations(unsigned int maxiter)
set maximum iterations (one iteration can have many function calls)
void SetPrintLevel(int level)
set print level
virtual unsigned int NCalls() const
number of function calls to reach the minimum
Namespace for new Math classes and functions.
@ kUpBound
variable has an upper bounds
@ kBounds
variable has two bounds
@ kLowBound
variable has a lower bound
@ kDefault
free variable (unlimited)
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.