BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RangedDistribution Class Referenceabstract
Inheritance diagram for RangedDistribution:
Collaboration diagram for RangedDistribution:

Public Member Functions

 RangedDistribution ()
 
 RangedDistribution (size_t n_samples, double sigma_factor, const RealLimits &limits=RealLimits::limitless())
 
 RangedDistribution (size_t n_samples, double sigma_factor, double min, double max)
 
RangedDistributionclone () const override=0
 
 ~RangedDistribution () override
 
std::vector< ParameterSamplegenerateSamples (double mean, double stddev) const
 
std::vector< std::vector< ParameterSample > > generateSamples (const std::vector< double > &mean, const std::vector< double > &stddev) const
 
std::unique_ptr< IDistribution1Ddistribution (double mean, double stddev) const
 
RealLimits limits () const
 
double sigmaFactor () const
 
size_t nSamples () const
 
void setLimits (const RealLimits &limits)
 
std::string pyString () const
 
virtual void transferToCPP ()
 

Protected Member Functions

virtual std::string name () const =0
 
virtual std::unique_ptr< IDistribution1Ddistribution_impl (double mean, double stddev) const =0
 

Private Member Functions

void checkInitialization ()
 

Private Attributes

size_t m_n_samples
 
double m_sigma_factor
 
RealLimits m_limits
 

Detailed 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 36 of file RangedDistributions.h.

Constructor & Destructor Documentation

◆ RangedDistribution() [1/3]

RangedDistribution::RangedDistribution ( )

Definition at line 29 of file RangedDistributions.cpp.

31 {
33 }
static RealLimits limitless()
Creates an object withoud bounds (default)
Definition: RealLimits.cpp:128

References checkInitialization().

Here is the call graph for this function:

◆ RangedDistribution() [2/3]

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

Definition at line 35 of file RangedDistributions.cpp.

37  : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(limits)
38 {
40 }
RealLimits limits() const
Returns current limits of the distribution.

References checkInitialization().

Here is the call graph for this function:

◆ RangedDistribution() [3/3]

RangedDistribution::RangedDistribution ( 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 42 of file RangedDistributions.cpp.

44  : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(RealLimits::limited(min, max))
45 {
47 }
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:123

References checkInitialization().

Here is the call graph for this function:

◆ ~RangedDistribution()

RangedDistribution::~RangedDistribution ( )
overridedefault

Member Function Documentation

◆ clone()

RangedDistribution* RangedDistribution::clone ( ) const
overridepure virtual

◆ generateSamples() [1/2]

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

Definition at line 51 of file RangedDistributions.cpp.

52 {
53  auto generator = distribution(mean, stddev);
54  if (!generator->isDelta())
55  return generator->equidistantSamples(m_n_samples, m_sigma_factor, m_limits);
56 
57  // handling the case of delta distributions
58  auto samples = generator->equidistantSamples(m_n_samples, m_sigma_factor, m_limits);
59  ParameterSample& sample = samples[0]; // there is only one element in the vector
60  sample.weight = 1.0 / m_n_samples;
61  return std::vector<ParameterSample>(m_n_samples, sample);
62 }
A parameter value with a weight, as obtained when sampling from a distribution.
std::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.

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

Referenced by generateSamples().

Here is the call graph for this function:

◆ generateSamples() [2/2]

std::vector< std::vector< ParameterSample > > RangedDistribution::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 65 of file RangedDistributions.cpp.

67 {
68  if (mean.size() != stddev.size())
69  throw std::runtime_error("Error in RangedDistribution::generateSamples: mean and variance "
70  "vectors shall be of the same size");
71 
72  const size_t size = mean.size();
73 
74  std::vector<std::vector<ParameterSample>> result;
75  result.resize(size);
76  for (size_t i = 0; i < size; ++i)
77  result[i] = generateSamples(mean[i], stddev[i]);
78  return result;
79 }
std::vector< ParameterSample > generateSamples(double mean, double stddev) const

References generateSamples().

Here is the call graph for this function:

◆ distribution()

std::unique_ptr< IDistribution1D > RangedDistribution::distribution ( double  mean,
double  stddev 
) const

Public interface function to underlying IDistribution1D object.

Definition at line 81 of file RangedDistributions.cpp.

82 {
83  if (stddev < 0.0)
84  throw std::runtime_error(
85  "Error in RangedDistribution::distribution: standard deviation is less than zero");
86  return distribution_impl(mean, stddev);
87 }
virtual std::unique_ptr< 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:

◆ limits()

RealLimits RangedDistribution::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 setLimits().

◆ sigmaFactor()

double RangedDistribution::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.

◆ nSamples()

size_t RangedDistribution::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.

◆ setLimits()

void RangedDistribution::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:

◆ pyString()

std::string RangedDistribution::pyString ( ) const

Prints python-formatted definition of the distribution.

Definition at line 89 of file RangedDistributions.cpp.

90 {
91  std::stringstream result;
92  result << pyfmt::indent() << "distribution = " << name();
93  result << "(" << m_n_samples << ", " << pyfmt::printDouble(m_sigma_factor);
94  if (!m_limits.isLimitless())
96  result << ")";
97  return result.str();
98 }
virtual std::string name() const =0
Returns distribution name for python-formatted text.
bool isLimitless() const
Definition: RealLimits.cpp:171
std::string printDouble(double input)
Definition: PyFmt.cpp:43
std::string indent(size_t width)
Returns a string of blanks with given width.
Definition: PyFmt.cpp:141
std::string printRealLimitsArg(const RealLimits &limits, const std::string &units)
Prints RealLimits in the form of argument (in the context of ParameterDistribution and similar).
Definition: PyFmtLimits.cpp:61

References pyfmt::indent(), RealLimits::isLimitless(), m_limits, m_n_samples, m_sigma_factor, name(), pyfmt::printDouble(), and pyfmt::printRealLimitsArg().

Referenced by operator<<().

Here is the call graph for this function:

◆ name()

virtual std::string RangedDistribution::name ( ) const
protectedpure virtual

Returns distribution name for python-formatted text.

Implemented in RangedDistributionCosine, RangedDistributionLogNormal, RangedDistributionGaussian, RangedDistributionLorentz, and RangedDistributionGate.

Referenced by pyString().

◆ distribution_impl()

virtual std::unique_ptr<IDistribution1D> RangedDistribution::distribution_impl ( double  mean,
double  stddev 
) const
protectedpure virtual

◆ checkInitialization()

void RangedDistribution::checkInitialization ( )
private

Definition at line 100 of file RangedDistributions.cpp.

101 {
102  if (m_n_samples < 1u)
103  throw std::runtime_error("Error in RangedDistribution::checkInitialization: number of "
104  "samples shall be positive");
105 
106  if (m_sigma_factor < 0.0)
107  throw std::runtime_error("Error in RangedDistribution::checkInitialization: sigma factor "
108  "shall be non-negative.");
109 
111  return;
112 
114  throw std::runtime_error("Error in RangedDistribution::checkInitialization: lower limit "
115  "shall not exceed the upper one.");
116 }
bool hasLowerAndUpperLimits() const
if has lower and upper limit
Definition: RealLimits.cpp:77
double upperLimit() const
Returns upper limit.
Definition: RealLimits.cpp:60
double lowerLimit() const
Returns lower limit.
Definition: RealLimits.cpp:38

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

Referenced by RangedDistribution().

Here is the call graph for this function:

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

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

Definition at line 34 of file ICloneable.h.

Member Data Documentation

◆ m_n_samples

size_t RangedDistribution::m_n_samples
private

Definition at line 86 of file RangedDistributions.h.

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

◆ m_sigma_factor

double RangedDistribution::m_sigma_factor
private

Definition at line 87 of file RangedDistributions.h.

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

◆ m_limits

RealLimits RangedDistribution::m_limits
private

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