BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
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 
39 
40 void MinimizerTestPlan::addParameter(const Parameter& param, double expected_value,
41  double tolerance)
42 {
43  m_parameter_references.push_back({param, expected_value, tolerance});
44 }
45 
46 //! Returns fit parameters which will be used as initial one for the minimization.
47 
49 {
50  Parameters result;
51  for (const auto& ref : m_parameter_references)
52  result.add(ref.parameter);
53 
54  return result;
55 }
56 
57 //! Return vector of expected parameter values.
58 
59 std::vector<double> MinimizerTestPlan::expectedValues() const
60 {
61  std::vector<double> result;
62  for (const ParameterReference& ref : m_parameter_references)
63  result.push_back(ref.expected_value);
64 
65  return result;
66 }
67 
68 //! Returns true if given values coincide with expected fit parameter values.
69 
70 bool MinimizerTestPlan::valuesAsExpected(const std::vector<double>& values) const
71 {
72  bool success = true;
73 
74  if (m_parameter_references.size() != values.size())
75  throw std::runtime_error("FunctionTestPlan::valuesAsExpected() -> Error. Sizes differ.");
76 
77  for (size_t i = 0; i < values.size(); ++i) {
78  const ParameterReference& ref = m_parameter_references[i];
79  double diff = relativeDifference(values[i], ref.expected_value);
80 
81  bool ok = diff <= ref.tolerance;
82 
83  std::cout << ref.parameter.name() << " found:" << values[i]
84  << " expected:" << ref.expected_value << " diff:" << diff << " "
85  << (ok ? "OK" : "FAILED") << std::endl;
86 
87  success &= ok;
88  }
89 
90  return success;
91 }
Defines class MinimizerTestPlan.
Defines class Parameters.
std::vector< double > expectedValues() const
Return vector of expected parameter values.
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()
void addParameter(const mumufit::Parameter &param, double expected_value, double tolerance=0.01)
A fittable parameter with value, error, step, and limits.
Definition: Parameter.h:26
std::string name() const
Definition: Parameter.cpp:53
A collection of fit parameters.
Definition: Parameters.h:26
void add(const Parameter &par)
Definition: Parameters.cpp:22
double relativeDifference(double a, double b)
Returns the safe relative difference, which is 2(|a-b|)/(|a|+|b|) except in special cases.
Definition: Numeric.cpp:29
The multi-library, multi-algorithm fit wrapper library.
Defines initial settings of single fit parameter and the final value which has to be found in the cou...
const mumufit::Parameter parameter
initial parameter settings
const double tolerance
tolerance on found value wrt expected value
const double expected_value
expected value to find in the fit