60 if (niter <=0 ) niter = 1000;
68 std::string algoname(
type);
69 std::transform(algoname.begin(), algoname.end(), algoname.begin(), (
int(*)(
int)) tolower );
86 if (niter <=0 ) niter = 1000;
116 if (fnumgrad)
return fnumgrad->
NCalls();
120 if (ffitmethod)
return ffitmethod->
NCalls();
130 if (function ==
nullptr) {
131 MATH_ERROR_MSG(
"GSLMinimizer::Minimize",
"Function has not been set");
135 unsigned int npar =
NPar();
136 unsigned int ndim =
NDim();
137 if (npar == 0 || npar <
NDim() ) {
142 MATH_WARN_MSGVAL(
"GSLMinimizer::Minimize",
"number of parameters larger than function dimension - ignore extra parameters",npar);
145 const double eps = std::numeric_limits<double>::epsilon();
147 std::vector<double> startValues;
153 trFunc->InvStepTransformation(
X(),
StepSizes(), &steps[0]);
154 steps.resize(trFunc->NDim());
159 MATH_INFO_MSG(
"GSLMinimizer::Minimize",
"There are no free parameter - just compute the function value");
160 double fval = (*function)((
double*)
nullptr);
169 for (
unsigned int i = 0; i < steps.size(); ++i)
170 stepSize += steps[i]*steps[i];
171 stepSize = std::sqrt(stepSize);
172 if (stepSize < eps) {
183 if (debugLevel >=1 ) std::cout <<
"Minimize using GSLMinimizer " <<
fGSLMultiMin->Name() << std::endl;
190 unsigned int iter = 0;
192 bool minFound =
false;
193 bool iterFailed =
false;
206 if (debugLevel >=2) {
207 std::cout <<
"----------> Iteration " << std::setw(4) << iter;
208 int pr = std::cout.precision(18);
209 std::cout <<
" FVAL = " <<
fGSLMultiMin->Minimum() << std::endl;
210 std::cout.precision(pr);
211 if (debugLevel >=3) {
212 std::cout <<
" Parameter Values : ";
214 std::cout << std::endl;
216 xtmp = trFunc->Transformation(xtmp);
218 for (
unsigned int i = 0; i <
NDim(); ++i) {
219 std::cout <<
" " <<
VariableName(i) <<
" = " << xtmp[i];
223 std::cout << std::endl;
237 if (
x ==
nullptr)
return false;
247 if (debugLevel >=1 ) {
248 std::cout <<
"GSLMinimizer: Minimum Found" << std::endl;
249 int pr = std::cout.precision(18);
250 std::cout <<
"FVAL = " <<
MinValue() << std::endl;
251 std::cout.precision(pr);
253 std::cout <<
"Niterations = " << iter << std::endl;
254 unsigned int ncalls =
NCalls();
255 if (ncalls) std::cout <<
"NCalls = " << ncalls << std::endl;
256 for (
unsigned int i = 0; i <
NDim(); ++i)
257 std::cout <<
VariableName(i) <<
"\t = " <<
X()[i] << std::endl;
262 if (debugLevel > 0 ) {
263 std::cout <<
"GSLMinimizer: Minimization did not converge" << std::endl;
265 if (status == GSL_ENOPROG)
266 std::cout <<
"\t Iteration is not making progress towards solution" << std::endl;
268 std::cout <<
"\t Iteration failed with status " << status << std::endl;
270 if (debugLevel >= 1) {
273 for (
unsigned int i = 0; i <
NDim(); ++i) dg2 +=
g[i] *
g[1];
274 std::cout <<
"Grad module is " << std::sqrt(dg2) << std::endl;
275 for (
unsigned int i = 0; i <
NDim(); ++i)
276 std::cout <<
VariableName(i) <<
"\t = " <<
X()[i] << std::endl;
277 std::cout <<
"FVAL = " <<
MinValue() << std::endl;
278 std::cout <<
"Niterations = " << iter << std::endl;
#define MATH_INFO_MSG(loc, str)
Pre-processor macro to report messages which can be configured to use ROOT error or simply an std::io...
#define MATH_ERROR_MSGVAL(loc, txt, x)
#define MATH_ERROR_MSG(loc, str)
#define MATH_WARN_MSGVAL(loc, txt, x)
virtual unsigned int NCalls() const
return the total number of function calls (override if needed)
virtual unsigned int NPar() const
total number of parameter defined
unsigned int NFree() const override
number of free variables (real dimension of the problem)
unsigned int NDim() const override
number of dimensions
void SetMinValue(double val)
void SetFinalValues(const double *x, const MinimTransformFunction *func=nullptr)
double MinValue() const override
return minimum function value
MinimTransformFunction * CreateTransformation(std::vector< double > &startValues, const ROOT::Math::IMultiGradFunction *func=nullptr)
virtual const double * StepSizes() const
accessor methods
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
const ROOT::Math::IMultiGenFunction * ObjFunction() const
return pointer to used objective function
const ROOT::Math::IMultiGradFunction * GradObjFunction() const
return pointer to used gradient object function (NULL if gradient is not supported)
const double * X() const override
return pointer to X values at the minimum
std::string VariableName(unsigned int ivar) const override
get name of variables (override if minimizer support storing of variable names)
const double * MinGradient() const override
return pointer to gradient values at the minimum
ROOT::Math::GSLMultiMinimizer * fGSLMultiMin
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
~GSLMinimizer() override
Destructor.
unsigned int NCalls() const override
number of function calls to reach the minimum
GSLMinimizer(ROOT::Math::EGSLMinimizerType type=ROOT::Math::kConjugateFR)
Default constructor.
bool Minimize() override
method to perform the minimization
GSLMultiMinimizer class , for minimizing multi-dimensional function using derivatives.
static int DefaultPrintLevel()
static int DefaultMaxIterations()
double Tolerance() const
Absolute tolerance.
void SetMaxIterations(unsigned int maxiter)
Set maximum iterations (one iteration can have many function calls).
int fStatus
status of minimizer
unsigned int MaxIterations() const
Max iterations.
void SetPrintLevel(int level)
Set print level.
int PrintLevel() const
Set print level.
MultiNumGradFunction class to wrap a normal function in a gradient function using numerical gradient ...
unsigned int NCalls() const
EGSLMinimizerType
enumeration specifying the types of GSL minimizers
IGradientFunctionMultiDim IMultiGradFunction
IMultiGenFunctionTempl< double > IMultiGenFunction
BasicFitMethodFunction< ROOT::Math::IMultiGradFunction > FitMethodGradFunction