BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
IRangedDistribution Class Referenceabstract

Description

Interface for one-dimensional ranged distributions. All derived distributions allow for generating samples in-place for known mean and standard deviation (except for RangedDistributionLorentz which uses median and hwhm).

Definition at line 37 of file RangedDistributions.h.

Inheritance diagram for IRangedDistribution:
[legend]
Collaboration diagram for IRangedDistribution:
[legend]

Public Member Functions

 IRangedDistribution ()
 
 IRangedDistribution (size_t n_samples, double sigma_factor, const RealLimits &limits=RealLimits::limitless())
 
 IRangedDistribution (size_t n_samples, double sigma_factor, double min, double max)
 Initializes Ranged distribution with given number of samples, sigma factor (range in standard deviations to take into account during sample generation) and limits (either RealLimits object or just min and max limits). By default n_samples = 5, sigma_factor = 2.0, while the limits are (-inf, +inf). More...
 
 ~IRangedDistribution () override
 
IRangedDistributionclone () const override=0
 
IDistribution1Ddistribution (double mean, double stddev) const
 Public interface function to underlying IDistribution1D object. More...
 
std::vector< std::vector< ParameterSample > > generateSamples (const std::vector< double > &mean, const std::vector< double > &stddev) const
 Generates list of sampled values with their weights from given means and standard deviations. More...
 
std::vector< ParameterSamplegenerateSamples (double mean, double stddev) const
 
RealLimits limits () const
 Returns current limits of the distribution. More...
 
virtual std::string name () const =0
 Returns distribution name for python-formatted text. More...
 
size_t nSamples () const
 Returns number of samples to generate. More...
 
void setLimits (const RealLimits &limits)
 
double sigmaFactor () const
 Returns sigma factor to use during sampling. More...
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Protected Member Functions

virtual IDistribution1Ddistribution_impl (double mean, double stddev) const =0
 Returns underlying IDistribution1D object. More...
 

Private Member Functions

void checkInitialization ()
 

Private Attributes

RealLimits m_limits
 
size_t m_n_samples
 
double m_sigma_factor
 

Constructor & Destructor Documentation

◆ IRangedDistribution() [1/3]

IRangedDistribution::IRangedDistribution ( )

Definition at line 37 of file RangedDistributions.cpp.

38  : m_n_samples(5)
39  , m_sigma_factor(2.0)
41 {
43 }
static RealLimits limitless()
Creates an object without bounds (default)
Definition: RealLimits.cpp:139

References checkInitialization().

Here is the call graph for this function:

◆ IRangedDistribution() [2/3]

IRangedDistribution::IRangedDistribution ( size_t  n_samples,
double  sigma_factor,
const RealLimits limits = RealLimits::limitless() 
)

Definition at line 45 of file RangedDistributions.cpp.

47  : m_n_samples(n_samples)
48  , m_sigma_factor(sigma_factor)
49  , m_limits(limits)
50 {
52 }
RealLimits limits() const
Returns current limits of the distribution.

References checkInitialization().

Here is the call graph for this function:

◆ IRangedDistribution() [3/3]

IRangedDistribution::IRangedDistribution ( size_t  n_samples,
double  sigma_factor,
double  min,
double  max 
)

Initializes Ranged distribution with given number of samples, sigma factor (range in standard deviations to take into account during sample generation) and limits (either RealLimits object or just min and max limits). By default n_samples = 5, sigma_factor = 2.0, while the limits are (-inf, +inf).

Definition at line 54 of file RangedDistributions.cpp.

56  : m_n_samples(n_samples)
57  , m_sigma_factor(sigma_factor)
58  , m_limits(RealLimits::limited(min, max))
59 {
61 }
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:134

References checkInitialization().

Here is the call graph for this function:

◆ ~IRangedDistribution()

IRangedDistribution::~IRangedDistribution ( )
overridedefault

Member Function Documentation

◆ checkInitialization()

void IRangedDistribution::checkInitialization ( )
private

Definition at line 103 of file RangedDistributions.cpp.

104 {
105  if (m_n_samples < 1u)
106  throw std::runtime_error("Error in IRangedDistribution::checkInitialization: number of "
107  "samples shall be positive");
108 
109  if (m_sigma_factor < 0.0)
110  throw std::runtime_error("Error in IRangedDistribution::checkInitialization: sigma factor "
111  "shall be non-negative.");
112 
114  return;
115 
117  throw std::runtime_error("Error in IRangedDistribution::checkInitialization: lower limit "
118  "shall not exceed the upper one.");
119 }
bool hasLowerAndUpperLimits() const
if has lower and upper limit
Definition: RealLimits.cpp:88
double upperLimit() const
Returns upper limit.
Definition: RealLimits.cpp:71
double lowerLimit() const
Returns lower limit.
Definition: RealLimits.cpp:49

References RealLimits::hasLowerAndUpperLimits(), RealLimits::lowerLimit(), m_limits, m_n_samples, m_sigma_factor, and RealLimits::upperLimit().

Referenced by IRangedDistribution().

Here is the call graph for this function:

◆ clone()

IRangedDistribution* IRangedDistribution::clone ( ) const
overridepure virtual

◆ distribution()

IDistribution1D * IRangedDistribution::distribution ( double  mean,
double  stddev 
) const

Public interface function to underlying IDistribution1D object.

Definition at line 95 of file RangedDistributions.cpp.

96 {
97  if (stddev < 0.0)
98  throw std::runtime_error(
99  "Error in IRangedDistribution::distribution: standard deviation is less than zero");
100  return distribution_impl(mean, stddev);
101 }
virtual IDistribution1D * distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.

References distribution_impl().

Referenced by generateSamples().

Here is the call graph for this function:

◆ distribution_impl()

virtual IDistribution1D* IRangedDistribution::distribution_impl ( double  mean,
double  stddev 
) const
protectedpure virtual

◆ generateSamples() [1/2]

std::vector< std::vector< ParameterSample > > IRangedDistribution::generateSamples ( const std::vector< double > &  mean,
const std::vector< double > &  stddev 
) const

Generates list of sampled values with their weights from given means and standard deviations.

Definition at line 79 of file RangedDistributions.cpp.

81 {
82  if (mean.size() != stddev.size())
83  throw std::runtime_error("Error in IRangedDistribution::generateSamples: mean and variance "
84  "vectors shall be of the same size");
85 
86  const size_t size = mean.size();
87 
88  std::vector<std::vector<ParameterSample>> result;
89  result.resize(size);
90  for (size_t i = 0; i < size; ++i)
91  result[i] = generateSamples(mean[i], stddev[i]);
92  return result;
93 }
std::vector< ParameterSample > generateSamples(double mean, double stddev) const

References generateSamples().

Here is the call graph for this function:

◆ generateSamples() [2/2]

std::vector< ParameterSample > IRangedDistribution::generateSamples ( double  mean,
double  stddev 
) const

Definition at line 65 of file RangedDistributions.cpp.

66 {
67  auto generator = distribution(mean, stddev);
68  if (!generator->isDelta())
69  return generator->equidistantSamples(m_n_samples, m_sigma_factor, m_limits);
70 
71  // handling the case of delta distributions
72  auto samples = generator->equidistantSamples(m_n_samples, m_sigma_factor, m_limits);
73  ParameterSample& sample = samples[0]; // there is only one element in the vector
74  sample.weight = 1.0 / m_n_samples;
75  return std::vector<ParameterSample>(m_n_samples, sample);
76 }
IDistribution1D * distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
A parameter value with a weight, as obtained when sampling from a distribution.

References distribution(), m_limits, m_n_samples, m_sigma_factor, and ParameterSample::weight.

Referenced by generateSamples().

Here is the call graph for this function:

◆ limits()

RealLimits IRangedDistribution::limits ( ) const
inline

Returns current limits of the distribution.

Definition at line 63 of file RangedDistributions.h.

63 { return m_limits; }

References m_limits.

Referenced by Py::Fmt2::printRangedDistribution(), and setLimits().

◆ name()

virtual std::string IRangedDistribution::name ( ) const
pure virtual

◆ nSamples()

size_t IRangedDistribution::nSamples ( ) const
inline

Returns number of samples to generate.

Definition at line 67 of file RangedDistributions.h.

67 { return m_n_samples; }

References m_n_samples.

Referenced by Py::Fmt2::printRangedDistribution().

◆ setLimits()

void IRangedDistribution::setLimits ( const RealLimits limits)
inline

Definition at line 71 of file RangedDistributions.h.

71 { m_limits = limits; }

References limits(), and m_limits.

Here is the call graph for this function:

◆ sigmaFactor()

double IRangedDistribution::sigmaFactor ( ) const
inline

Returns sigma factor to use during sampling.

Definition at line 65 of file RangedDistributions.h.

65 { return m_sigma_factor; }

References m_sigma_factor.

Referenced by Py::Fmt2::printRangedDistribution().

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 32 of file ICloneable.h.

Member Data Documentation

◆ m_limits

RealLimits IRangedDistribution::m_limits
private

Definition at line 85 of file RangedDistributions.h.

Referenced by checkInitialization(), generateSamples(), limits(), and setLimits().

◆ m_n_samples

size_t IRangedDistribution::m_n_samples
private

Definition at line 83 of file RangedDistributions.h.

Referenced by checkInitialization(), generateSamples(), and nSamples().

◆ m_sigma_factor

double IRangedDistribution::m_sigma_factor
private

Definition at line 84 of file RangedDistributions.h.

Referenced by checkInitialization(), generateSamples(), and sigmaFactor().


The documentation for this class was generated from the following files: