BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
Minuit2Minimizer.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Fit/Adapter/Minuit2Minimizer.cpp
6 //! @brief Declares class Minuit2Minimizer.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "Fit/Tools/StringUtils.h"
18 
19 namespace {
20 
21 std::map<int, std::string> statusDescription()
22 {
23  std::map<int, std::string> result;
24  result[0] = "OK, valid minimum";
25  result[1] = "Didn't converge, covariance was made pos defined";
26  result[2] = "Didn't converge, Hessian is invalid";
27  result[3] = "Didn't converge, Edm is above max";
28  result[4] = "Didn't converge, reached call limit";
29  result[5] = "Didn't converge, unknown failure";
30  return result;
31 }
32 
33 std::map<int, std::string> covmatrixStatusDescription()
34 {
35  std::map<int, std::string> result;
36  result[-1] = "Not available (inversion failed or Hessian failed)";
37  result[0] = "Available but not positive defined";
38  result[1] = "Covariance only approximate";
39  result[2] = "Full matrix but forced pos def";
40  result[3] = "Full accurate";
41  return result;
42 }
43 
44 } // namespace
45 
46 Minuit2Minimizer::Minuit2Minimizer(const std::string& algorithmName)
47  : MinimizerAdapter(MinimizerInfo::buildMinuit2Info(algorithmName))
48  , m_minuit2_minimizer(new ROOT::Minuit2::Minuit2Minimizer(algorithmName.c_str()))
49 {
50  addOption("Strategy", 1, "Minimization strategy (0-low, 1-medium, 2-high quality)");
51  addOption("ErrorDef", 1.0, "Error definition factor for parameter error calculation");
52  addOption("Tolerance", 0.01, "Tolerance on the function value at the minimum");
53  addOption("Precision", -1.0, "Relative floating point arithmetic precision");
54  addOption("PrintLevel", 0, "Minimizer internal print level");
55  addOption("MaxFunctionCalls", 0, "Maximum number of function calls");
56 }
57 
59 
61 {
62  setOptionValue("Strategy", value);
63 }
64 
66 {
67  return optionValue<int>("Strategy");
68 }
69 
71 {
72  setOptionValue("ErrorDef", value);
73 }
74 
76 {
77  return optionValue<double>("ErrorDef");
78 }
79 
81 {
82  setOptionValue("Tolerance", value);
83 }
84 
86 {
87  return optionValue<double>("Tolerance");
88 }
89 
91 {
92  setOptionValue("Precision", value);
93 }
94 
96 {
97  return optionValue<double>("Precision");
98 }
99 
101 {
102  setOptionValue("PrintLevel", value);
103 }
104 
106 {
107  return optionValue<int>("PrintLevel");
108 }
109 
111 {
112  setOptionValue("MaxFunctionCalls", value);
113 }
114 
116 {
117  return optionValue<int>("MaxFunctionCalls");
118 }
119 
121 {
122  return statusDescription()[rootMinimizer()->Status()];
123 }
124 
125 std::map<std::string, std::string> Minuit2Minimizer::statusMap() const
126 {
127  auto result = MinimizerAdapter::statusMap();
128  result["Edm"] = mumufit::stringUtils::scientific(rootMinimizer()->Edm());
129  result["CovMatrixStatus"] = covmatrixStatusDescription()[rootMinimizer()->CovMatrixStatus()];
130  result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
131  return result;
132 }
133 
134 // Fumili algorithm can work only with gradient based objective function, while others can
135 // work with both, gradient based and chi2 based functions. Historically however, we use
136 // simplified approach: if not Fumili, then chi2 only. Think of refactoring TODO.
138 {
139  return algorithmName() == "Fumili";
140 }
141 
142 //! Propagate options down to ROOT's Minuit2Minimizer.
143 
145 {
146  m_minuit2_minimizer->SetStrategy(strategy());
147  m_minuit2_minimizer->SetErrorDef(errorDefinition());
148  m_minuit2_minimizer->SetTolerance(tolerance());
149  m_minuit2_minimizer->SetPrecision(precision());
150  m_minuit2_minimizer->SetPrintLevel(printLevel());
151  m_minuit2_minimizer->SetMaxFunctionCalls(static_cast<unsigned int>(maxFunctionCalls()));
152 }
153 
155 {
156  return m_minuit2_minimizer.get();
157 }
Declares class Minuit2Minimizer.
Defines a few helper functions.
Abstract base class that adapts the CERN ROOT minimizer to our IMinimizer.
std::string algorithmName() const override
Returns name of the minimization algorithm.
virtual std::map< std::string, std::string > statusMap() const
Returns map of string representing different minimizer statuses.
OptionContainer::option_t addOption(const std::string &optionName, T value, const std::string &description="")
void setOptionValue(const std::string &optionName, T value)
Info about a minimizer, including list of defined minimization algorithms.
Definition: MinimizerInfo.h:43
Wrapper for the CERN ROOT facade of the Minuit2 minimizer. See Minuit2 user manual https://root....
void setPrecision(double value)
Sets relative floating point arithmetic precision. Should be adjusted when the user knows that object...
double tolerance() const
void propagateOptions() override
Propagate options down to ROOT's Minuit2Minimizer.
Minuit2Minimizer(const std::string &algorithmName="Migrad")
void setMaxFunctionCalls(int value)
Sets maximum number of objective function calls.
std::unique_ptr< ROOT::Minuit2::Minuit2Minimizer > m_minuit2_minimizer
void setPrintLevel(int value)
Sets minimizer internal print level. Default value is 0 (silent).
void setStrategy(int value)
Sets minimization strategy (0-low, 1-medium, 2-high minimization quality). At low quality number of f...
int maxFunctionCalls() const
double precision() const
std::string statusToString() const override
Returns string representation of current minimizer status.
void setTolerance(double value)
Sets tolerance on the function value at the minimum. Minimization will stop when the estimated vertic...
void setErrorDefinition(double value)
Sets error definition factor for parameter error calculation. If objective function (OF) is the usual...
std::map< std::string, std::string > statusMap() const override
Returns map of string representing different minimizer statuses.
bool requiresResiduals() override
Returns true if minimizer computations are residual-based, false otherwise.
double errorDefinition() const
const root_minimizer_t * rootMinimizer() const override
~Minuit2Minimizer() override
virtual int CovMatrixStatus() const
return status of covariance matrix using Minuit convention {0 not calculated 1 approximated 2 made po...
Definition: Minimizer.h:318
int Status() const
status code of minimizer
Definition: Minimizer.h:430
Definition: TUUID.h:7
std::string scientific(T value, int n=10)
Returns scientific string representing given value of any numeric type.
Definition: StringUtils.h:40