24template <
typename RealType>
33 double lgammaShapeRatio = 0;
40 [[nodiscard]] RealType
MinValue()
const override {
return 0; }
41 [[nodiscard]] RealType
MaxValue()
const override {
return INFINITY; }
54 [[nodiscard]]
inline double GetShape() const noexcept {
return mu; }
58 [[nodiscard]]
inline double GetSpread() const noexcept {
return omega; }
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>
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;
87 std::complex<double>
CFImpl(
double t)
const override;
94template <
typename RealType>
99 [[nodiscard]] std::string
Name()
const override;
114template <
typename RealType>
120 [[nodiscard]] std::string
Name()
const override;
132 [[nodiscard]]
long double Skewness()
const override;
146template <
typename RealType>
154 [[nodiscard]] std::string
Name()
const override;
164 [[nodiscard]]
double GetScale() const noexcept {
return sigma; }
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;
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;
189template <
typename RealType>
197 [[nodiscard]] std::string
Name()
const override;
207 [[nodiscard]]
double GetScale() const noexcept {
return sigma; }
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;
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;
223 RealType quantileImpl(
double p)
const override;
224 RealType quantileImpl1m(
double p)
const override;
244template <
typename RealType>
247 SetParameters(shape, spread);
250template <
typename RealType>
254 throw std::invalid_argument(
"Nakagami distribution: shape should be positive");
256 throw std::invalid_argument(
"Nakagami distribution: spread should be positive");
259 Y.SetParameters(mu, mu / omega);
260 lgammaShapeRatio = std::lgammal(mu + 0.5) - Y.GetLogGammaShape();
263template <
typename RealType>
273 return 2 * x * Y.f(x * x);
276template <
typename RealType>
289template <
typename RealType>
292 return (x > 0.0) ? Y.F(x * x) : 0.0;
295template <
typename RealType>
298 return (x > 0.0) ? Y.S(x * x) : 1.0;
301template <
typename RealType>
302template <std::uniform_random_bit_generator G>
305 return std::sqrt(Y(g));
308template <
typename RealType>
312 for (RealType &var : outputData)
313 var = std::sqrt(var);
316template <
typename RealType>
319 long double y = lgammaShapeRatio;
320 y -= 0.5 * Y.GetLogRate();
324template <
typename RealType>
327 long double y = lgammaShapeRatio;
329 return omega * (1 - y / mu);
332template <
typename RealType>
335 return std::sqrt(Y.Quantile(0.5));
338template <
typename RealType>
341 long double mode = 1.0 - 0.5 / mu;
344 return std::sqrt(omega * mode);
347template <
typename RealType>
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);
358template <
typename RealType>
361 long double fourthMoment = omega / mu;
362 fourthMoment *= fourthMoment;
363 fourthMoment *= mu * (mu + 1);
367template <
typename RealType>
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;
381template <
typename RealType>
384 return std::sqrt(Y.Quantile(p));
387template <
typename RealType>
390 return std::sqrt(Y.Quantile1m(p));
393template <
typename RealType>
399 double re = this->ExpectedValue(
403 return std::cos(t * x) - 1.0;
408 double im = this->ExpectedValue([t](
double x) {
return std::sin(t * x); }, 0, INFINITY);
410 return std::complex<double>(re, im);
413template <
typename RealType>
416 return "Nakagami(" + this->toStringWithPrecision(this->GetShape()) +
", " +
417 this->toStringWithPrecision(this->GetSpread()) +
")";
420template <
typename RealType>
426template <
typename RealType>
429 return "Chi(" + this->toStringWithPrecision(GetDegree()) +
")";
432template <
typename RealType>
436 throw std::invalid_argument(
"Chi distribution: degree parameter should be positive");
440template <
typename RealType>
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);
450template <
typename RealType>
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;
463template <
typename RealType>
469template <
typename RealType>
472 return "Maxwell-Boltzmann(" + this->toStringWithPrecision(GetScale()) +
")";
475template <
typename RealType>
479 throw std::invalid_argument(
"Maxwell-Boltzmann distribution: scale should be positive");
484template <
typename RealType>
489 double xAdj = x / sigma;
490 double xAdjSq = xAdj * xAdj;
491 double y = std::exp(-0.5 * xAdjSq);
495template <
typename RealType>
501 double y = std::exp(-xAdj * xAdj);
503 return std::erf(xAdj) - y;
506template <
typename RealType>
512 double y = std::exp(-xAdj * xAdj);
514 return std::erfc(xAdj) + y;
517template <
typename RealType>
518template <std::uniform_random_bit_generator G>
523 return sigma * std::sqrt(2 * W + N * N);
526template <
typename RealType>
532template <
typename RealType>
538template <
typename RealType>
544template <
typename RealType>
548 skewness = 2.0 / skewness;
549 skewness *= std::sqrt(skewness);
553template <
typename RealType>
560 denominator *= denominator;
561 return 4 * numerator / denominator;
564template <
typename RealType>
570template <
typename RealType>
573 return "Rayleigh(" + this->toStringWithPrecision(GetScale()) +
")";
576template <
typename RealType>
580 throw std::invalid_argument(
"Rayleigh distribution: scale should be positive");
585template <
typename RealType>
590 double y = x / (sigma * sigma);
591 return y * std::exp(-0.5 * x * y);
594template <
typename RealType>
599 double xAdj = x / sigma;
600 return -std::expm1l(-0.5 * xAdj * xAdj);
603template <
typename RealType>
608 double xAdj = x / sigma;
609 return std::exp(-0.5 * xAdj * xAdj);
612template <
typename RealType>
613template <std::uniform_random_bit_generator G>
617 return sigma * std::sqrt(2 * W);
620template <
typename RealType>
626template <
typename RealType>
632template <
typename RealType>
635 return sigma * std::sqrt(-2 * std::log1pl(-p));
638template <
typename RealType>
639RealType RayleighRand<RealType>::quantileImpl1m(
double p)
const
641 return sigma * std::sqrt(-2 * std::log(p));
644template <
typename RealType>
648 return sigma * medianCoef;
651template <
typename RealType>
657template <
typename RealType>
660 static const long double skewness =
665template <
typename RealType>
669 static constexpr long double kurtosis =
674template <
typename RealType>
678 if (!this->allElementsArePositive(sample))
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));
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)));
697 coef += 0.5 * std::log(n);
700 coef += 0.5 * std::log(sigmaBiasedSq);
701 SetScale(std::exp(coef));
708 SetScale(std::exp(scale));
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
Pair< double > DoublePair
Definition fwd.hpp:39