22 template <
class T> std::unique_ptr<T> makeCopy(
const T& item)
24 return std::make_unique<T>(item.nSamples(), item.sigmaFactor(), item.limits());
27 const double gate_stddev_factor = 2.0 * std::sqrt(3.0);
36 : m_n_samples(5), m_sigma_factor(2.0), m_limits(
RealLimits::limitless())
43 : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(limits)
50 : m_n_samples(n_samples), m_sigma_factor(sigma_factor), m_limits(
RealLimits::limited(min, max))
60 if (!generator->isDelta())
67 return std::vector<ParameterSample>(
m_n_samples, sample);
70 std::vector<std::vector<ParameterSample>>
72 const std::vector<double>& stddev)
const
74 if (mean.size() != stddev.size())
75 throw std::runtime_error(
"Error in IRangedDistribution::generateSamples: mean and variance "
76 "vectors shall be of the same size");
78 const size_t size = mean.size();
80 std::vector<std::vector<ParameterSample>> result;
82 for (
size_t i = 0; i < size; ++i)
90 throw std::runtime_error(
91 "Error in IRangedDistribution::distribution: standard deviation is less than zero");
98 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: number of "
99 "samples shall be positive");
102 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: sigma factor "
103 "shall be non-negative.");
109 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: lower limit "
110 "shall not exceed the upper one.");
133 return makeCopy(*this).release();
138 return "RangedDistributionGate";
144 const double x_min = mean - gate_stddev_factor * stddev;
145 const double x_max = mean + gate_stddev_factor * stddev;
146 return std::make_unique<DistributionGate>(x_min, x_max);
162 double min,
double max)
169 return makeCopy(*this).release();
174 return "RangedDistributionLorentz";
180 return std::make_unique<DistributionLorentz>(median, hwhm);
196 double min,
double max)
203 return makeCopy(*this).release();
208 return "RangedDistributionGaussian";
214 return std::make_unique<DistributionGaussian>(mean, stddev);
230 double min,
double max)
237 return makeCopy(*this).release();
242 return "RangedDistributionLogNormal";
248 const double mean_2 = mean * mean;
249 if (mean_2 <= std::numeric_limits<double>::min())
250 throw std::runtime_error(
"Error in DistributionLogNormal::distribution: mean square value "
251 "is less or indistinguishable from zero.");
253 const double scale = std::sqrt(std::log(stddev * stddev / mean_2 + 1.0));
254 const double median = mean * std::exp(-scale * scale / 2.0);
255 return std::make_unique<DistributionLogNormal>(median, scale);
271 double min,
double max)
278 return makeCopy(*this).release();
283 return "RangedDistributionCosine";
289 return std::make_unique<DistributionCosine>(mean, stddev);
Defines classes representing one-dimensional distributions.
Defines class ParameterSample.
Defines classes representing ranged one-dimensional distributions.
Interface for one-dimensional ranged distributions.
void checkInitialization()
~IRangedDistribution() override
std::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
virtual std::unique_ptr< IDistribution1D > distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.
std::vector< ParameterSample > generateSamples(double mean, double stddev) const
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()
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.