27 bool DoubleEqual(
double a,
double b);
48 throw std::runtime_error(
"IDistribution1D::generateSamples: "
49 "number of generated samples must be bigger than zero");
57 std::vector<ParameterSample>
61 throw std::runtime_error(
"IDistribution1D::generateSamples: "
62 "number of generated samples must be bigger than zero");
73 if (nbr_samples < 2 || DoubleEqual(xmin, xmax))
75 std::vector<double> result(nbr_samples);
76 for (
size_t i = 0; i < nbr_samples; ++i)
77 result[i] = xmin + i * (xmax - xmin) / (nbr_samples - 1.0);
89 std::ostringstream ostr;
90 ostr <<
"IDistribution1D::adjustMinMaxForLimits() -> Error. Can't' adjust ";
91 ostr <<
"xmin:" << xmin <<
" xmax:" << xmax <<
" for given limits " << limits << std::endl;
92 throw std::runtime_error(ostr.str());
98 std::vector<ParameterSample>
101 std::vector<ParameterSample> result;
102 double norm_factor = 0.0;
103 for (
double value : sample_values) {
105 result.emplace_back(value, pdf);
108 if (norm_factor <= 0.0)
109 throw std::runtime_error(
"IDistribution1D::generateSamples: "
110 "total probability must be bigger than zero");
112 sample.weight /= norm_factor;
127 throw std::runtime_error(
"DistributionGate: max<min");
142 if (x < m_min || x >
m_max)
179 throw std::runtime_error(
"DistributionLorentz: hwhm<0");
195 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
202 if (sigma_factor <= 0.0)
231 throw std::runtime_error(
"DistributionGaussian: std_dev < 0");
247 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
255 if (sigma_factor <= 0.0)
280 , m_scale_param(m_P[1])
284 throw std::runtime_error(
"DistributionLogNormal: scale_param < 0");
286 throw std::runtime_error(
"DistributionLogNormal: median < 0");
297 return DoubleEqual(x,
m_median) ? 1.0 : 0.0;
305 return m_median * std::exp(exponent);
312 if (nbr_samples < 2) {
313 std::vector<double> result;
317 if (sigma_factor <= 0.0)
347 throw std::runtime_error(
"DistributionCosine: sigma<0");
363 return DoubleEqual(x,
m_mean) ? 1.0 : 0.0;
372 if (sigma_factor <= 0.0 || sigma_factor > 2.0)
403 throw std::runtime_error(
"DistributionTrapezoid: leftWidth < 0");
405 throw std::runtime_error(
"DistributionTrapezoid: middleWidth < 0");
407 throw std::runtime_error(
"DistributionTrapezoid: rightWidth < 0");
428 return (x - min) * height /
m_left;
458 size_t nbr_samples)
const
460 if (nbr_samples <= 1)
462 size_t N = nbr_samples;
467 if (
N == nbr_samples)
469 double step = (max - min) / (
N - 1);
478 bool DoubleEqual(
double a,
double b)
481 * std::max(std::abs(a) * std::numeric_limits<double>::epsilon(),
482 std::numeric_limits<double>::min());
483 return std::abs(a - b) < eps;
Defines M_PI and some more mathematical constants.
Defines classes representing one-dimensional distributions.
Defines class ParameterSample.
double mean() const override
Returns the distribution-specific mean.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
generate list of sample values
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
Uniform distribution function with half width hwhm.
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
Returns list of sample values.
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
Gaussian distribution with standard deviation std_dev.
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
generate list of sample values
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
double mean() const override
Returns the distribution-specific mean.
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
double mean() const override
Returns the distribution-specific mean.
const double & m_scale_param
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
DistributionLogNormal(std::vector< double > P)
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
generate list of sample values
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
Lorentz distribution with half width hwhm.
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
generate list of sample values
double mean() const override
Returns the distribution-specific mean.
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
Trapezoidal distribution.
std::vector< double > equidistantPoints(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const override
generate list of sample values
double probabilityDensity(double x) const override
Returns the distribution-specific probability density for value x.
std::string pythonConstructor(const std::string &units) const override
Prints distribution with constructor parameters in given units. ba.DistributionGaussian(2....
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
void adjustLimitsToNonZeroSamples(double &min, double &max, size_t nbr_samples) const
bool isDelta() const override
Returns true if the distribution is in the limit case of a Dirac delta distribution.
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.
std::vector< ParameterSample > equidistantSamplesInRange(size_t nbr_samples, double xmin, double xmax) const
Returns equidistant samples from xmin to xmax, weighted with probabilityDensity().
virtual double mean() const =0
Returns the distribution-specific mean.
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.
IDistribution1D(const std::vector< double > &PValues)
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 ...
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.
void checkNodeArgs() const
Raises exception if a parameter value is invalid.
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
std::string printFunction(const std::string &name, const std::vector< std::pair< double, std::string >> &arguments)
Print a function in the form "<name>(<arguments>)". arguments will be processed by printArguments(),...