BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
DistributionHandler.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
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/Util/Assert.h"
18 
20  : m_nbr_combinations(1)
21 {
22 }
23 
25 
27 {
28  if (par_distr.nDraws() > 0) {
29  m_distributions.push_back(par_distr);
30  m_nbr_combinations *= par_distr.nDraws();
31  m_cached_samples.push_back(par_distr.generateSamples());
32  }
33 }
34 
36 {
37  return m_nbr_combinations;
38 }
39 
41 {
42  ASSERT(index < m_nbr_combinations);
43 
44  size_t n_distr = m_distributions.size();
45  double weight = 1.0;
46  if (n_distr == 0)
47  return weight;
48  for (size_t param_index = n_distr - 1;; --param_index) {
49  const auto& distribution = m_distributions[param_index];
50  size_t remainder = index % distribution.nDraws();
51  index /= distribution.nDraws();
52 
53  // set the value in the ISimulation instance (via callback)
54  ASSERT(m_setValueFunctions.count(&distribution) == 1);
55  m_setValueFunctions[&distribution](m_cached_samples[param_index][remainder].value);
56 
57  weight *= m_cached_samples[param_index][remainder].weight;
58  if (param_index == 0)
59  break;
60  }
61  return weight;
62 }
63 
64 const std::vector<ParameterDistribution>& DistributionHandler::getDistributions() const
65 {
66  return m_distributions;
67 }
68 
70  std::function<void(double)> fn)
71 {
72  m_setValueFunctions[distribution] = fn;
73 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:45
Defines class DistributionHandler.
Defines classes representing one-dimensional 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
double setParameterValues(size_t index)
set the parameter values of the simulation object to a specific combination of values,...
virtual ~DistributionHandler()
std::map< const ParameterDistribution *, std::function< void(double)> > m_setValueFunctions
const std::vector< ParameterDistribution > & getDistributions() const
void defineCallbackForDistribution(const ParameterDistribution *distribution, std::function< void(double)> fn)
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
std::vector< ParameterDistribution > m_distributions
A parametric distribution function, for use with any model parameter.
std::vector< ParameterSample > generateSamples() const
generate list of sampled values with their weight
size_t nDraws() const
get number of samples for this distribution