RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
nakagami.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <span>
4
10
11namespace randlib
12{
13
24template <typename RealType>
26{
27 RealType variate(detail::EngineRef g) const override { return (*this)(g); }
28 void sample(detail::EngineRef g, std::span<RealType> outputData) const override;
29
30 double mu = 0.5;
31 double omega = 1;
33 double lgammaShapeRatio = 0;
34
35protected:
36 NakagamiDistribution(double shape = 0.5, double spread = 1);
37
38public:
39 [[nodiscard]] Support SupportType() const override { return Support::RightSemiFinite; }
40 [[nodiscard]] RealType MinValue() const override { return 0; }
41 [[nodiscard]] RealType MaxValue() const override { return INFINITY; }
42
43protected:
48 void SetParameters(double shape, double spread);
49
50public:
54 [[nodiscard]] inline double GetShape() const noexcept { return mu; }
58 [[nodiscard]] inline double GetSpread() const noexcept { return omega; }
62 [[nodiscard]] inline double GetLogGammaFunction() const { return Y.GetLogGammaShape(); }
66 [[nodiscard]] inline double GetLogGammaShapeRatio() const noexcept { return lgammaShapeRatio; }
67
68 [[nodiscard]] double f(const RealType &x) const override;
69 [[nodiscard]] double logf(const RealType &x) const override;
70 [[nodiscard]] double F(const RealType &x) const override;
71 [[nodiscard]] double S(const RealType &x) const override;
72 template <std::uniform_random_bit_generator G>
73 [[nodiscard]] RealType operator()(G &g) const;
74
75 [[nodiscard]] long double Mean() const override;
76 [[nodiscard]] long double Variance() const override;
77 [[nodiscard]] RealType Median() const override;
78 [[nodiscard]] RealType Mode() const override;
79 [[nodiscard]] long double Skewness() const override;
80 [[nodiscard]] long double FourthMoment() const override;
81 [[nodiscard]] long double ExcessKurtosis() const override;
82
83protected:
84 RealType quantileImpl(double p) const override;
85 RealType quantileImpl1m(double p) const override;
86
87 std::complex<double> CFImpl(double t) const override;
88};
89
94template <typename RealType>
95class NakagamiRand final : public NakagamiDistribution<RealType>
96{
97public:
98 NakagamiRand(double shape = 0.5, double spread = 1) : NakagamiDistribution<RealType>(shape, spread) {}
99 [[nodiscard]] std::string Name() const override;
101};
102
114template <typename RealType>
115class ChiRand final : public NakagamiDistribution<RealType>
116{
117
118public:
119 explicit ChiRand(int degree);
120 [[nodiscard]] std::string Name() const override;
121
126 void SetDegree(int degree);
130 [[nodiscard]] inline int GetDegree() const { return 2 * NakagamiDistribution<RealType>::GetShape(); }
131
132 [[nodiscard]] long double Skewness() const override;
133 [[nodiscard]] long double ExcessKurtosis() const override;
134};
135
146template <typename RealType>
147class MaxwellBoltzmannRand final : public NakagamiDistribution<RealType>
148{
149 RealType variate(detail::EngineRef g) const override { return (*this)(g); }
150
151 double sigma = 1;
152public:
153 explicit MaxwellBoltzmannRand(double scale);
154 [[nodiscard]] std::string Name() const override;
155
160 void SetScale(double scale);
164 [[nodiscard]] double GetScale() const noexcept { return sigma; }
165
166 [[nodiscard]] double f(const RealType &x) const override;
167 [[nodiscard]] double F(const RealType &x) const override;
168 [[nodiscard]] double S(const RealType &x) const override;
169 template <std::uniform_random_bit_generator G>
170 [[nodiscard]] RealType operator()(G &g) const;
171
172 [[nodiscard]] long double Mean() const override;
173 [[nodiscard]] long double Variance() const override;
174 [[nodiscard]] RealType Mode() const override;
175 [[nodiscard]] long double Skewness() const override;
176 [[nodiscard]] long double ExcessKurtosis() const override;
177};
178
189template <typename RealType>
190class RayleighRand final : public NakagamiDistribution<RealType>
191{
192 RealType variate(detail::EngineRef g) const override { return (*this)(g); }
193
194 double sigma = 1;
195public:
196 explicit RayleighRand(double scale = 1);
197 [[nodiscard]] std::string Name() const override;
198
203 void SetScale(double scale);
207 [[nodiscard]] double GetScale() const noexcept { return sigma; }
208
209 [[nodiscard]] double f(const RealType &x) const override;
210 [[nodiscard]] double F(const RealType &x) const override;
211 [[nodiscard]] double S(const RealType &x) const override;
212 template <std::uniform_random_bit_generator G>
213 [[nodiscard]] RealType operator()(G &g) const;
214
215 [[nodiscard]] long double Mean() const override;
216 [[nodiscard]] long double Variance() const override;
217 [[nodiscard]] RealType Median() const override;
218 [[nodiscard]] RealType Mode() const override;
219 [[nodiscard]] long double Skewness() const override;
220 [[nodiscard]] long double ExcessKurtosis() const override;
221
222private:
223 RealType quantileImpl(double p) const override;
224 RealType quantileImpl1m(double p) const override;
225
226public:
233 RANDLIB_DEPRECATED_FIT_MEMBER void Fit(std::span<const RealType> sample, bool unbiased = false);
234};
235
236} // namespace randlib
237
240
241namespace randlib
242{
243
244template <typename RealType>
246{
247 SetParameters(shape, spread);
248}
249
250template <typename RealType>
251void NakagamiDistribution<RealType>::SetParameters(double shape, double spread)
252{
253 if (!(shape > 0.0))
254 throw std::invalid_argument("Nakagami distribution: shape should be positive");
255 if (!(spread > 0.0))
256 throw std::invalid_argument("Nakagami distribution: spread should be positive");
257 mu = shape;
258 omega = spread;
259 Y.SetParameters(mu, mu / omega);
260 lgammaShapeRatio = std::lgammal(mu + 0.5) - Y.GetLogGammaShape();
261}
262
263template <typename RealType>
264double NakagamiDistribution<RealType>::f(const RealType &x) const
265{
266 if (x < 0.0)
267 return 0.0;
268 if (x == 0) {
269 if (mu > 0.5)
270 return 0.0;
271 return (mu < 0.5) ? INFINITY : std::sqrt(randlib::consts::two_inv_pi / omega);
272 }
273 return 2 * x * Y.f(x * x);
274}
275
276template <typename RealType>
277double NakagamiDistribution<RealType>::logf(const RealType &x) const
278{
279 if (x < 0.0)
280 return -INFINITY;
281 if (x == 0) {
282 if (mu > 0.5)
283 return -INFINITY;
284 return (mu < 0.5) ? INFINITY : 0.5 * (randlib::consts::ln2 - randlib::consts::lnpi - std::log(omega));
285 }
286 return randlib::consts::ln2 + std::log(x) + Y.logf(x * x);
287}
288
289template <typename RealType>
290double NakagamiDistribution<RealType>::F(const RealType &x) const
291{
292 return (x > 0.0) ? Y.F(x * x) : 0.0;
293}
294
295template <typename RealType>
296double NakagamiDistribution<RealType>::S(const RealType &x) const
297{
298 return (x > 0.0) ? Y.S(x * x) : 1.0;
299}
300
301template <typename RealType>
302template <std::uniform_random_bit_generator G>
304{
305 return std::sqrt(Y(g));
306}
307
308template <typename RealType>
309void NakagamiDistribution<RealType>::sample(detail::EngineRef g, std::span<RealType> outputData) const
310{
311 Y.Sample(g, outputData);
312 for (RealType &var : outputData)
313 var = std::sqrt(var);
314}
315
316template <typename RealType>
318{
319 long double y = lgammaShapeRatio;
320 y -= 0.5 * Y.GetLogRate();
321 return std::exp(y);
322}
323
324template <typename RealType>
326{
327 long double y = lgammaShapeRatio;
328 y = std::exp(2 * y);
329 return omega * (1 - y / mu);
330}
331
332template <typename RealType>
334{
335 return std::sqrt(Y.Quantile(0.5));
336}
337
338template <typename RealType>
340{
341 long double mode = 1.0 - 0.5 / mu;
342 if (mode <= 0.0)
343 return 0.0;
344 return std::sqrt(omega * mode);
345}
346
347template <typename RealType>
349{
350 long double thirdMoment = lgammaShapeRatio;
351 thirdMoment -= 1.5 * Y.GetLogRate();
352 thirdMoment = (mu + 0.5) * std::exp(thirdMoment);
353 long double mean = Mean();
354 long double variance = Variance();
355 return (thirdMoment - mean * (3 * variance + mean * mean)) / std::pow(variance, 1.5);
356}
357
358template <typename RealType>
360{
361 long double fourthMoment = omega / mu;
362 fourthMoment *= fourthMoment;
363 fourthMoment *= mu * (mu + 1);
364 return fourthMoment;
365}
366
367template <typename RealType>
369{
370 long double mean = Mean();
371 long double secondMoment = this->SecondMoment();
372 long double thirdMoment = this->ThirdMoment();
373 long double fourthMoment = FourthMoment();
374 long double meanSq = mean * mean;
375 long double variance = secondMoment - meanSq;
376 long double numerator = fourthMoment - 4 * thirdMoment * mean + 6 * secondMoment * meanSq - 3 * meanSq * meanSq;
377 long double denominator = variance * variance;
378 return numerator / denominator - 3.0;
379}
380
381template <typename RealType>
383{
384 return std::sqrt(Y.Quantile(p));
385}
386
387template <typename RealType>
389{
390 return std::sqrt(Y.Quantile1m(p));
391}
392
393template <typename RealType>
394std::complex<double> NakagamiDistribution<RealType>::CFImpl(double t) const
395{
396 if (mu >= 0.5)
398
399 double re = this->ExpectedValue(
400 [t](double x) {
401 if (x == 0.0)
402 return 0.0;
403 return std::cos(t * x) - 1.0;
404 },
405 0, INFINITY) +
406 1.0;
407
408 double im = this->ExpectedValue([t](double x) { return std::sin(t * x); }, 0, INFINITY);
409
410 return std::complex<double>(re, im);
411}
413template <typename RealType>
415{
416 return "Nakagami(" + this->toStringWithPrecision(this->GetShape()) + ", " +
417 this->toStringWithPrecision(this->GetSpread()) + ")";
418}
420template <typename RealType>
422{
423 SetDegree(degree);
424}
425
426template <typename RealType>
427std::string ChiRand<RealType>::Name() const
428{
429 return "Chi(" + this->toStringWithPrecision(GetDegree()) + ")";
430}
431
432template <typename RealType>
434{
435 if (!(degree >= 1))
436 throw std::invalid_argument("Chi distribution: degree parameter should be positive");
438}
439
440template <typename RealType>
442{
443 long double mean = this->Mean();
444 long double sigmaSq = this->Variance();
445 long double skew = mean * (1 - 2 * sigmaSq);
446 skew /= std::pow(sigmaSq, 1.5);
447 return skew;
448}
449
450template <typename RealType>
452{
453 long double mean = this->Mean();
454 long double sigmaSq = this->Variance();
455 long double sigma = std::sqrt(sigmaSq);
456 long double skew = Skewness();
457 long double kurt = 1.0 - mean * sigma * skew;
458 kurt /= sigmaSq;
459 --kurt;
460 return 2 * kurt;
461}
463template <typename RealType>
465{
466 SetScale(scale);
467}
468
469template <typename RealType>
471{
472 return "Maxwell-Boltzmann(" + this->toStringWithPrecision(GetScale()) + ")";
473}
474
475template <typename RealType>
477{
478 if (!(scale > 0.0))
479 throw std::invalid_argument("Maxwell-Boltzmann distribution: scale should be positive");
480 sigma = scale;
481 NakagamiDistribution<RealType>::SetParameters(1.5, 3 * sigma * sigma);
482}
483
484template <typename RealType>
485double MaxwellBoltzmannRand<RealType>::f(const RealType &x) const
486{
487 if (x <= 0)
488 return 0;
489 double xAdj = x / sigma;
490 double xAdjSq = xAdj * xAdj;
491 double y = std::exp(-0.5 * xAdjSq);
492 return randlib::consts::sqrt2 * randlib::consts::inv_sqrtpi * xAdjSq * y / sigma;
493}
494
495template <typename RealType>
496double MaxwellBoltzmannRand<RealType>::F(const RealType &x) const
497{
498 if (x <= 0.0)
499 return 0.0;
500 double xAdj = randlib::consts::inv_sqrt2 * x / sigma;
501 double y = std::exp(-xAdj * xAdj);
502 y *= 2 * xAdj * randlib::consts::inv_sqrtpi;
503 return std::erf(xAdj) - y;
504}
505
506template <typename RealType>
507double MaxwellBoltzmannRand<RealType>::S(const RealType &x) const
508{
509 if (x <= 0.0)
510 return 1.0;
511 double xAdj = randlib::consts::inv_sqrt2 * x / sigma;
512 double y = std::exp(-xAdj * xAdj);
513 y *= 2 * xAdj * randlib::consts::inv_sqrtpi;
514 return std::erfc(xAdj) + y;
515}
516
517template <typename RealType>
518template <std::uniform_random_bit_generator G>
520{
522 RealType N = detail::standardNormal<RealType>(g);
523 return sigma * std::sqrt(2 * W + N * N);
524}
525
526template <typename RealType>
531
532template <typename RealType>
534{
535 return (3 - 8.0 * randlib::consts::inv_pi) * sigma * sigma;
536}
537
538template <typename RealType>
540{
541 return randlib::consts::sqrt2 * sigma;
542}
543
544template <typename RealType>
546{
547 long double skewness = 3 * randlib::consts::pi - 8;
548 skewness = 2.0 / skewness;
549 skewness *= std::sqrt(skewness);
550 return (16 - 5 * randlib::consts::pi) * skewness;
551}
552
553template <typename RealType>
555{
556 long double numerator = 40 - 3 * randlib::consts::pi;
557 numerator *= randlib::consts::pi;
558 numerator -= 96;
559 long double denominator = 3 * randlib::consts::pi - 8;
560 denominator *= denominator;
561 return 4 * numerator / denominator;
562}
564template <typename RealType>
566{
567 SetScale(scale);
568}
569
570template <typename RealType>
572{
573 return "Rayleigh(" + this->toStringWithPrecision(GetScale()) + ")";
574}
575
576template <typename RealType>
578{
579 if (!(scale > 0.0))
580 throw std::invalid_argument("Rayleigh distribution: scale should be positive");
581 sigma = scale;
583}
584
585template <typename RealType>
586double RayleighRand<RealType>::f(const RealType &x) const
587{
588 if (x <= 0)
589 return 0.0;
590 double y = x / (sigma * sigma);
591 return y * std::exp(-0.5 * x * y);
592}
593
594template <typename RealType>
595double RayleighRand<RealType>::F(const RealType &x) const
596{
597 if (x <= 0)
598 return 0.0;
599 double xAdj = x / sigma;
600 return -std::expm1l(-0.5 * xAdj * xAdj);
601}
602
603template <typename RealType>
604double RayleighRand<RealType>::S(const RealType &x) const
605{
606 if (x <= 0)
607 return 1.0;
608 double xAdj = x / sigma;
609 return std::exp(-0.5 * xAdj * xAdj);
610}
611
612template <typename RealType>
613template <std::uniform_random_bit_generator G>
615{
617 return sigma * std::sqrt(2 * W);
618}
619
620template <typename RealType>
622{
624}
625
626template <typename RealType>
628{
629 return (2.0 - randlib::consts::half_pi) * sigma * sigma;
630}
631
632template <typename RealType>
633RealType RayleighRand<RealType>::quantileImpl(double p) const
634{
635 return sigma * std::sqrt(-2 * std::log1pl(-p));
636}
637
638template <typename RealType>
639RealType RayleighRand<RealType>::quantileImpl1m(double p) const
640{
641 return sigma * std::sqrt(-2 * std::log(p));
642}
643
644template <typename RealType>
646{
647 static const double medianCoef = std::sqrt(randlib::consts::ln2 + randlib::consts::ln2);
648 return sigma * medianCoef;
649}
650
651template <typename RealType>
653{
654 return sigma;
655}
656
657template <typename RealType>
659{
660 static const long double skewness =
661 2 * randlib::consts::sqrtpi * (randlib::consts::pi - 3) / std::pow(4.0 - randlib::consts::pi, 1.5);
662 return skewness;
663}
664
665template <typename RealType>
667{
668 static constexpr long double temp = 4 - randlib::consts::pi;
669 static constexpr long double kurtosis =
670 -(6 * randlib::consts::pi * randlib::consts::pi - 24 * randlib::consts::pi + 16) / (temp * temp);
671 return kurtosis;
672}
673
674template <typename RealType>
675void RayleighRand<RealType>::Fit(std::span<const RealType> sample, bool unbiased)
676{
678 if (!this->allElementsArePositive(sample))
679 throw this->fitError(FitErrorCode::WrongSample, this->POSITIVITY_VIOLATION);
680 size_t n = sample.size();
681 DoublePair stats = this->GetSampleMeanAndVariance(sample);
682 double rawMoment = stats.second + stats.first * stats.first;
683 double sigmaBiasedSq = 0.5 * rawMoment;
684 if (unbiased == false) {
685 SetScale(std::sqrt(sigmaBiasedSq));
686 }
688 else if (n > 100) {
689 double logCorrection = 1.0 / (640 * std::pow(n, 5));
690 logCorrection -= 1.0 / (192 * std::pow(n, 3));
691 logCorrection += 0.125 / n;
692 SetScale(std::exp(logCorrection + 0.5 * std::log(sigmaBiasedSq)));
693 } else if (n > 15) {
694 double coef = math::lfact(n);
695 coef += math::lfact(n - 1);
696 coef += 2 * n * randlib::consts::ln2;
697 coef += 0.5 * std::log(n);
698 coef -= math::lfact(2 * n);
699 coef -= 0.5 * randlib::consts::lnpi;
700 coef += 0.5 * std::log(sigmaBiasedSq);
701 SetScale(std::exp(coef));
702 } else {
703 double scale = math::lfact(n - 1);
704 scale += math::lfact(n);
705 scale += 0.5 * std::log(n / randlib::consts::pi * sigmaBiasedSq);
706 scale += 2 * n * randlib::consts::ln2;
707 scale -= math::lfact(2 * n);
708 SetScale(std::exp(scale));
709 }
710}
711
712} // namespace randlib
The ChiRand class Chi distribution.
Definition nakagami.hpp:116
long double Skewness() const override
Definition nakagami.hpp:441
int GetDegree() const
Definition nakagami.hpp:130
std::string Name() const override
Definition nakagami.hpp:427
ChiRand(int degree)
CHI.
Definition nakagami.hpp:421
long double ExcessKurtosis() const override
Definition nakagami.hpp:451
void SetDegree(int degree)
set degree k
Definition nakagami.hpp:433
The ContinuousDistribution class Abstract class for all continuous distributions.
Definition continuous.hpp:22
The GammaRand class Gamma distribution.
Definition continuous/gamma.hpp:295
The MaxwellBoltzmannRand class Maxwell-Boltzmann distribution.
Definition nakagami.hpp:148
RealType operator()(G &g) const
Definition nakagami.hpp:519
long double Skewness() const override
Definition nakagami.hpp:545
long double Mean() const override
Definition nakagami.hpp:527
double S(const RealType &x) const override
Definition nakagami.hpp:507
MaxwellBoltzmannRand(double scale)
MAXWELL-BOLTZMANN.
Definition nakagami.hpp:464
std::string Name() const override
Definition nakagami.hpp:470
double GetScale() const noexcept
Definition nakagami.hpp:164
RealType Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition nakagami.hpp:539
double f(const RealType &x) const override
Definition nakagami.hpp:485
long double Variance() const override
Definition nakagami.hpp:533
void SetScale(double scale)
set scale σ
Definition nakagami.hpp:476
double F(const RealType &x) const override
Definition nakagami.hpp:496
long double ExcessKurtosis() const override
Definition nakagami.hpp:554
The NakagamiDistribution class Abstract class for Nakagami distribution.
Definition nakagami.hpp:26
double GetShape() const noexcept
Definition nakagami.hpp:54
std::complex< double > CFImpl(double t) const override
Definition nakagami.hpp:394
double GetLogGammaShapeRatio() const noexcept
Definition nakagami.hpp:66
void SetParameters(double shape, double spread)
Definition nakagami.hpp:251
long double ExcessKurtosis() const override
Definition nakagami.hpp:368
RealType quantileImpl1m(double p) const override
Definition nakagami.hpp:388
double f(const RealType &x) const override
Definition nakagami.hpp:264
NakagamiDistribution(double shape=0.5, double spread=1)
Definition nakagami.hpp:245
RealType quantileImpl(double p) const override
Definition nakagami.hpp:382
long double Variance() const override
Definition nakagami.hpp:325
double logf(const RealType &x) const override
Definition nakagami.hpp:277
long double FourthMoment() const override
Definition nakagami.hpp:359
RealType Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition nakagami.hpp:339
double GetSpread() const noexcept
Definition nakagami.hpp:58
RealType operator()(G &g) const
Definition nakagami.hpp:303
double S(const RealType &x) const override
Definition nakagami.hpp:296
RealType MinValue() const override
Definition nakagami.hpp:40
Support SupportType() const override
Definition nakagami.hpp:39
double GetLogGammaFunction() const
Definition nakagami.hpp:62
long double Mean() const override
Definition nakagami.hpp:317
RealType Median() const override
Definition nakagami.hpp:333
RealType MaxValue() const override
Definition nakagami.hpp:41
long double Skewness() const override
Definition nakagami.hpp:348
double F(const RealType &x) const override
Definition nakagami.hpp:290
The NakagamiRand class Nakagami distribution.
Definition nakagami.hpp:96
NakagamiRand(double shape=0.5, double spread=1)
Definition nakagami.hpp:98
std::string Name() const override
NAKAGAMI.
Definition nakagami.hpp:414
void Sample(std::span< T > outputData) const
Fills the output with variates drawn with the engine of this object.
Definition distribution.hpp:139
The RayleighRand class Rayleigh distribution.
Definition nakagami.hpp:191
long double Variance() const override
Definition nakagami.hpp:627
RealType operator()(G &g) const
Definition nakagami.hpp:614
void SetScale(double scale)
set scale σ
Definition nakagami.hpp:577
RayleighRand(double scale=1)
RAYLEIGH.
Definition nakagami.hpp:565
std::string Name() const override
Definition nakagami.hpp:571
long double ExcessKurtosis() const override
Definition nakagami.hpp:666
long double Skewness() const override
Definition nakagami.hpp:658
void Fit(std::span< const RealType > sample, bool unbiased=false)
fit scale via maximum-likelihood method if unbiased = false, otherwise set scale, returned by uniform...
Definition nakagami.hpp:675
RealType Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition nakagami.hpp:652
double F(const RealType &x) const override
Definition nakagami.hpp:595
long double Mean() const override
Definition nakagami.hpp:621
double GetScale() const noexcept
Definition nakagami.hpp:207
RealType Median() const override
Definition nakagami.hpp:645
double f(const RealType &x) const override
Definition nakagami.hpp:586
double S(const RealType &x) const override
Definition nakagami.hpp:604
virtual std::complex< double > CFImpl(double t) const
Definition univariate.hpp:365
The EngineRef class Non-owning, type-erased reference to any uniform random bit generator.
Definition engine/uniform.hpp:116
#define RANDLIB_DEPRECATED_FIT_MEMBER
Definition fwd.hpp:9
constexpr long double inv_pi
Definition constants.hpp:24
constexpr long double ln2
Definition constants.hpp:18
constexpr long double half_pi
Definition constants.hpp:23
constexpr long double sqrtpi
Definition constants.hpp:31
constexpr long double pi
Definition constants.hpp:22
constexpr long double two_inv_pi
Definition constants.hpp:25
constexpr long double inv_sqrt2
Definition constants.hpp:28
constexpr long double inv_sqrtpi
Definition constants.hpp:33
constexpr long double sqrt2
Definition constants.hpp:27
constexpr long double lnpi
Definition constants.hpp:21
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45
Real lfact(size_t n)
Calculate log(n!) using table values for small n <= 255 and built-in lgamma function for large n > 25...
Definition math/gamma.hpp:591
Definition bivariate_normal.hpp:10
@ WrongSample
the sample could not have been drawn from this distribution
Support
Shape of the support of a univariate distribution.
Definition univariate.hpp:15
@ RightSemiFinite
[a, ∞)
Pair< double > DoublePair
Definition fwd.hpp:39