BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MinimizerTestPlan.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Fit/TestEngine/MinimizerTestPlan.cpp
6 //! @brief Implements class MinimizerTestPlan
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/Param/Parameters.h"
17 #include <cmath>
18 #include <iostream>
19 #include <sstream>
20 
21 namespace {
22 
23 //! Returns the safe relative difference, which is 2(|a-b|)/(|a|+|b|) except in special cases.
24 double relativeDifference(double a, double b)
25 {
26  constexpr double eps = std::numeric_limits<double>::epsilon();
27  const double avg_abs = (std::abs(a) + std::abs(b)) / 2.0;
28  // return 0.0 if relative error smaller than epsilon
29  if (std::abs(a - b) <= eps * avg_abs)
30  return 0.0;
31  return std::abs(a - b) / avg_abs;
32 }
33 
34 } // namespace
35 
36 using namespace mumufit;
37 
38 MinimizerTestPlan::MinimizerTestPlan(const std::string& name) : m_name(name) {}
39 
41 
42 void MinimizerTestPlan::addParameter(const Parameter& param, double expected_value,
43  double tolerance)
44 {
45  m_parameter_plan.push_back(ParameterPlan(param, expected_value, tolerance));
46 }
47 
48 //! Returns fit parameters which will be used as initial one for the minimization.
49 
51 {
52  Parameters result;
53  for (const auto& plan : m_parameter_plan)
54  result.add(plan.fitParameter());
55 
56  return result;
57 }
58 
59 //! Return vector of expected parameter values.
60 
61 std::vector<double> MinimizerTestPlan::expectedValues() const
62 {
63  std::vector<double> result;
64  for (const auto& plan : m_parameter_plan)
65  result.push_back(plan.expectedValue());
66 
67  return result;
68 }
69 
70 //! Returns true if given values coincide with expected fit parameter values.
71 
72 bool MinimizerTestPlan::valuesAsExpected(const std::vector<double>& values) const
73 {
74  bool success(true);
75 
76  if (m_parameter_plan.size() != values.size())
77  throw std::runtime_error("FunctionTestPlan::valuesAsExpected() -> Error. Sizes differ.");
78 
79  size_t index(0);
80  std::ostringstream text;
81  for (const auto& plan : m_parameter_plan) {
82  double diff = relativeDifference(values[index], plan.expectedValue());
83 
84  bool diff_ok(true);
85  if (diff > plan.tolerance())
86  diff_ok = false;
87 
88  text << plan.fitParameter().name() << " found:" << values[index]
89  << " expected:" << plan.expectedValue() << " diff:" << diff << " "
90  << (diff_ok ? "OK" : "FAILED") << "\n";
91 
92  success &= diff_ok;
93 
94  ++index;
95  }
96 
97  std::cout << text.str();
98 
99  return success;
100 }
Defines class MinimizerTestPlan.
Defines class Parameters.
std::vector< double > expectedValues() const
Return vector of expected parameter values.
MinimizerTestPlan(const std::string &name)
bool valuesAsExpected(const std::vector< double > &values) const
Returns true if given values coincide with expected fit parameter values.
mumufit::Parameters parameters() const
Returns fit parameters which will be used as initial one for the minimization.
virtual ~MinimizerTestPlan()
std::vector< ParameterPlan > m_parameter_plan
void addParameter(const mumufit::Parameter &param, double expected_value, double tolerance=0.01)
Defines initial settings of single fit parameter and the final value which has to be found in the cou...
Definition: ParameterPlan.h:28
A fittable parameter with value, error, step, and limits.
Definition: Parameter.h:26
A collection of fit parameters.
Definition: Parameters.h:26
void add(const Parameter &par)
Definition: Parameters.cpp:22
QString const & name(EShape k)
Definition: particles.cpp:21
The multi-library, multi-algorithm fit wrapper library.