BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
RangedDistributions.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Param/Distrib/RangedDistributions.h
6 //! @brief Defines classes representing ranged one-dimensional distributions.
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 #ifndef BORNAGAIN_PARAM_DISTRIB_RANGEDDISTRIBUTIONS_H
16 #define BORNAGAIN_PARAM_DISTRIB_RANGEDDISTRIBUTIONS_H
17 
18 #include "Base/Types/ICloneable.h"
19 #include "Fit/Param/RealLimits.h"
20 #include <memory>
21 #include <vector>
22 
23 class IDistribution1D;
24 class ParameterSample;
25 
26 // ************************************************************************************************
27 // interface class IDistribution1D
28 // ************************************************************************************************
29 
30 #ifndef USER_API
31 
32 //! Interface for one-dimensional ranged distributions.
33 //! All derived distributions
34 //! allow for generating samples in-place for known mean and standard deviation
35 //! (except for RangedDistributionLorentz which uses median and hwhm).
36 
38 public:
40  IRangedDistribution(size_t n_samples, double sigma_factor,
42  //! Initializes Ranged distribution with given number of samples, sigma factor
43  //! (range in standard deviations to take into account during sample generation)
44  //! and limits (either RealLimits object or just min and max limits).
45  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
46  IRangedDistribution(size_t n_samples, double sigma_factor, double min, double max);
47  IRangedDistribution* clone() const override = 0;
48 
50 
51  std::vector<ParameterSample> generateSamples(double mean, double stddev) const;
52  //! Generates list of sampled values with their weights from given means and standard
53  //! deviations.
54  std::vector<std::vector<ParameterSample>>
55  generateSamples(const std::vector<double>& mean, const std::vector<double>& stddev) const;
56 
57  //! Public interface function to underlying IDistribution1D object
58  IDistribution1D* distribution(double mean, double stddev) const;
59 
60  // getters
61 
62  //! Returns current limits of the distribution
63  RealLimits limits() const { return m_limits; }
64  //! Returns sigma factor to use during sampling
65  double sigmaFactor() const { return m_sigma_factor; }
66  //! Returns number of samples to generate
67  size_t nSamples() const { return m_n_samples; }
68 
69  // setters
70 
72 
73  //! Returns distribution name for python-formatted text.
74  virtual std::string name() const = 0;
75 
76 protected:
77  //! Returns underlying IDistribution1D object
78  virtual IDistribution1D* distribution_impl(double mean, double stddev) const = 0;
79 
80 private:
81  void checkInitialization();
82 
83  size_t m_n_samples;
86 };
87 
88 #endif // USER_API
89 
90 // ************************************************************************************************
91 // specific distribution classes
92 // ************************************************************************************************
93 
94 //! Uniform distribution function.
95 //! @ingroup paramDistribution
96 
98 public:
100  RangedDistributionGate(size_t n_samples, double sigma_factor,
102  //! Initializes Ranged distribution with given number of samples, sigma factor
103  //! (range in standard deviations to take into account during sample generation)
104  //! and limits (either RealLimits object or just min and max limits).
105  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
106  RangedDistributionGate(size_t n_samples, double sigma_factor, double min, double max);
107 
108  RangedDistributionGate* clone() const override;
109  ~RangedDistributionGate() override = default;
110 
111  //! Returns distribution name for python-formatted text.
112  std::string name() const override;
113 
114 protected:
115  //! Returns underlying IDistribution1D object
116  IDistribution1D* distribution_impl(double mean, double stddev) const override;
117 };
118 
119 //! Lorentz distribution with median and hwhm.
120 //! @ingroup paramDistribution
121 
123 public:
125  RangedDistributionLorentz(size_t n_samples, double hwhm_factor,
127  //! Initializes Ranged distribution with given number of samples, sigma factor
128  //! (range in standard deviations to take into account during sample generation)
129  //! and limits (either RealLimits object or just min and max limits).
130  //! By default _n_samples_ = 5, _hwhm_factor_ = 2.0, while the limits are (-inf, +inf).
131  RangedDistributionLorentz(size_t n_samples, double hwhm_factor, double min, double max);
132 
133  RangedDistributionLorentz* clone() const override;
134  ~RangedDistributionLorentz() override = default;
135 
136  //! Returns distribution name for python-formatted text.
137  std::string name() const override;
138 
139 protected:
140  //! Returns underlying IDistribution1D object
141  IDistribution1D* distribution_impl(double median, double hwhm) const override;
142 };
143 
144 //! Gaussian distribution with standard deviation std_dev.
145 //! @ingroup paramDistribution
146 
148 public:
150  RangedDistributionGaussian(size_t n_samples, double sigma_factor,
152  //! Initializes Ranged distribution with given number of samples, sigma factor
153  //! (range in standard deviations to take into account during sample generation)
154  //! and limits (either RealLimits object or just min and max limits).
155  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
156  RangedDistributionGaussian(size_t n_samples, double sigma_factor, double min, double max);
157 
158  RangedDistributionGaussian* clone() const override;
159  ~RangedDistributionGaussian() override = default;
160 
161  //! Returns distribution name for python-formatted text.
162  std::string name() const override;
163 
164 protected:
165  //! Returns underlying IDistribution1D object
166  IDistribution1D* distribution_impl(double mean, double stddev) const override;
167 };
168 
169 //! Log-normal distribution.
170 //! @ingroup paramDistribution
171 
173 public:
175  RangedDistributionLogNormal(size_t n_samples, double sigma_factor,
177  //! Initializes Ranged distribution with given number of samples, sigma factor
178  //! (range in standard deviations to take into account during sample generation)
179  //! and limits (either RealLimits object or just min and max limits).
180  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
181  RangedDistributionLogNormal(size_t n_samples, double sigma_factor, double min, double max);
182 
183  RangedDistributionLogNormal* clone() const override;
184  ~RangedDistributionLogNormal() override = default;
185 
186  //! Returns distribution name for python-formatted text.
187  std::string name() const override;
188 
189 protected:
190  //! Returns underlying IDistribution1D object
191  IDistribution1D* distribution_impl(double mean, double stddev) const override;
192 };
193 
194 //! Cosine distribution.
195 //! @ingroup paramDistribution
196 
198 public:
200  RangedDistributionCosine(size_t n_samples, double sigma_factor,
202  //! Initializes Ranged distribution with given number of samples, sigma factor
203  //! (range in standard deviations to take into account during sample generation)
204  //! and limits (either RealLimits object or just min and max limits).
205  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
206  RangedDistributionCosine(size_t n_samples, double sigma_factor, double min, double max);
207 
208  RangedDistributionCosine* clone() const override;
209  ~RangedDistributionCosine() override = default;
210 
211  //! Returns distribution name for python-formatted text.
212  std::string name() const override;
213 
214 protected:
215  //! Returns underlying IDistribution1D object
216  IDistribution1D* distribution_impl(double mean, double stddev) const override;
217 };
218 
219 #endif // BORNAGAIN_PARAM_DISTRIB_RANGEDDISTRIBUTIONS_H
Defines and implements the standard mix-in ICloneable.
Defines class RealLimits.
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:23
Interface for one-dimensional distributions.
Definition: Distributions.h:33
Interface for one-dimensional ranged distributions. All derived distributions allow for generating sa...
virtual IDistribution1D * distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.
IDistribution1D * distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
double sigmaFactor() const
Returns sigma factor to use during sampling.
~IRangedDistribution() override
virtual std::string name() const =0
Returns distribution name for python-formatted text.
std::vector< ParameterSample > generateSamples(double mean, double stddev) const
RealLimits limits() const
Returns current limits of the distribution.
size_t nSamples() const
Returns number of samples to generate.
void setLimits(const RealLimits &limits)
IRangedDistribution * clone() const override=0
A parameter value with a weight, as obtained when sampling from a distribution.
~RangedDistributionCosine() override=default
RangedDistributionCosine * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
Uniform distribution function.
~RangedDistributionGate() override=default
RangedDistributionGate * clone() const override
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
std::string name() const override
Returns distribution name for python-formatted text.
Gaussian distribution with standard deviation std_dev.
std::string name() const override
Returns distribution name for python-formatted text.
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
~RangedDistributionGaussian() override=default
RangedDistributionGaussian * clone() const override
Log-normal distribution.
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
RangedDistributionLogNormal * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
~RangedDistributionLogNormal() override=default
Lorentz distribution with median and hwhm.
~RangedDistributionLorentz() override=default
std::string name() const override
Returns distribution name for python-formatted text.
RangedDistributionLorentz * clone() const override
IDistribution1D * distribution_impl(double median, double hwhm) const override
Returns underlying IDistribution1D object.
Limits for a real fit parameter.
Definition: RealLimits.h:24
static RealLimits limitless()
Creates an object without bounds (default)
Definition: RealLimits.cpp:139