BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
DistributionHandler.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Param/Distrib/DistributionHandler.cpp
6 //! @brief Implements class DistributionHandler.
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 "Base/Types/Exceptions.h"
19 
21 {
22  setName("DistributionHandler");
23 }
24 
26 
28 {
29  if (par_distr.getNbrSamples() > 0) {
30  m_distributions.push_back(par_distr);
31  m_nbr_combinations *= par_distr.getNbrSamples();
32  m_cached_samples.push_back(par_distr.generateSamples());
33  }
34 }
35 
37 {
38  return m_nbr_combinations;
39 }
40 
41 double DistributionHandler::setParameterValues(ParameterPool* p_parameter_pool, size_t index)
42 {
43  if (index >= m_nbr_combinations)
45  "DistributionWeighter::setParameterValues: "
46  "index must be smaller than the total number of parameter combinations");
47  size_t n_distr = m_distributions.size();
48  double weight = 1.0;
49  if (n_distr == 0)
50  return weight;
51  for (size_t param_index = n_distr - 1;; --param_index) {
52  size_t remainder = index % m_distributions[param_index].getNbrSamples();
53  index /= m_distributions[param_index].getNbrSamples();
54  int changed = p_parameter_pool->setMatchedParametersValue(
55  m_distributions[param_index].getMainParameterName(),
56  m_cached_samples[param_index][remainder].value);
57  if (changed != 1) {
58  throw Exceptions::RuntimeErrorException("DistributionWeighter::setParameterValues: "
59  "parameter name matches nothing or more than "
60  "one parameter");
61  }
62  weight *= m_cached_samples[param_index][remainder].weight;
63  if (param_index == 0)
64  break;
65  }
66  return weight;
67 }
68 
70 {
71  for (auto& distribution : m_distributions) {
72  const std::string par_name = distribution.getMainParameterName();
73  const double mean_val = distribution.getDistribution()->getMean();
74  if (p_parameter_pool->setMatchedParametersValue(par_name, mean_val) != 1)
75  throw std::runtime_error("Error in DistributionHandler::setParameterToMeans: parameter "
76  "name matches nothing or more than "
77  "one parameter");
78  }
79 }
80 
82 {
83  return m_distributions;
84 }
Defines class DistributionHandler.
Defines classes representing one-dimensional distributions.
Defines many exception classes in namespace Exceptionss.
Defines class ParameterPool.
Distributions_t m_distributions
void addParameterDistribution(const std::string &param_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
add a sampled parameter distribution
const Distributions_t & getDistributions() const
virtual ~DistributionHandler()
double setParameterValues(ParameterPool *p_parameter_pool, size_t index)
set the parameter values of the simulation object to a specific combination of values,...
std::vector< ParameterDistribution > Distributions_t
void setParameterToMeans(ParameterPool *p_parameter_pool) const
Sets mean distribution values to the parameter pool.
size_t getTotalNumberOfSamples() const
get the total number of parameter value combinations (product of the individual sizes of each paramet...
std::vector< std::vector< ParameterSample > > m_cached_samples
void setName(const std::string &name)
A parametric distribution function, for use with any model parameter.
size_t getNbrSamples() const
get number of samples for this distribution
std::vector< ParameterSample > generateSamples() const
generate list of sampled values with their weight
Container with parameters for IParameterized object.
Definition: ParameterPool.h:30
int setMatchedParametersValue(const std::string &wildcards, double value)
Sets value of the nonzero parameters that match pattern ('*' allowed), or throws.