File: Distributions.h

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (287 lines) | stat: -rw-r--r-- 8,909 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      Param/Distrib/Distributions.h
//! @brief     Defines classes representing one-dimensional distributions.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#ifndef BORNAGAIN_PARAM_DISTRIB_DISTRIBUTIONS_H
#define BORNAGAIN_PARAM_DISTRIB_DISTRIBUTIONS_H

#include "Base/Type/ICloneable.h"
#include "Param/Node/INode.h"
#include <vector>

struct ParameterSample;

//  ************************************************************************************************
//  interface IDistribution1D
//  ************************************************************************************************

//! Interface for one-dimensional distributions.

class IDistribution1D : public ICloneable, public INode {
public:
    IDistribution1D(const std::vector<double>& PValues, size_t n_samples,
                    double rel_sampling_width = 1.);

    void setNSamples(size_t n) { m_n_samples = n; }

    void setRelSamplingWidth(double w) { m_relative_sampling_width = w; }

    virtual std::vector<ParameterSample> distributionSamples() const = 0;

#ifndef SWIG
    IDistribution1D* clone() const override = 0;

    //! Returns the distribution-specific probability density for value x.
    virtual double probabilityDensity(double x) const = 0;

    //! Returns the distribution-specific mean.
    virtual double mean() const = 0;

    //! Sets the distribution-specific mean.
    virtual void setMean(double val) = 0;

    //! Returns true if the distribution is in the limit case of a Dirac delta distribution.
    virtual bool isDelta() const = 0;

    virtual std::vector<std::pair<double, double>> plotGraph() const;

    size_t nSamples() const;

    double relSamplingWidth() const { return m_relative_sampling_width; }

protected:
    std::vector<ParameterSample> samplesInRange(double xmin, double xmax) const;
    size_t m_n_samples;

private:
    //! Returns a range that is suitable for plotting the pdf.
    virtual std::pair<double, double> plotRange() const;

    double m_relative_sampling_width;
#endif // SWIG
};


//  ************************************************************************************************
//  class DistributionGate
//  ************************************************************************************************

//! Uniform distribution function with half width hwhm.

class DistributionGate : public IDistribution1D {
public:
    DistributionGate(std::vector<double> P, size_t n_samples);

    DistributionGate(double min, double max, size_t n_samples = 25);

    std::string className() const final { return "DistributionGate"; }

    std::vector<ParameterSample> distributionSamples() const override;

#ifndef SWIG
    DistributionGate* clone() const override;

    std::vector<ParaMeta> parDefs() const final { return {{"Min", ""}, {"Max", ""}}; }

    double probabilityDensity(double x) const override;

    double mean() const override { return (m_min + m_max) / 2.0; }

    void setMean(double val) override;

    double min() const { return m_min; }

    double max() const { return m_max; }

    bool isDelta() const override;

    std::string validate() const override;

private:
    std::pair<double, double> plotRange() const override;

    const double& m_min;
    const double& m_max;
#endif // SWIG
};

//  ************************************************************************************************
//  class DistributionLorentz
//  ************************************************************************************************

//! Lorentz distribution with half width hwhm.

class DistributionLorentz : public IDistribution1D {
public:
    DistributionLorentz(std::vector<double> P, size_t n_samples, double rel_sampling_width);

    DistributionLorentz(double mean, double hwhm, size_t n_samples = 25,
                        double rel_sampling_width = 2.);

    std::string className() const final { return "DistributionLorentz"; }

    std::vector<ParameterSample> distributionSamples() const override;

#ifndef SWIG
    DistributionLorentz* clone() const override;

    std::vector<ParaMeta> parDefs() const final { return {{"Mean", ""}, {"HWHM", ""}}; }

    double probabilityDensity(double x) const override;

    double mean() const override { return m_mean; }

    void setMean(double val) override;

    double hwhm() const { return m_hwhm; }

    bool isDelta() const override;

    std::string validate() const override;

private:
    std::pair<double, double> plotRange() const override;

    const double& m_mean;
    const double& m_hwhm;
#endif // SWIG
};

//  ************************************************************************************************
//  class DistributionGaussian
//  ************************************************************************************************

//! Gaussian distribution with standard deviation std_dev.

class DistributionGaussian : public IDistribution1D {
public:
    DistributionGaussian(std::vector<double> P, size_t n_samples, double rel_sampling_width);

    DistributionGaussian(double mean, double std_dev, size_t n_samples = 25,
                         double rel_sampling_width = 2.);

    std::string className() const final { return "DistributionGaussian"; }

    std::vector<ParameterSample> distributionSamples() const override;

#ifndef SWIG
    DistributionGaussian* clone() const override;

    std::vector<ParaMeta> parDefs() const final { return {{"Mean", ""}, {"StdDev", ""}}; }

    double probabilityDensity(double x) const override;

    double mean() const override { return m_mean; }

    void setMean(double val) override;

    double getStdDev() const { return m_std_dev; }

    bool isDelta() const override;

    std::string validate() const override;

private:
    std::pair<double, double> plotRange() const override;

    const double& m_mean;
    const double& m_std_dev;
#endif // SWIG
};

//  ************************************************************************************************
//  class DistributionLogNormal
//  ************************************************************************************************

//! Log-normal distribution.

class DistributionLogNormal : public IDistribution1D {
public:
    DistributionLogNormal(std::vector<double> P, size_t n_samples, double rel_sampling_width);

    DistributionLogNormal(double median, double scale_param, size_t n_samples = 25,
                          double rel_sampling_width = 2.);

    std::string className() const final { return "DistributionLogNormal"; }

    std::vector<ParameterSample> distributionSamples() const override;

#ifndef SWIG
    DistributionLogNormal* clone() const override;

    std::vector<ParaMeta> parDefs() const final { return {{"Median", ""}, {"ScaleParameter", ""}}; }

    double probabilityDensity(double x) const override;

    double mean() const override;

    void setMean(double val) override;

    double getMedian() const { return m_median; }

    double getScalePar() const { return m_scale_param; }

    bool isDelta() const override;

    std::string validate() const override;

private:
    std::pair<double, double> plotRange() const override;

    const double& m_median;
    const double& m_scale_param;
#endif // SWIG
};

//  ************************************************************************************************
//  class DistributionCosine
//  ************************************************************************************************

//! Cosine distribution.

class DistributionCosine : public IDistribution1D {
public:
    DistributionCosine(std::vector<double> P, size_t n_samples);

    DistributionCosine(double mean, double sigma, size_t n_samples = 25);

    std::string className() const final { return "DistributionCosine"; }

    std::vector<ParameterSample> distributionSamples() const override;

#ifndef SWIG
    DistributionCosine* clone() const override;

    std::vector<ParaMeta> parDefs() const final { return {{"Mean", ""}, {"HWHM", ""}}; }

    double probabilityDensity(double x) const override;

    double mean() const override { return m_mean; }

    void setMean(double val) override;

    double hwhm() const { return m_hwhm; }

    bool isDelta() const override;

    std::string validate() const override;

private:
    std::pair<double, double> plotRange() const override;

    const double& m_mean;
    const double& m_hwhm;
#endif // SWIG
};

#endif // BORNAGAIN_PARAM_DISTRIB_DISTRIBUTIONS_H