24 template <
class T> std::unique_ptr<T>
makeCopy(
const T& item);
30 : m_n_samples(5), m_sigma_factor(2.0), m_limits(
RealLimits::limitless())
37 : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(limits)
44 : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(
RealLimits::limited(min, max))
54 if (!generator->isDelta())
61 return std::vector<ParameterSample>(
m_n_samples, sample);
64 std::vector<std::vector<ParameterSample>>
66 const std::vector<double>& stddev)
const
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");
72 const size_t size = mean.size();
74 std::vector<std::vector<ParameterSample>> result;
76 for (
size_t i = 0; i < size; ++i)
84 throw std::runtime_error(
85 "Error in RangedDistribution::distribution: standard deviation is less than zero");
91 std::stringstream result;
103 throw std::runtime_error(
"Error in RangedDistribution::checkInitialization: number of "
104 "samples shall be positive");
107 throw std::runtime_error(
"Error in RangedDistribution::checkInitialization: sigma factor "
108 "shall be non-negative.");
114 throw std::runtime_error(
"Error in RangedDistribution::checkInitialization: lower limit "
115 "shall not exceed the upper one.");
139 return "ba.RangedDistributionGate";
147 return std::make_unique<DistributionGate>(x_min, x_max);
159 double min,
double max)
171 return "ba.RangedDistributionLorentz";
177 return std::make_unique<DistributionLorentz>(median, hwhm);
189 double min,
double max)
201 return "ba.RangedDistributionGaussian";
207 return std::make_unique<DistributionGaussian>(mean, stddev);
219 double min,
double max)
231 return "ba.RangedDistributionLogNormal";
237 const double mean_2 = mean * mean;
238 if (mean_2 <= std::numeric_limits<double>::min())
239 throw std::runtime_error(
"Error in DistributionLogNormal::distribution: mean square value "
240 "is less or indistinguishable from zero.");
242 const double scale = std::sqrt(std::log(stddev * stddev / mean_2 + 1.0));
243 const double median = mean * std::exp(-scale * scale / 2.0);
244 return std::make_unique<DistributionLogNormal>(median, scale);
256 double min,
double max)
268 return "ba.RangedDistributionCosine";
274 return std::make_unique<DistributionCosine>(mean, stddev);
279 template <
class T> std::unique_ptr<T>
makeCopy(
const T& item)
281 return std::make_unique<T>(item.nSamples(), item.sigmaFactor(), item.limits());
Defines classes representing one-dimensional distributions.
Defines class ParameterSample.
Defines functions in namespace pyfmt.
Defines functions in namespace pyfmt.
Defines classes representing ranged one-dimensional distributions.
A parameter value with a weight, as obtained when sampling from a distribution.
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.
RangedDistributionCosine()
Uniform distribution function.
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.
RangedDistributionGaussian()
std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
RangedDistributionGaussian * clone() const override
RangedDistributionLogNormal * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
RangedDistributionLogNormal()
std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
Lorentz distribution with median and hwhm.
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
RangedDistributionLorentz()
Interface for one-dimensional ranged distributions.
std::string pyString() const
Prints python-formatted definition of the distribution.
~RangedDistribution() override
virtual std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.
void checkInitialization()
std::vector< ParameterSample > generateSamples(double mean, double stddev) const
std::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
virtual std::string name() const =0
Returns distribution name for python-formatted text.
Limits for a real fit parameter.
bool hasLowerAndUpperLimits() const
if has lower and upper limit
double upperLimit() const
Returns upper limit.
double lowerLimit() const
Returns lower limit.
std::unique_ptr< T > makeCopy(const T &item)
const double gate_stddev_factor
std::string printDouble(double input)
std::string indent(size_t width)
Returns a string of blanks with given width.
std::string printRealLimitsArg(const RealLimits &limits, const std::string &units)
Prints RealLimits in the form of argument (in the context of ParameterDistribution and similar).