25template <
typename RealType>
40 PlanckRand(
double shape = 1,
double scale = 1);
42 [[nodiscard]] std::string
Name()
const override;
44 [[nodiscard]] RealType
MinValue()
const override {
return 0; }
45 [[nodiscard]] RealType
MaxValue()
const override {
return INFINITY; }
48 [[nodiscard]]
inline double GetShape() const noexcept {
return a; }
49 [[nodiscard]]
inline double GetScale() const noexcept {
return b; }
56 double h(
double t)
const;
59 [[nodiscard]]
double f(
const RealType &x)
const override;
60 [[nodiscard]]
double logf(
const RealType &x)
const override;
61 [[nodiscard]]
double F(
const RealType &x)
const override;
62 [[nodiscard]]
double S(
const RealType &x)
const override;
63 template <std::uniform_random_bit_generator G>
66 [[nodiscard]]
long double Mean()
const override;
68 [[nodiscard]]
long double Variance()
const override;
69 [[nodiscard]] RealType
Mode()
const override;
70 [[nodiscard]]
long double ThirdMoment()
const override;
71 [[nodiscard]]
long double Skewness()
const override;
76 std::complex<double> CFImpl(
double t)
const override;
84template <
typename RealType>
87 SetParameters(shape, scale);
90template <
typename RealType>
93 return "Planck(" + this->toStringWithPrecision(GetShape()) +
", " + this->toStringWithPrecision(GetScale()) +
")";
96template <
typename RealType>
100 throw std::invalid_argument(
"Planck distribution: shape should be positive, but it's equal to " +
101 std::to_string(shape));
103 throw std::invalid_argument(
"Planck distribution: scale should be positive, but it's equal to " +
104 std::to_string(scale));
110 gammaVariable.SetParameters(ap1, b);
112 pdfCoef = -Z.GetLogZetaFunction();
113 pdfCoef += ap1 * std::log(b);
114 pdfCoef -= gammaVariable.GetLogGammaShape();
117template <
typename RealType>
122 double y = pdfCoef + a * std::log(t);
123 double expY = std::exp(y);
125 double z = 1.0 / std::expm1l(bt) - 1.0 / bt;
129template <
typename RealType>
138 return std::exp(pdfCoef) / b;
141 double y = pdfCoef + a * std::log(x);
142 return std::exp(y) / std::expm1l(b * x);
145template <
typename RealType>
154 return pdfCoef - gammaVariable.GetLogRate();
157 double y = pdfCoef + a * std::log(x);
161template <
typename RealType>
172 double aux = pdfCoef + a * std::log(x);
173 double integral1 = std::exp(aux) / (b * a);
174 double integral2 =
math::integrate([
this](
double t) {
return h(t); }, 0, x);
175 return integral1 + integral2;
178template <
typename RealType>
184 double upper =
math::integrate([
this](
double t) {
return f(t); }, x, INFINITY);
185 return (upper < 0.5) ? upper : 1.0 - F(x);
188template <
typename RealType>
189template <std::uniform_random_bit_generator G>
192 return gammaVariable(g) / Z(g);
195template <
typename RealType>
198 gammaVariable.
Sample(g, outputData);
199 for (RealType &var : outputData)
203template <
typename RealType>
206 double y = (a + 1) / b;
208 return y / Z.GetZetaFunction();
211template <
typename RealType>
214 long double secondMoment = (a + 1) * (a + 2);
215 secondMoment /= (b * b);
217 secondMoment /= Z.GetZetaFunction();
221template <
typename RealType>
224 long double mean = Mean();
225 return SecondMoment() - mean * mean;
228template <
typename RealType>
233 double y = -a * std::exp(-a);
238template <
typename RealType>
241 long double thirdMoment = (a + 3) * (a + 2) * (a + 1);
242 thirdMoment /= (b * b * b);
244 thirdMoment /= Z.GetZetaFunction();
248template <
typename RealType>
251 long double mean = Mean();
252 long double secondMoment = SecondMoment();
253 long double thirdMoment = ThirdMoment();
254 long double meanSq = mean * mean;
255 long double variance = secondMoment - meanSq;
256 long double numerator = thirdMoment - 3 * mean * variance - mean * meanSq;
257 long double denominator = std::pow(variance, 1.5);
258 return numerator / denominator;
261template <
typename RealType>
264 long double fourthMoment = (a + 4) * (a + 3) * (a + 2) * (a + 1);
265 long double bSq = b * b;
266 fourthMoment /= (bSq * bSq);
268 fourthMoment /= Z.GetZetaFunction();
272template <
typename RealType>
275 long double mean = Mean();
276 long double secondMoment = SecondMoment();
277 long double thirdMoment = ThirdMoment();
278 long double fourthMoment = FourthMoment();
279 long double meanSq = mean * mean;
280 long double variance = secondMoment - meanSq;
281 long double numerator = fourthMoment - 4 * thirdMoment * mean + 6 * secondMoment * meanSq - 3 * meanSq * meanSq;
282 long double denominator = variance * variance;
283 return numerator / denominator - 3.0;
286template <
typename RealType>
298 double re1 =
math::integrate([
this, t](
double x) {
return std::cos(t * x) * h(x); }, 0.0, 1.0);
300 double re2 = this->ExpectedValue([t](
double x) {
return std::cos(t * x); }, 1.0, INFINITY);
303 [
this, t](
double x) {
306 return std::sin(t * x) * std::pow(x, a);
311 re3 *= std::exp(pdfCoef) / (b * a);
313 double im = this->ExpectedValue([t](
double x) {
return std::sin(t * x); }, 0.0, INFINITY);
315 double re = re1 + re2 + re3;
316 return std::complex<double>(re, im);
The ContinuousDistribution class Abstract class for all continuous distributions.
Definition continuous.hpp:22
The GammaRand class Gamma distribution.
Definition continuous/gamma.hpp:295
The PlanckRand class Planck distribution.
Definition planck.hpp:27
std::string Name() const override
Definition planck.hpp:91
double S(const RealType &x) const override
Definition planck.hpp:179
PlanckRand(double shape=1, double scale=1)
Definition planck.hpp:85
RealType operator()(G &g) const
Definition planck.hpp:190
long double SecondMoment() const override
Definition planck.hpp:212
RealType MinValue() const override
Definition planck.hpp:44
Support SupportType() const override
Definition planck.hpp:43
long double Skewness() const override
Definition planck.hpp:249
double GetShape() const noexcept
Definition planck.hpp:48
long double ExcessKurtosis() const override
Definition planck.hpp:273
double F(const RealType &x) const override
Definition planck.hpp:162
long double Mean() const override
Definition planck.hpp:204
double f(const RealType &x) const override
Definition planck.hpp:130
long double ThirdMoment() const override
Definition planck.hpp:239
long double FourthMoment() const override
Definition planck.hpp:262
long double Variance() const override
Definition planck.hpp:222
RealType MaxValue() const override
Definition planck.hpp:45
RealType Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition planck.hpp:229
void SetParameters(double shape, double scale)
Definition planck.hpp:97
double logf(const RealType &x) const override
Definition planck.hpp:146
double GetScale() const noexcept
Definition planck.hpp:49
void Sample(std::span< T > outputData) const
Fills the output with variates drawn with the engine of this object.
Definition distribution.hpp:139
virtual std::complex< double > CFImpl(double t) const
Definition univariate.hpp:365
The ZetaRand class Zeta distribution.
Definition zeta.hpp:21
The EngineRef class Non-owning, type-erased reference to any uniform random bit generator.
Definition engine/uniform.hpp:116
constexpr long double ln2
Definition constants.hpp:18
constexpr long double ln3
Definition constants.hpp:19
constexpr long double lnpi
Definition constants.hpp:21
Real W0Lambert(Real x, std::type_identity_t< Real > epsilon=Real{1e-11})
Definition functions.hpp:689
Real riemannZeta(Real s)
Definition special_functions.hpp:340
Real integrate(const F &f, std::type_identity_t< Real > a, std::type_identity_t< Real > b, std::type_identity_t< Real > tolerance=1e-11, int maxSubdivisions=512)
Global adaptive Gauss-Kronrod quadrature (QUADPACK QAG).
Definition quadrature.hpp:226
Real logexpm1l(Real x)
Definition functions.hpp:266
Definition bivariate_normal.hpp:10
Support
Shape of the support of a univariate distribution.
Definition univariate.hpp:15