16 #ifndef MATH_NO_PLUGIN_MANAGER
30 static std::string gDefaultMinimizer =
"";
31 static std::string gDefaultMinimAlgo =
"Migrad";
32 static double gDefaultErrorDef = 1.;
33 static double gDefaultTolerance = 1.E-2;
34 static double gDefaultPrecision = -1;
35 static int gDefaultMaxCalls = 0;
36 static int gDefaultMaxIter = 0;
37 static int gDefaultStrategy = 1;
38 static int gDefaultPrintLevel = 0;
39 static IOptions * gDefaultExtraOptions = 0;
43 void MinimizerOptions::SetDefaultMinimizer(
const char * type,
const char * algo) {
45 if (type) Minim::gDefaultMinimizer = std::string(type);
46 if (algo) Minim::gDefaultMinimAlgo = std::string(algo);
48 void MinimizerOptions::SetDefaultErrorDef(
double up) {
50 Minim::gDefaultErrorDef = up;
52 void MinimizerOptions::SetDefaultTolerance(
double tol) {
54 Minim::gDefaultTolerance = tol;
56 void MinimizerOptions::SetDefaultPrecision(
double prec) {
58 Minim::gDefaultPrecision = prec;
60 void MinimizerOptions::SetDefaultMaxFunctionCalls(
int maxcall) {
62 Minim::gDefaultMaxCalls = maxcall;
64 void MinimizerOptions::SetDefaultMaxIterations(
int maxiter) {
66 Minim::gDefaultMaxIter = maxiter;
68 void MinimizerOptions::SetDefaultStrategy(
int stra) {
70 Minim::gDefaultStrategy = stra;
72 void MinimizerOptions::SetDefaultPrintLevel(
int level) {
74 Minim::gDefaultPrintLevel = level;
76 void MinimizerOptions::SetDefaultExtraOptions(
const IOptions * extraoptions) {
78 delete Minim::gDefaultExtraOptions;
79 Minim::gDefaultExtraOptions = (extraoptions) ? extraoptions->Clone() : 0;
82 const std::string & MinimizerOptions::DefaultMinimizerAlgo() {
return Minim::gDefaultMinimAlgo; }
83 double MinimizerOptions::DefaultErrorDef() {
return Minim::gDefaultErrorDef; }
84 double MinimizerOptions::DefaultTolerance() {
return Minim::gDefaultTolerance; }
85 double MinimizerOptions::DefaultPrecision() {
return Minim::gDefaultPrecision; }
86 int MinimizerOptions::DefaultMaxFunctionCalls() {
return Minim::gDefaultMaxCalls; }
87 int MinimizerOptions::DefaultMaxIterations() {
return Minim::gDefaultMaxIter; }
88 int MinimizerOptions::DefaultStrategy() {
return Minim::gDefaultStrategy; }
89 int MinimizerOptions::DefaultPrintLevel() {
return Minim::gDefaultPrintLevel; }
90 IOptions * MinimizerOptions::DefaultExtraOptions() {
return Minim::gDefaultExtraOptions; }
92 const std::string & MinimizerOptions::DefaultMinimizerType()
97 #ifdef MATH_NO_PLUGIN_MANAGER
98 if (Minim::gDefaultMinimizer.size() != 0)
99 return Minim::gDefaultMinimizer;
101 Minim::gDefaultMinimizer =
"Minuit2";
104 R__READ_LOCKGUARD(ROOT::gCoreMutex);
106 if (Minim::gDefaultMinimizer.size() != 0)
107 return Minim::gDefaultMinimizer;
109 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
113 if (Minim::gDefaultMinimizer.size() != 0)
114 return Minim::gDefaultMinimizer;
118 Minim::gDefaultMinimizer = gEnv->GetValue(
"Root.Fitter",
"Minuit");
121 return Minim::gDefaultMinimizer;
125 MinimizerOptions::MinimizerOptions():
130 ResetToDefaultOptions();
134 MinimizerOptions::MinimizerOptions(
const MinimizerOptions & opt) : fExtraOptions(0) {
139 MinimizerOptions & MinimizerOptions::operator=(
const MinimizerOptions & opt) {
141 if (
this == &opt)
return *
this;
143 fMaxCalls = opt.fMaxCalls;
144 fMaxIter = opt.fMaxIter;
145 fStrategy = opt.fStrategy;
146 fErrorDef = opt.fErrorDef;
147 fTolerance = opt.fTolerance;
148 fPrecision = opt.fPrecision;
149 fMinimType = opt.fMinimType;
150 fAlgoType = opt.fAlgoType;
152 delete fExtraOptions;
153 fExtraOptions = (opt.fExtraOptions) ? (opt.fExtraOptions)->Clone() : 0;
158 MinimizerOptions::~MinimizerOptions() {
159 delete fExtraOptions;
162 void MinimizerOptions::ResetToDefaultOptions() {
163 fLevel = Minim::gDefaultPrintLevel;
164 fMaxCalls = Minim::gDefaultMaxCalls;
165 fMaxIter = Minim::gDefaultMaxIter;
166 fStrategy = Minim::gDefaultStrategy;
167 fErrorDef = Minim::gDefaultErrorDef;
168 fTolerance = Minim::gDefaultTolerance;
169 fPrecision = Minim::gDefaultPrecision;
171 fMinimType = MinimizerOptions::DefaultMinimizerType();
173 fAlgoType = Minim::gDefaultMinimAlgo;
176 if (fMinimType ==
"TMinuit") fMinimType =
"Minuit";
177 else if (fMinimType ==
"Fumili2") {
178 fMinimType =
"Minuit2";
179 fAlgoType =
"Fumili";
181 else if (fMinimType ==
"GSLMultiMin" && fAlgoType ==
"Migrad")
184 delete fExtraOptions;
187 if (Minim::gDefaultExtraOptions)
188 fExtraOptions = Minim::gDefaultExtraOptions->Clone();
190 IOptions * gopts = FindDefault( fMinimType.c_str() );
191 if (gopts) fExtraOptions = gopts->Clone();
195 void MinimizerOptions::SetExtraOptions(
const IOptions & opt) {
197 delete fExtraOptions;
198 fExtraOptions = opt.Clone();
201 void MinimizerOptions::Print(std::ostream & os)
const {
203 os << std::setw(25) <<
"Minimizer Type" <<
" : " << std::setw(15) << fMinimType << std::endl;
204 os << std::setw(25) <<
"Minimizer Algorithm" <<
" : " << std::setw(15) << fAlgoType << std::endl;
205 os << std::setw(25) <<
"Strategy" <<
" : " << std::setw(15) << fStrategy << std::endl;
206 os << std::setw(25) <<
"Tolerance" <<
" : " << std::setw(15) << fTolerance << std::endl;
207 os << std::setw(25) <<
"Max func calls" <<
" : " << std::setw(15) << fMaxCalls << std::endl;
208 os << std::setw(25) <<
"Max iterations" <<
" : " << std::setw(15) << fMaxIter << std::endl;
209 os << std::setw(25) <<
"Func Precision" <<
" : " << std::setw(15) << fPrecision << std::endl;
210 os << std::setw(25) <<
"Error definition" <<
" : " << std::setw(15) << fErrorDef << std::endl;
211 os << std::setw(25) <<
"Print Level" <<
" : " << std::setw(15) << fLevel << std::endl;
213 if (ExtraOptions()) {
214 os << fMinimType <<
" specific options :" << std::endl;
215 ExtraOptions()->Print(os);
219 IOptions & MinimizerOptions::Default(
const char * name) {
221 return GenAlgoOptions::Default(name);
224 IOptions * MinimizerOptions::FindDefault(
const char * name) {
226 return GenAlgoOptions::FindDefault(name);
229 void MinimizerOptions::PrintDefault(
const char * name, std::ostream & os) {
231 MinimizerOptions tmp;
233 if (!tmp.ExtraOptions() ) {
234 IOptions * opt = FindDefault(name);
235 os <<
"Specific options for " << name << std::endl;
236 if (opt) opt->Print(os);