26 bool DoubleEqual(
double a,
double b);
34 :
INode(meta, PValues)
45 throw std::runtime_error(
"IDistribution1D::generateSamples: "
46 "number of generated samples must be bigger than zero");
54 std::vector<ParameterSample>
58 throw std::runtime_error(
"IDistribution1D::generateSamples: "
59 "number of generated samples must be bigger than zero");
70 if (nbr_samples < 2 || DoubleEqual(xmin, xmax))
72 std::vector<double> result(nbr_samples);
73 for (
size_t i = 0; i < nbr_samples; ++i)
74 result[i] = xmin + i * (xmax - xmin) / (nbr_samples - 1.0);
92 std::ostringstream ostr;
93 ostr <<
"IDistribution1D::adjustMinMaxForLimits() -> Error. Can't' adjust ";
94 ostr <<
"xmin:" << xmin <<
" xmax:" << xmax <<
" for given limits " << limits << std::endl;
95 throw std::runtime_error(ostr.str());
101 std::vector<ParameterSample>
104 std::vector<ParameterSample> result;
105 double norm_factor = 0.0;
106 for (
double value : sample_values) {
111 if (norm_factor <= 0.0)
112 throw std::runtime_error(
"IDistribution1D::generateSamples: "
113 "total probability must be bigger than zero");
115 sample.weight /= norm_factor;
127 {{
"Min",
"",
"para_tooltip", -
INF, +
INF, 0}, {
"Max",
"",
"para_tooltip", -
INF, +
INF, 0}}},
133 throw std::runtime_error(
"DistributionGate: max<min");
145 if (x < m_min || x >
m_max)
173 {{
"Mean",
"",
"para_tooltip", -
INF, +
INF, 0},
174 {
"HWHM",
"",
"para_tooltip", -
INF, +
INF, 0}}},
180 throw std::runtime_error(
"DistributionLorentz: hwhm<0");
193 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
200 if (sigma_factor <= 0.0)
220 {{
"Mean",
"",
"para_tooltip", -
INF, +
INF, 0},
221 {
"StdDev",
"",
"para_tooltip", -
INF, +
INF, 0}}},
227 throw std::runtime_error(
"DistributionGaussian: std_dev < 0");
240 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
248 if (sigma_factor <= 0.0)
268 {{
"Median",
"",
"para_tooltip", -
INF, +
INF, 0},
269 {
"ScaleParameter",
"",
"para_tooltip", -
INF, +
INF, 0}}},
272 , m_scale_param(m_P[1])
274 if (m_scale_param < 0.0)
275 throw std::runtime_error(
"DistributionLogNormal: scale_param < 0");
277 throw std::runtime_error(
"DistributionLogNormal: median < 0");
290 return DoubleEqual(x,
m_median) ? 1.0 : 0.0;
298 return m_median * std::exp(exponent);
305 if (nbr_samples < 2) {
306 std::vector<double> result;
310 if (sigma_factor <= 0.0)
336 {{
"Mean",
"",
"para_tooltip", -
INF, +
INF, 0},
337 {
"Sigma",
"",
"para_tooltip", -
INF, +
INF, 0}}},
343 throw std::runtime_error(
"DistributionCosine: sigma<0");
356 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
365 if (sigma_factor <= 0.0 || sigma_factor > 2.0)
385 {{
"Center",
"",
"para_tooltip", -
INF, +
INF, 0},
386 {
"LeftWidth",
"",
"para_tooltip", -
INF, +
INF, 0},
387 {
"MiddleWidth",
"",
"para_tooltip", -
INF, +
INF, 0},
388 {
"RightWidth",
"",
"para_tooltip", -
INF, +
INF, 0}}},
396 throw std::runtime_error(
"DistributionTrapezoid: leftWidth < 0");
398 throw std::runtime_error(
"DistributionTrapezoid: middleWidth < 0");
400 throw std::runtime_error(
"DistributionTrapezoid: rightWidth < 0");
416 return (x - min) * height /
m_left;
441 size_t nbr_samples)
const
443 if (nbr_samples <= 1)
445 size_t N = nbr_samples;
450 if (N == nbr_samples)
452 double step = (max - min) / (N - 1);
460 bool DoubleEqual(
double a,
double b)
463 * std::max(std::abs(a) * std::numeric_limits<double>::epsilon(),
464 std::numeric_limits<double>::min());
465 return std::abs(a - b) < eps;
Defines M_PI and some more mathematical constants.
Defines classes representing one-dimensional distributions.
Defines class ParameterPool.
Defines class ParameterSample.
Defines class RealParameter.
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
generate list of sample values
Uniform distribution function with half width hwhm.
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
Returns list of sample values.
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
Gaussian distribution with standard deviation std_dev.
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
generate list of sample values
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
double getMean() const final
Returns the distribution-specific mean.
const double & m_scale_param
virtual void setUnits(const std::string &units)
Sets distribution units.
DistributionLogNormal()=delete
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
generate list of sample values
Lorentz distribution with half width hwhm.
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
generate list of sample values
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
Trapezoidal distribution.
bool isDelta() const final
Returns true if the distribution is in the limit case of a Dirac delta distribution.
double probabilityDensity(double x) const final
Returns the distribution-specific probability density for value x.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
generate list of sample values
void adjustLimitsToNonZeroSamples(double &min, double &max, size_t nbr_samples) const
Interface for one-dimensional distributions.
std::vector< ParameterSample > generateSamplesFromValues(const std::vector< double > &sample_values) const
Returns weighted samples from given interpolation points and probabilityDensity().
virtual double probabilityDensity(double x) const =0
Returns the distribution-specific probability density for value x.
virtual double getMean() const =0
Returns the distribution-specific mean.
std::vector< ParameterSample > equidistantSamplesInRange(size_t nbr_samples, double xmin, double xmax) const
Returns equidistant samples from xmin to xmax, weighted with probabilityDensity().
IDistribution1D(const NodeMeta &meta, const std::vector< double > &PValues)
void adjustMinMaxForLimits(double &xmin, double &xmax, const RealLimits &limits) const
modifies xmin and xmax if they are outside of limits
virtual std::vector< double > equidistantPointsInRange(size_t nbr_samples, double xmin, double xmax) const
Returns equidistant interpolation points from xmin to xmax.
virtual bool isDelta() const =0
Returns true if the distribution is in the limit case of a Dirac delta distribution.
virtual std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const =0
Returns equidistant interpolation points, with range computed in distribution-specific way from mean ...
virtual void setUnits(const std::string &units)
Sets distribution units.
std::vector< ParameterSample > equidistantSamples(size_t nbr_samples, double sigma_factor=0., const RealLimits &limits=RealLimits()) const
Returns equidistant samples, using intrinsic parameters, weighted with probabilityDensity().
Base class for tree-like structures containing parameterized objects.
ParameterPool * parameterPool() const
Returns pointer to the parameter pool.
RealParameter * parameter(const std::string &name) const
Returns parameter with given 'name'.
A parameter value with a weight, as obtained when sampling from a distribution.
Limits for a real fit parameter.
bool hasUpperLimit() const
if has upper limit
double upperLimit() const
Returns upper limit.
double lowerLimit() const
Returns lower limit.
bool hasLowerLimit() const
if has lower limit
RealParameter & setUnit(const std::string &name)