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

Public Member Functions

 RangedDistributionCosine ()
 
 RangedDistributionCosine (size_t n_samples, double sigma_factor, const RealLimits &limits=RealLimits::limitless())
 
 RangedDistributionCosine (size_t n_samples, double sigma_factor, double min, double max)
 
RangedDistributionCosineclone () const override
 
 ~RangedDistributionCosine () override=default
 
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

std::string name () const override
 
std::unique_ptr< IDistribution1Ddistribution_impl (double mean, double stddev) const override
 

Private Member Functions

void checkInitialization ()
 

Private Attributes

size_t m_n_samples
 
double m_sigma_factor
 
RealLimits m_limits
 

Detailed Description

Cosine distribution.

Definition at line 198 of file RangedDistributions.h.

Constructor & Destructor Documentation

◆ RangedDistributionCosine() [1/3]

RangedDistributionCosine::RangedDistributionCosine ( )

Definition at line 247 of file RangedDistributions.cpp.

◆ RangedDistributionCosine() [2/3]

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

Definition at line 249 of file RangedDistributions.cpp.

251  : RangedDistribution(n_samples, sigma_factor, limits)
252 {
253 }
RealLimits limits() const
Returns current limits of the distribution.

◆ RangedDistributionCosine() [3/3]

RangedDistributionCosine::RangedDistributionCosine ( 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 255 of file RangedDistributions.cpp.

257  : RangedDistribution(n_samples, sigma_factor, min, max)
258 {
259 }

◆ ~RangedDistributionCosine()

RangedDistributionCosine::~RangedDistributionCosine ( )
overridedefault

Member Function Documentation

◆ clone()

RangedDistributionCosine * RangedDistributionCosine::clone ( ) const
overridevirtual

Implements RangedDistribution.

Definition at line 261 of file RangedDistributions.cpp.

262 {
263  return makeCopy(*this).release();
264 }
std::unique_ptr< T > makeCopy(const T &item)

References anonymous_namespace{RangedDistributions.cpp}::makeCopy().

Here is the call graph for this function:

◆ name()

std::string RangedDistributionCosine::name ( ) const
overrideprotectedvirtual

Returns distribution name for python-formatted text.

Implements RangedDistribution.

Definition at line 266 of file RangedDistributions.cpp.

267 {
268  return "ba.RangedDistributionCosine";
269 }

◆ distribution_impl()

std::unique_ptr< IDistribution1D > RangedDistributionCosine::distribution_impl ( double  mean,
double  stddev 
) const
overrideprotectedvirtual

Returns underlying IDistribution1D object.

Implements RangedDistribution.

Definition at line 271 of file RangedDistributions.cpp.

273 {
274  return std::make_unique<DistributionCosine>(mean, stddev);
275 }

◆ generateSamples() [1/2]

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

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 RangedDistribution::distribution(), RangedDistribution::m_limits, RangedDistribution::m_n_samples, RangedDistribution::m_sigma_factor, and ParameterSample::weight.

Referenced by RangedDistribution::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
inherited

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

Here is the call graph for this function:

◆ distribution()

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

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

Referenced by RangedDistribution::generateSamples().

Here is the call graph for this function:

◆ limits()

RealLimits RangedDistribution::limits ( ) const
inlineinherited

Returns current limits of the distribution.

Definition at line 63 of file RangedDistributions.h.

63 { return m_limits; }

References RangedDistribution::m_limits.

Referenced by RangedDistribution::setLimits().

◆ sigmaFactor()

double RangedDistribution::sigmaFactor ( ) const
inlineinherited

Returns sigma factor to use during sampling.

Definition at line 65 of file RangedDistributions.h.

65 { return m_sigma_factor; }

References RangedDistribution::m_sigma_factor.

◆ nSamples()

size_t RangedDistribution::nSamples ( ) const
inlineinherited

Returns number of samples to generate.

Definition at line 67 of file RangedDistributions.h.

67 { return m_n_samples; }

References RangedDistribution::m_n_samples.

◆ setLimits()

void RangedDistribution::setLimits ( const RealLimits limits)
inlineinherited

Definition at line 71 of file RangedDistributions.h.

71 { m_limits = limits; }

References RangedDistribution::limits(), and RangedDistribution::m_limits.

Here is the call graph for this function:

◆ pyString()

std::string RangedDistribution::pyString ( ) const
inherited

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(), RangedDistribution::m_limits, RangedDistribution::m_n_samples, RangedDistribution::m_sigma_factor, RangedDistribution::name(), pyfmt::printDouble(), and pyfmt::printRealLimitsArg().

Referenced by operator<<().

Here is the call graph for this function:

◆ checkInitialization()

void RangedDistribution::checkInitialization ( )
privateinherited

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(), RangedDistribution::m_limits, RangedDistribution::m_n_samples, RangedDistribution::m_sigma_factor, and RealLimits::upperLimit().

Referenced by RangedDistribution::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
privateinherited

◆ m_sigma_factor

double RangedDistribution::m_sigma_factor
privateinherited

◆ m_limits


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