BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
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 //! @ingroup distribution_internal
37 
39 public:
41  IRangedDistribution(size_t n_samples, double sigma_factor,
43  //! Initializes Ranged distribution with given number of samples, sigma factor
44  //! (range in standard deviations to take into account during sample generation)
45  //! and limits (either RealLimits object or just min and max limits).
46  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
47  IRangedDistribution(size_t n_samples, double sigma_factor, double min, double max);
48  IRangedDistribution* clone() const override = 0;
49 
51 
52  std::vector<ParameterSample> generateSamples(double mean, double stddev) const;
53  //! Generates list of sampled values with their weights from given means and standard
54  //! deviations.
55  std::vector<std::vector<ParameterSample>>
56  generateSamples(const std::vector<double>& mean, const std::vector<double>& stddev) const;
57 
58  //! Public interface function to underlying IDistribution1D object
59  std::unique_ptr<IDistribution1D> distribution(double mean, double stddev) const;
60 
61  // getters
62 
63  //! Returns current limits of the distribution
64  RealLimits limits() const { return m_limits; }
65  //! Returns sigma factor to use during sampling
66  double sigmaFactor() const { return m_sigma_factor; }
67  //! Returns number of samples to generate
68  size_t nSamples() const { return m_n_samples; }
69 
70  // setters
71 
73 
74  //! Returns distribution name for python-formatted text.
75  virtual std::string name() const = 0;
76 
77 protected:
78  //! Returns underlying IDistribution1D object
79  virtual std::unique_ptr<IDistribution1D> distribution_impl(double mean,
80  double stddev) const = 0;
81 
82 private:
83  void checkInitialization();
84 
85  size_t m_n_samples;
88 };
89 
90 #endif // USER_API
91 
92 // ************************************************************************************************
93 // specific distribution classes
94 // ************************************************************************************************
95 
96 //! Uniform distribution function.
97 //! @ingroup paramDistribution
98 
100 public:
102  RangedDistributionGate(size_t n_samples, double sigma_factor,
104  //! Initializes Ranged distribution with given number of samples, sigma factor
105  //! (range in standard deviations to take into account during sample generation)
106  //! and limits (either RealLimits object or just min and max limits).
107  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
108  RangedDistributionGate(size_t n_samples, double sigma_factor, double min, double max);
109 
110  RangedDistributionGate* clone() const override;
111  ~RangedDistributionGate() override = default;
112 
113  //! Returns distribution name for python-formatted text.
114  std::string name() const override;
115 
116 protected:
117  //! Returns underlying IDistribution1D object
118  std::unique_ptr<IDistribution1D> distribution_impl(double mean, double stddev) const override;
119 };
120 
121 //! Lorentz distribution with median and hwhm.
122 //! @ingroup paramDistribution
123 
125 public:
127  RangedDistributionLorentz(size_t n_samples, double hwhm_factor,
129  //! Initializes Ranged distribution with given number of samples, sigma factor
130  //! (range in standard deviations to take into account during sample generation)
131  //! and limits (either RealLimits object or just min and max limits).
132  //! By default _n_samples_ = 5, _hwhm_factor_ = 2.0, while the limits are (-inf, +inf).
133  RangedDistributionLorentz(size_t n_samples, double hwhm_factor, double min, double max);
134 
135  RangedDistributionLorentz* clone() const override;
136  ~RangedDistributionLorentz() override = default;
137 
138  //! Returns distribution name for python-formatted text.
139  std::string name() const override;
140 
141 protected:
142  //! Returns underlying IDistribution1D object
143  std::unique_ptr<IDistribution1D> distribution_impl(double median, double hwhm) const override;
144 };
145 
146 //! Gaussian distribution with standard deviation std_dev.
147 //! @ingroup paramDistribution
148 
150 public:
152  RangedDistributionGaussian(size_t n_samples, double sigma_factor,
154  //! Initializes Ranged distribution with given number of samples, sigma factor
155  //! (range in standard deviations to take into account during sample generation)
156  //! and limits (either RealLimits object or just min and max limits).
157  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
158  RangedDistributionGaussian(size_t n_samples, double sigma_factor, double min, double max);
159 
160  RangedDistributionGaussian* clone() const override;
161  ~RangedDistributionGaussian() override = default;
162 
163  //! Returns distribution name for python-formatted text.
164  std::string name() const override;
165 
166 protected:
167  //! Returns underlying IDistribution1D object
168  std::unique_ptr<IDistribution1D> distribution_impl(double mean, double stddev) const override;
169 };
170 
171 //! Log-normal distribution.
172 //! @ingroup paramDistribution
173 
175 public:
177  RangedDistributionLogNormal(size_t n_samples, double sigma_factor,
179  //! Initializes Ranged distribution with given number of samples, sigma factor
180  //! (range in standard deviations to take into account during sample generation)
181  //! and limits (either RealLimits object or just min and max limits).
182  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
183  RangedDistributionLogNormal(size_t n_samples, double sigma_factor, double min, double max);
184 
185  RangedDistributionLogNormal* clone() const override;
186  ~RangedDistributionLogNormal() override = default;
187 
188  //! Returns distribution name for python-formatted text.
189  std::string name() const override;
190 
191 protected:
192  //! Returns underlying IDistribution1D object
193  std::unique_ptr<IDistribution1D> distribution_impl(double mean, double stddev) const override;
194 };
195 
196 //! Cosine distribution.
197 //! @ingroup paramDistribution
198 
200 public:
202  RangedDistributionCosine(size_t n_samples, double sigma_factor,
204  //! Initializes Ranged distribution with given number of samples, sigma factor
205  //! (range in standard deviations to take into account during sample generation)
206  //! and limits (either RealLimits object or just min and max limits).
207  //! By default _n_samples_ = 5, _sigma_factor_ = 2.0, while the limits are (-inf, +inf).
208  RangedDistributionCosine(size_t n_samples, double sigma_factor, double min, double max);
209 
210  RangedDistributionCosine* clone() const override;
211  ~RangedDistributionCosine() override = default;
212 
213  //! Returns distribution name for python-formatted text.
214  std::string name() const override;
215 
216 protected:
217  //! Returns underlying IDistribution1D object
218  std::unique_ptr<IDistribution1D> distribution_impl(double mean, double stddev) const override;
219 };
220 
221 #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:25
Interface for one-dimensional distributions.
Definition: Distributions.h:34
Interface for one-dimensional ranged distributions.
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::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
virtual std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.
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::unique_ptr< 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.
Uniform distribution function.
~RangedDistributionGate() override=default
RangedDistributionGate * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
Gaussian distribution with standard deviation std_dev.
std::string name() const override
Returns distribution name for python-formatted text.
std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
~RangedDistributionGaussian() override=default
RangedDistributionGaussian * clone() const override
Log-normal distribution.
RangedDistributionLogNormal * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
~RangedDistributionLogNormal() override=default
std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
Lorentz distribution with median and hwhm.
~RangedDistributionLorentz() override=default
std::string name() const override
Returns distribution name for python-formatted text.
std::unique_ptr< IDistribution1D > distribution_impl(double median, double hwhm) const override
Returns underlying IDistribution1D object.
RangedDistributionLorentz * clone() const override
Limits for a real fit parameter.
Definition: RealLimits.h:24
static RealLimits limitless()
Creates an object withoud bounds (default)
Definition: RealLimits.cpp:130