13 #ifndef ROOT_Math_Minimizer
14 #define ROOT_Math_Minimizer
36 class ParameterSettings;
93 virtual ~Minimizer () {}
104 Minimizer(
const Minimizer &) {}
109 Minimizer & operator = (
const Minimizer & rhs) {
110 if (
this == &rhs)
return *
this;
117 virtual void Clear() {}
120 virtual void SetFunction(
const ROOT::Math::IMultiGenFunction & func) = 0;
123 virtual void SetFunction(
const ROOT::Math::IMultiGradFunction & func)
125 SetFunction(static_cast<const ::ROOT::Math::IMultiGenFunction &> (func));
130 template<
class VariableIterator>
131 int SetVariables(
const VariableIterator & begin,
const VariableIterator & end) {
132 unsigned int ivar = 0;
133 for ( VariableIterator vitr = begin; vitr != end; ++vitr) {
135 if (vitr->IsFixed() )
136 iret = SetFixedVariable(ivar, vitr->Name(), vitr->Value() );
137 else if (vitr->IsDoubleBound() )
138 iret = SetLimitedVariable(ivar, vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->LowerLimit(), vitr->UpperLimit() );
139 else if (vitr->HasLowerLimit() )
140 iret = SetLowerLimitedVariable(ivar, vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->LowerLimit() );
141 else if (vitr->HasUpperLimit() )
142 iret = SetUpperLimitedVariable(ivar, vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->UpperLimit() );
144 iret = SetVariable( ivar, vitr->Name(), vitr->Value(), vitr->StepSize() );
153 virtual bool SetVariable(
unsigned int ivar,
const std::string & name,
double val,
double step) = 0;
155 virtual bool SetLowerLimitedVariable(
unsigned int ivar ,
const std::string & name ,
double val ,
double step ,
double lower ) {
156 return SetLimitedVariable(ivar, name, val, step, lower, std::numeric_limits<double>::infinity() );
159 virtual bool SetUpperLimitedVariable(
unsigned int ivar ,
const std::string & name ,
double val ,
double step ,
double upper ) {
160 return SetLimitedVariable(ivar, name, val, step, - std::numeric_limits<double>::infinity(), upper );
163 virtual bool SetLimitedVariable(
unsigned int ivar ,
const std::string & name ,
double val ,
double step ,
164 double lower ,
double upper ) {
165 MATH_WARN_MSG(
"Minimizer::SetLimitedVariable",
"Setting of limited variable not implemented - set as unlimited");
166 MATH_UNUSED(lower); MATH_UNUSED(upper);
167 return SetVariable(ivar, name, val, step);
170 virtual bool SetFixedVariable(
unsigned int ivar ,
const std::string & name ,
double val ) {
171 MATH_ERROR_MSG(
"Minimizer::SetFixedVariable",
"Setting of fixed variable not implemented");
172 MATH_UNUSED(ivar); MATH_UNUSED(name); MATH_UNUSED(val);
176 virtual bool SetVariableValue(
unsigned int ivar ,
double value) {
177 MATH_ERROR_MSG(
"Minimizer::SetVariableValue",
"Set of a variable value not implemented");
178 MATH_UNUSED(ivar); MATH_UNUSED(value);
182 virtual bool SetVariableValues(
const double * x) {
185 while ( i <= NDim() && ret) {
186 ret &= SetVariableValue(i,x[i] ); i++;
191 virtual bool SetVariableStepSize(
unsigned int ivar,
double value ) {
192 MATH_ERROR_MSG(
"Minimizer::SetVariableStepSize",
"Setting an existing variable step size not implemented");
193 MATH_UNUSED(ivar); MATH_UNUSED(value);
197 virtual bool SetVariableLowerLimit(
unsigned int ivar,
double lower) {
198 MATH_ERROR_MSG(
"Minimizer::SetVariableLowerLimit",
"Setting an existing variable limit not implemented");
199 MATH_UNUSED(ivar); MATH_UNUSED(lower);
203 virtual bool SetVariableUpperLimit(
unsigned int ivar,
double upper) {
204 MATH_ERROR_MSG(
"Minimizer::SetVariableUpperLimit",
"Setting an existing variable limit not implemented");
205 MATH_UNUSED(ivar); MATH_UNUSED(upper);
209 virtual bool SetVariableLimits(
unsigned int ivar,
double lower,
double upper) {
210 return SetVariableLowerLimit(ivar,lower) && SetVariableUpperLimit(ivar,upper);
213 virtual bool FixVariable(
unsigned int ivar) {
214 MATH_ERROR_MSG(
"Minimizer::FixVariable",
"Fixing an existing variable not implemented");
219 virtual bool ReleaseVariable(
unsigned int ivar) {
220 MATH_ERROR_MSG(
"Minimizer::ReleaseVariable",
"Releasing an existing variable not implemented");
226 virtual bool IsFixedVariable(
unsigned int ivar)
const {
227 MATH_ERROR_MSG(
"Minimizer::IsFixedVariable",
"Quering an existing variable not implemented");
232 virtual bool GetVariableSettings(
unsigned int ivar, ROOT::Fit::ParameterSettings & pars)
const {
233 MATH_ERROR_MSG(
"Minimizer::GetVariableSettings",
"Quering an existing variable not implemented");
234 MATH_UNUSED(ivar); MATH_UNUSED(pars);
240 virtual bool SetVariableInitialRange(
unsigned int ,
double ,
double ) {
245 virtual bool Minimize() = 0;
248 virtual double MinValue()
const = 0;
251 virtual const double * X()
const = 0;
254 virtual double Edm()
const {
return -1; }
257 virtual const double * MinGradient()
const {
return NULL; }
260 virtual unsigned int NCalls()
const {
return 0; }
263 virtual unsigned int NIterations()
const {
return NCalls(); }
267 virtual unsigned int NDim()
const = 0;
272 virtual unsigned int NFree()
const {
return NDim(); }
275 virtual bool ProvidesError()
const {
return false; }
278 virtual const double * Errors()
const {
return NULL; }
284 virtual double CovMatrix(
unsigned int ivar ,
unsigned int jvar )
const {
285 MATH_UNUSED(ivar); MATH_UNUSED(jvar);
297 virtual bool GetCovMatrix(
double * covMat)
const {
309 virtual bool GetHessianMatrix(
double * hMat)
const {
318 virtual int CovMatrixStatus()
const {
326 virtual double Correlation(
unsigned int i,
unsigned int j )
const {
327 double tmp = CovMatrix(i,i) * CovMatrix(j,j);
328 return ( tmp < 0) ? 0 : CovMatrix(i,j) / std::sqrt( tmp );
338 virtual double GlobalCC(
unsigned int ivar)
const {
349 virtual bool GetMinosError(
unsigned int ivar ,
double & errLow,
double & errUp,
int option = 0) {
350 MATH_ERROR_MSG(
"Minimizer::GetMinosError",
"Minos Error not implemented");
351 MATH_UNUSED(ivar); MATH_UNUSED(errLow); MATH_UNUSED(errUp); MATH_UNUSED(option);
358 virtual bool Hesse() {
359 MATH_ERROR_MSG(
"Minimizer::Hesse",
"Hesse not implemented");
367 virtual bool Scan(
unsigned int ivar ,
unsigned int & nstep ,
double * x ,
double * y ,
368 double xmin = 0,
double xmax = 0) {
369 MATH_ERROR_MSG(
"Minimizer::Scan",
"Scan not implemented");
370 MATH_UNUSED(ivar); MATH_UNUSED(nstep); MATH_UNUSED(x); MATH_UNUSED(y);
371 MATH_UNUSED(xmin); MATH_UNUSED(xmax);
379 virtual bool Contour(
unsigned int ivar ,
unsigned int jvar,
unsigned int & npoints,
380 double * xi ,
double * xj ) {
381 MATH_ERROR_MSG(
"Minimizer::Contour",
"Contour not implemented");
382 MATH_UNUSED(ivar); MATH_UNUSED(jvar); MATH_UNUSED(npoints);
383 MATH_UNUSED(xi); MATH_UNUSED(xj);
391 virtual void PrintResults() {}
395 virtual std::string VariableName(
unsigned int ivar)
const {
397 return std::string();
402 virtual int VariableIndex(
const std::string & name)
const {
403 MATH_ERROR_MSG(
"Minimizer::VariableIndex",
"Getting variable index from name not implemented");
411 int PrintLevel()
const {
return fOptions.PrintLevel(); }
414 unsigned int MaxFunctionCalls()
const {
return fOptions.MaxFunctionCalls(); }
417 unsigned int MaxIterations()
const {
return fOptions.MaxIterations(); }
420 double Tolerance()
const {
return fOptions.Tolerance(); }
424 double Precision()
const {
return fOptions.Precision(); }
427 int Strategy()
const {
return fOptions.Strategy(); }
430 int Status()
const {
return fStatus; }
434 double ErrorDef()
const {
return fOptions.ErrorDef(); }
437 bool IsValidError()
const {
return fValidError; }
440 virtual MinimizerOptions Options()
const {
445 void SetPrintLevel(
int level) { fOptions.SetPrintLevel(level); }
448 void SetMaxFunctionCalls(
unsigned int maxfcn) {
if (maxfcn > 0) fOptions.SetMaxFunctionCalls(maxfcn); }
451 void SetMaxIterations(
unsigned int maxiter) {
if (maxiter > 0) fOptions.SetMaxIterations(maxiter); }
454 void SetTolerance(
double tol) { fOptions.SetTolerance(tol); }
458 void SetPrecision(
double prec) { fOptions.SetPrecision(prec); }
461 void SetStrategy(
int strategyLevel) { fOptions.SetStrategy(strategyLevel); }
464 void SetErrorDef(
double up) { fOptions.SetErrorDef(up); }
467 void SetValidError(
bool on) { fValidError = on; }
470 void SetOptions(
const MinimizerOptions & opt) {
475 void SetDefaultOptions() {
476 fOptions.ResetToDefaultOptions();
489 MinimizerOptions fOptions;