24 std::unique_ptr<T> makeCopy(
const T& item)
26 return std::make_unique<T>(item.nSamples(), item.sigmaFactor(), item.limits());
29 const double gate_stddev_factor = 2.0 * std::sqrt(3.0);
47 : m_n_samples(n_samples)
48 , m_sigma_factor(sigma_factor)
56 : m_n_samples(n_samples)
57 , m_sigma_factor(sigma_factor)
68 if (!generator->isDelta())
75 return std::vector<ParameterSample>(
m_n_samples, sample);
78 std::vector<std::vector<ParameterSample>>
80 const std::vector<double>& stddev)
const
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");
86 const size_t size = mean.size();
88 std::vector<std::vector<ParameterSample>> result;
90 for (
size_t i = 0; i < size; ++i)
98 throw std::runtime_error(
99 "Error in IRangedDistribution::distribution: standard deviation is less than zero");
106 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: number of "
107 "samples shall be positive");
110 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: sigma factor "
111 "shall be non-negative.");
117 throw std::runtime_error(
"Error in IRangedDistribution::checkInitialization: lower limit "
118 "shall not exceed the upper one.");
144 return makeCopy(*this).release();
149 return "RangedDistributionGate";
154 const double x_min = mean - gate_stddev_factor * stddev;
155 const double x_max = mean + gate_stddev_factor * stddev;
175 double min,
double max)
182 return makeCopy(*this).release();
187 return "RangedDistributionLorentz";
211 double min,
double max)
218 return makeCopy(*this).release();
223 return "RangedDistributionGaussian";
247 double min,
double max)
254 return makeCopy(*this).release();
259 return "RangedDistributionLogNormal";
264 const double mean_2 = mean * mean;
265 if (mean_2 <= std::numeric_limits<double>::min())
266 throw std::runtime_error(
"Error in DistributionLogNormal::distribution: mean square value "
267 "is less or indistinguishable from zero.");
269 const double scale = std::sqrt(std::log(stddev * stddev / mean_2 + 1.0));
270 const double median = mean * std::exp(-scale * scale / 2.0);
290 double min,
double max)
297 return makeCopy(*this).release();
302 return "RangedDistributionCosine";
Defines classes representing one-dimensional distributions.
Defines class ParameterSample.
Defines classes representing ranged one-dimensional distributions.
Uniform distribution function with half width hwhm.
Gaussian distribution with standard deviation std_dev.
Lorentz distribution with half width hwhm.
Interface for one-dimensional distributions.
Interface for one-dimensional ranged distributions. All derived distributions allow for generating sa...
void checkInitialization()
virtual IDistribution1D * distribution_impl(double mean, double stddev) const =0
Returns underlying IDistribution1D object.
IDistribution1D * distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
~IRangedDistribution() override
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::string name() const override
Returns distribution name for python-formatted text.
RangedDistributionCosine()
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
Uniform distribution function.
RangedDistributionGate * clone() const override
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.
Gaussian distribution with standard deviation std_dev.
std::string name() const override
Returns distribution name for python-formatted text.
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
RangedDistributionGaussian()
RangedDistributionGaussian * clone() const override
IDistribution1D * distribution_impl(double mean, double stddev) const override
Returns underlying IDistribution1D object.
RangedDistributionLogNormal * clone() const override
std::string name() const override
Returns distribution name for python-formatted text.
RangedDistributionLogNormal()
Lorentz distribution with median and hwhm.
std::string name() const override
Returns distribution name for python-formatted text.
RangedDistributionLorentz * clone() const override
RangedDistributionLorentz()
IDistribution1D * distribution_impl(double median, double hwhm) const override
Returns underlying IDistribution1D object.
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.