BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GSLLevenbergMarquardtMinimizer.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp
6 //! @brief Implements class GSLLevenbergMarquardtMinimizer.
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 
18 #include "Fit/Tools/StringUtils.h"
19 #include <stdexcept>
20 
21 #ifdef _WIN32
22 #pragma warning(push)
23 #pragma warning(disable : 4267)
24 #include <Math/GSLNLSMinimizer.h>
25 #pragma warning(pop)
26 #else
27 #pragma GCC diagnostic push
28 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
29 #include <Math/GSLNLSMinimizer.h>
30 #pragma GCC diagnostic pop
31 #endif
32 
33 namespace
34 {
35 
36 std::map<int, std::string> covmatrixStatusDescription()
37 {
38  std::map<int, std::string> result;
39  result[0] = "Covariance matrix was not computed";
40  result[1] = "Covariance matrix approximate because minimum is not valid";
41  result[3] = "Covariance matrix OK";
42  return result;
43 }
44 
45 } // namespace
46 
48  : RootMinimizerAdapter(MinimizerInfo::buildGSLLMAInfo()),
49  m_gsl_minimizer(new ROOT::Math::GSLNLSMinimizer(2))
50 {
51  addOption("Tolerance", 0.01, "Tolerance on the function value at the minimum");
52  addOption("PrintLevel", 0, "Minimizer internal print level");
53  addOption("MaxIterations", 0, "Maximum number of iterations");
54 }
55 
57 
59 {
60  setOptionValue("Tolerance", value);
61 }
62 
64 {
65  return optionValue<double>("Tolerance");
66 }
67 
69 {
70  setOptionValue("PrintLevel", value);
71 }
72 
74 {
75  return optionValue<int>("PrintLevel");
76 }
77 
79 {
80  setOptionValue("MaxIterations", value);
81 }
82 
84 {
85  return optionValue<int>("MaxIterations");
86 }
87 
89 {
91 }
92 
93 std::map<std::string, std::string> GSLLevenbergMarquardtMinimizer::statusMap() const
94 {
95  auto result = RootMinimizerAdapter::statusMap();
96  result["Edm"] = StringUtils::scientific(rootMinimizer()->Edm());
97  result["CovMatrixStatus"] = covmatrixStatusDescription()[rootMinimizer()->CovMatrixStatus()];
98  result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
99  return result;
100 }
101 
103 {
104  m_gsl_minimizer->SetTolerance(tolerance());
105  m_gsl_minimizer->SetPrintLevel(printLevel());
106  m_gsl_minimizer->SetMaxIterations(static_cast<unsigned int>(maxIterations()));
107 }
108 
110 {
111  return m_gsl_minimizer.get();
112 }
113 
115 {
116  auto limits = par.limits();
117  if (!limits.isLimitless() && !limits.isFixed())
118  throw std::runtime_error("GSLLMA minimizer can't handle limited parameters."
119  "Please make them free");
121 }
Declares class GSLLevenbergMarquardtMinimizer.
Declares class GSLMultiMinimizer.
Declares namespace MinimizerUtils.
Defines a few helper functions.
A fittable parameter with value, error, step, and limits.
Definition: Parameter.h:28
AttLimits limits() const
Definition: Parameter.cpp:51
void setMaxIterations(int value)
Sets maximum number of iterations.
~GSLLevenbergMarquardtMinimizer() override
void setTolerance(double value)
Sets tolerance on the function value at the minimum.
std::unique_ptr< ROOT::Math::GSLNLSMinimizer > m_gsl_minimizer
void setParameter(unsigned int index, const Fit::Parameter &par) override
std::string statusToString() const override
Returns string representation of current minimizer status.
const root_minimizer_t * rootMinimizer() const override
void setPrintLevel(int value)
Sets minimizer internal print level.
std::map< std::string, std::string > statusMap() const override
Returns map of string representing different minimizer statuses.
Info about a minimizer, including list of defined minimization algorithms.
Definition: MinimizerInfo.h:45
Pure virtual interface that adapts the CERN ROOT minimizer to our IMinimizer.
OptionContainer::option_t addOption(const std::string &optionName, T value, const std::string &description="")
void setOptionValue(const std::string &optionName, T value)
ROOT::Math::Minimizer root_minimizer_t
virtual void setParameter(unsigned int index, const Fit::Parameter &par)
virtual std::map< std::string, std::string > statusMap() const
Returns map of string representing different minimizer statuses.
std::string gslErrorDescription(int errorCode)
std::string scientific(const T value, int n=10)
Returns scientific string representing given value of any numeric type.
Definition: StringUtils.h:54