BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Parameters.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Fit/Kernel/Parameters.cpp
6 //! @brief Defines class Parameters.
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 
15 #include "Fit/Kernel/Parameters.h"
16 #include <cmath>
17 #include <sstream>
18 #include <stdexcept>
19 
20 using namespace Fit;
21 
22 void Parameters::add(const Parameter& par)
23 {
24  if (exists(par.name()))
25  throw std::runtime_error("Parameters::add() -> Error. Parameter with the name '"
26  + par.name() + "' already exists.");
27 
28  m_parameters.push_back(par);
29 }
30 
32 {
33  return m_parameters.begin();
34 }
35 
37 {
38  return m_parameters.end();
39 }
40 
42 {
43  return m_parameters.begin();
44 }
45 
47 {
48  return m_parameters.end();
49 }
50 
51 size_t Parameters::size() const
52 {
53  return m_parameters.size();
54 }
55 
56 std::vector<double> Parameters::values() const
57 {
58  std::vector<double> result;
59  for (const auto& par : m_parameters)
60  result.push_back(par.value());
61  return result;
62 }
63 
64 void Parameters::setValues(const std::vector<double>& values)
65 {
67 
68  size_t index = 0;
69  for (auto& par : m_parameters) {
70  if (std::isnan(values[index]))
71  throw std::runtime_error("Parameters::setValues() -> Error."
72  " Attempt to set nan '"
73  + par.name() + "'.");
74  if (std::isinf(values[index]))
75  throw std::runtime_error("Parameters::setValues() -> Error. Attempt to set inf '"
76  + par.name() + "'.");
77  par.setValue(values[index]);
78  ++index;
79  }
80 }
81 
82 std::vector<double> Parameters::errors() const
83 {
84  std::vector<double> result;
85  for (const auto& par : m_parameters)
86  result.push_back(par.error());
87  return result;
88 }
89 
90 void Parameters::setErrors(const std::vector<double>& errors)
91 {
93  size_t index = 0;
94  for (auto& par : m_parameters)
95  par.setError(errors[index++]);
96 }
97 
98 const Parameter& Parameters::operator[](const std::string& name) const
99 {
100  for (const auto& par : m_parameters)
101  if (par.name() == name)
102  return par;
103 
104  std::ostringstream ostr;
105  ostr << "Parameters::operator[] -> Error. No parameter with name '" << name << "'. ";
106  ostr << "Existing names:\n";
107  for (const auto& par : m_parameters)
108  ostr << par.name() << "\n";
109  throw std::runtime_error(ostr.str());
110 }
111 
112 const Parameter& Parameters::operator[](size_t index) const
113 {
114  return m_parameters[check_index(index)];
115 }
116 
118 {
119  return m_corr_matrix;
120 }
121 
123 {
124  if (matrix.size() != size())
125  throw std::runtime_error("Parameters::setCorrelationMatrix() -> Error. Wrong "
126  "dimension of correlation matrix.");
127  m_corr_matrix = matrix;
128 }
129 
130 //! Returns number of free parameters.
131 
133 {
134  size_t result(0);
135  for (const auto& par : m_parameters)
136  if (!par.limits().isFixed())
137  result++;
138  return result;
139 }
140 
141 bool Parameters::exists(const std::string& name) const
142 {
143  for (const auto& par : m_parameters)
144  if (par.name() == name)
145  return true;
146  return false;
147 }
148 
149 void Parameters::check_array_size(const std::vector<double>& values) const
150 {
151  if (values.size() != m_parameters.size()) {
152  std::ostringstream ostr;
153  ostr << "Parameters::check_array_size() -> Error. Size of input array " << values.size()
154  << " doesn't mach number of fit parameters " << m_parameters.size() << "."
155  << std::endl;
156  throw std::runtime_error(ostr.str());
157  }
158 }
159 
160 size_t Parameters::check_index(size_t index) const
161 {
162  if (index >= m_parameters.size())
163  throw std::runtime_error("Parameters::check_index() -> Index out of bounds");
164  return index;
165 }
Defines class Parameters.
A fittable parameter with value, error, step, and limits.
Definition: Parameter.h:28
std::string name() const
Definition: Parameter.cpp:41
std::vector< double > values() const
Definition: Parameters.cpp:56
const Parameter & operator[](const std::string &name) const
Definition: Parameters.cpp:98
corr_matrix_t correlationMatrix() const
Definition: Parameters.cpp:117
const_iterator end() const
Definition: Parameters.cpp:36
corr_matrix_t m_corr_matrix
correlation matrix
Definition: Parameters.h:67
size_t check_index(size_t index) const
Definition: Parameters.cpp:160
void setValues(const std::vector< double > &values)
Definition: Parameters.cpp:64
bool exists(const std::string &parameter_name) const
Definition: Parameters.cpp:141
size_t freeParameterCount() const
Returns number of free parameters.
Definition: Parameters.cpp:132
void setCorrelationMatrix(const corr_matrix_t &matrix)
Definition: Parameters.cpp:122
const_iterator begin() const
Definition: Parameters.cpp:31
parameters_t::const_iterator const_iterator
Definition: Parameters.h:31
void setErrors(const std::vector< double > &errors)
Definition: Parameters.cpp:90
parameters_t m_parameters
Definition: Parameters.h:66
size_t size() const
Definition: Parameters.cpp:51
std::vector< double > errors() const
Definition: Parameters.cpp:82
void add(const Parameter &par)
Definition: Parameters.cpp:22
std::vector< std::vector< double > > corr_matrix_t
Definition: Parameters.h:33
void check_array_size(const std::vector< double > &values) const
Definition: Parameters.cpp:149
parameters_t::iterator iterator
Definition: Parameters.h:32
Objective function types.