BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GeneticMinimizer.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Fit/Adapter/GeneticMinimizer.cpp
6 //! @brief Implements class GeneticMinimizer.
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 <Math/GeneticMinimizer.h>
17 
18 namespace {
19 
20 std::map<int, std::string> statusDescription()
21 {
22  std::map<int, std::string> result;
23  result[0] = "OK, minimum found";
24  result[1] = "Maximum number of iterations reached";
25  return result;
26 }
27 } // namespace
28 
30  : MinimizerAdapter(MinimizerInfo::buildGeneticInfo())
31  , m_genetic_minimizer(new ROOT::Math::GeneticMinimizer())
32 {
33  addOption("Tolerance", 0.01, "Tolerance on the function value at the minimum");
34  addOption("PrintLevel", 0, "Minimizer internal print level");
35  addOption("MaxIterations", 3, "Maximum number of iterations");
36  addOption("PopSize", 300, "Population size");
37  addOption("RandomSeed", 0, "Random seed");
38 
39  // Seems it is not used inside Root, no need to expose
40  // addOption("Cycles", 3, "Number of cycles");
41 
42  // It's hard to understand (without going to much into genetics details), what parameters below
43  // are doing. So better to not to expose and rely on their internal ROOT's default values.
44 
45  // addOption("sc_steps", 10, "Spread control steps");
46  // addOption("sc_rate", 5, "Spread control rate");
47  // addOption("sc_factor", 0.95, "Spread control factor");
48 }
49 
51 
53 {
54  setOptionValue("Tolerance", value);
55 }
56 
58 {
59  return optionValue<double>("Tolerance");
60 }
61 
63 {
64  setOptionValue("PrintLevel", value);
65 }
66 
68 {
69  return optionValue<int>("PrintLevel");
70 }
71 
73 {
74  setOptionValue("MaxIterations", value);
75 }
76 
78 {
79  return optionValue<int>("MaxIterations");
80 }
81 
83 {
84  setOptionValue("PopSize", value);
85 }
86 
88 {
89  return optionValue<int>("PopSize");
90 }
91 
93 {
94  setOptionValue("RandomSeed", value);
95 }
96 
98 {
99  return optionValue<int>("RandomSeed");
100 }
101 
102 void GeneticMinimizer::setParameter(unsigned int index, const mumufit::Parameter& par)
103 {
104  if (!par.limits().isFixed() && !par.limits().isLimited()) {
105  std::ostringstream ostr;
106  ostr << "GeneticMinimizer::setParameter() -> Error! "
107  << "Genetic minimizer requires either fixed or "
108  << "limited AttLimits::limited(left,right) parameter. "
109  << " Parameter name '" << par.name() << "', limits:" << par.limits().toString();
110  throw std::runtime_error(ostr.str());
111  }
112  MinimizerAdapter::setParameter(index, par);
113 }
114 
116 {
117  return statusDescription()[rootMinimizer()->Status()];
118 }
119 
120 std::map<std::string, std::string> GeneticMinimizer::statusMap() const
121 {
122  auto result = MinimizerAdapter::statusMap();
123  result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
124  return result;
125 }
126 
128 {
129  ROOT::Math::GeneticMinimizerParameters pars;
130  pars.fPopSize = populationSize();
131  pars.fNsteps = maxIterations();
132  // pars.fCycles = m_options.getIntValue("Cycles"); // seems it's not used inside ROOT
133  // pars.fSC_steps = m_options.getIntValue("SC_steps"); // no idea what it is doing
134  // pars.fSC_rate = m_options.getIntValue("SC_rate"); // no idea what it is doing
135  // pars.fSC_factor = m_options.getRealValue("SC_factor"); // no idea what it is doing
136  const double scale_as_in_root = 10.0;
137  pars.fConvCrit = scale_as_in_root * tolerance();
138  pars.fSeed = randomSeed();
139  m_genetic_minimizer->SetParameters(pars);
140 }
141 
143 {
144  return m_genetic_minimizer.get();
145 }
Declares class GeneticMinimizer.
std::string toString() const
Definition: AttLimits.cpp:112
bool isFixed() const
Definition: AttLimits.cpp:61
bool isLimited() const
Definition: AttLimits.cpp:66
Wrapper for the CERN ROOT Genetic minimizer.
void setTolerance(double value)
Sets tolerance on the function value at the minimum.
int printLevel() const
double tolerance() const
void setPopulationSize(int value)
Sets population size.
virtual void setParameter(unsigned int index, const mumufit::Parameter &par)
std::unique_ptr< ROOT::Math::GeneticMinimizer > m_genetic_minimizer
std::map< std::string, std::string > statusMap() const override
Returns map of string representing different minimizer statuses.
const root_minimizer_t * rootMinimizer() const override
std::string statusToString() const override
Returns string representation of current minimizer status.
void propagateOptions() override
int randomSeed() const
void setPrintLevel(int value)
Sets minimizer internal print level.
void setRandomSeed(int value)
Sets random seed.
int populationSize() const
void setMaxIterations(int value)
Sets maximum number of iterations to try at each step.
int maxIterations() const
Abstract base class that adapts the CERN ROOT minimizer to our IMinimizer.
virtual std::map< std::string, std::string > statusMap() const
Returns map of string representing different minimizer statuses.
virtual void setParameter(unsigned int index, const mumufit::Parameter &par)
OptionContainer::option_t addOption(const std::string &optionName, T value, const std::string &description="")
ROOT::Math::Minimizer root_minimizer_t
void setOptionValue(const std::string &optionName, T value)
Info about a minimizer, including list of defined minimization algorithms.
Definition: MinimizerInfo.h:48
A fittable parameter with value, error, step, and limits.
Definition: Parameter.h:26
std::string name() const
Definition: Parameter.cpp:44
AttLimits limits() const
Definition: Parameter.cpp:54
Various mathematical functions.
Definition: Bessel.h:26