55 [[nodiscard]]
virtual long double Mean()
const = 0;
60 [[nodiscard]]
virtual long double Variance()
const = 0;
68 virtual T quantileImpl(
double p, T initValue)
const = 0;
69 virtual T quantileImpl(
double p)
const = 0;
76 virtual T quantileImpl1m(
double p, T initValue)
const = 0;
77 virtual T quantileImpl1m(
double p)
const = 0;
84 virtual std::complex<double>
CFImpl(
double t)
const;
92 virtual long double ExpectedValue(
const std::function<
double(T)> &funPtr, T minPoint, T maxPoint)
const = 0;
125 [[nodiscard]] std::complex<double>
CF(
double t)
const;
137 [[nodiscard]]
virtual double Hazard(
const T &x)
const = 0;
156 [[nodiscard]]
virtual T
Mode()
const = 0;
162 [[nodiscard]]
virtual long double Skewness()
const;
278 [[nodiscard]]
static std::tuple<long double, long double, long double, long double>
295 Support supp = this->SupportType();
302 Support supp = this->SupportType();
309 if (!(p >= 0.0 && p <= 1.0))
310 throw std::invalid_argument(
"Probability p in quantile function should be in interval [0, 1]");
311 double minVal = this->MinValue();
314 double maxVal = this->MaxValue();
317 double x = this->quantileImpl(p);
320 return (x > maxVal) ? maxVal : x;
326 if (!(p >= 0.0 && p <= 1.0))
327 throw std::invalid_argument(
"Probability p in quantile function should be in interval [0, 1]");
328 double minVal = this->MinValue();
331 double maxVal = this->MaxValue();
334 double x = this->quantileImpl1m(p);
337 return (x > maxVal) ? maxVal : x;
343 const size_t size = std::min(p.size(), y.size());
344 for (
size_t i = 0; i != size; ++i)
351 const size_t size = std::min(p.size(), y.size());
352 for (
size_t i = 0; i != size; ++i)
353 y[i] = this->Quantile1m(p[i]);
361 return (t > 0.0) ? this->CFImpl(t) : std::conj(this->CFImpl(-t));
367 T leftBound = this->MinValue(), rightBound = this->MaxValue();
368 if (leftBound == rightBound)
369 return std::complex<double>(std::cos(t * leftBound), std::sin(t * leftBound));
371 double re = this->ExpectedValue([t](
double x) {
return std::cos(t * x); }, leftBound, rightBound);
373 double im = this->ExpectedValue([t](
double x) {
return std::sin(t * x); }, leftBound, rightBound);
375 return std::complex<double>(re, im);
380 std::span<std::complex<double>> y)
const
382 const size_t size = std::min(t.size(), y.size());
383 for (
size_t i = 0; i != size; ++i)
384 y[i] = this->CF(t[i]);
390 const size_t size = std::min(x.size(), y.size());
391 for (
size_t i = 0; i != size; ++i)
392 y[i] = this->Hazard(x[i]);
398 return quantileImpl(0.5);
404 long double var = this->Variance();
405 if (!std::isfinite(var))
407 long double mu = this->Mean();
409 long double sum = this->ExpectedValue(
411 double xmmu = x - mu;
412 double skewness = xmmu * xmmu * xmmu;
415 this->MinValue(), this->MaxValue());
417 return sum / std::pow(var, 1.5);
423 long double var = this->Variance();
424 if (!std::isfinite(var))
426 long double mu = this->Mean();
428 long double sum = this->ExpectedValue(
430 double xmmu = x - mu;
431 double kurtosisSqrt = xmmu * xmmu;
432 double kurtosis = kurtosisSqrt * kurtosisSqrt;
435 this->MinValue(), this->MaxValue());
437 return sum / (var * var) - 3;
443 return this->ExcessKurtosis() + 3.0;
449 long double mean = this->Mean();
450 return mean * mean + this->Variance();
456 long double mean = this->Mean();
457 long double variance = this->Variance();
458 long double skewness = this->Skewness();
460 long double moment = skewness * std::sqrt(variance) * variance;
461 moment += mean * mean * mean;
462 moment += 3 * mean * variance;
469 long double mean = this->Mean();
470 long double variance = this->Variance();
471 long double moment3 = this->ThirdMoment();
472 long double kurtosis = this->Kurtosis();
473 long double meanSq = mean * mean;
475 long double moment = kurtosis * variance * variance;
476 moment -= 6 * meanSq * variance;
477 moment -= 3 * meanSq * meanSq;
478 moment += 4 * mean * moment3;
485 for (
const T &var : sample) {
495 for (
const T &var : sample) {
505 return allElementsAreNotSmallerThan(0, sample);
511 for (
const T &var : sample) {
521 return std::accumulate(sample.begin(), sample.end(), 0.0);
527 size_t n = sample.size();
528 return (n > 0) ? GetSampleSum(sample) / n : 0.0;
534 long double sum = 0.0;
535 for (
const T &var : sample)
536 sum += std::log(var);
537 return sum / sample.size();
543 long double sum = 0.0l;
544 for (
const T &var : sample) {
545 double temp = var - mean;
548 return sum / sample.size();
554 long double sum = 0.0l;
555 for (
const T &var : sample) {
556 double temp = std::log(var) - logMean;
559 return sum / sample.size();
566 long double m = 0.0l, v = 0.0l;
567 int n = sample.size();
568 for (
int i = 0; i < n; ++i) {
569 double x = sample[i];
574 return std::make_pair(m, v / n);
581 long double m = 0.0l, v = 0.0l;
582 int n = sample.size();
583 for (
int i = 0; i < n; ++i) {
584 double logX = std::log(sample[i]);
585 double diff = logX - m;
587 v += diff * (logX - m);
589 return std::make_pair(m, v / n);
593std::tuple<long double, long double, long double, long double>
597 long double M1{}, M2{}, M3{}, M4{};
598 long double m1{}, m2{}, m3{}, m4{};
599 size_t n = sample.size(), k = 0;
601 static constexpr size_t BIG_NUMBER = 10000;
602 for (
const T &var : sample) {
604 long double delta = var - m1;
605 long double delta_k = delta / k;
606 long double delta_kSq = delta_k * delta_k;
607 long double term1 = delta * delta_k * (k - 1);
609 m4 += term1 * delta_kSq * (k * k - 3 * k + 3) + 6 * delta_kSq * m2 - 4 * delta_k * m3;
610 m3 += term1 * delta_k * (k - 2) - 3 * delta_k * m2;
616 if (k >= BIG_NUMBER) {
617 long double Delta = m1 - M1;
618 long double DeltaSq = Delta * Delta;
621 M4 += m4 + (DeltaSq * DeltaSq * t * (t * t - t + 1) * BIG_NUMBER) / (tp1 * tp1 * tp1);
622 M4 += 6 * DeltaSq * (t * t * m2 + M2) / (tp1 * tp1);
623 M4 += 4 * Delta * (t * m3 - M3) / tp1;
625 M3 += m3 + (DeltaSq * Delta * t * (t - 1) * BIG_NUMBER) / (tp1 * tp1);
626 M3 += 3 * Delta * (t * m2 - M2) / tp1;
628 M2 += m2 + (DeltaSq * t * BIG_NUMBER) / tp1;
640 long double res =
static_cast<long double>(k) / BIG_NUMBER;
642 long double Delta = m1 - M1;
643 long double DeltaSq = Delta * Delta;
644 long double tpres = t + res;
646 M4 += m4 + (DeltaSq * DeltaSq * t * res * (t * t - res * t + res * res) * BIG_NUMBER) / (tpres * tpres * tpres);
647 M4 += 6 * DeltaSq * (t * t * m2 + res * res * M2) / (tpres * tpres);
648 M4 += 4 * Delta * (t * m3 - res * M3) / tpres;
650 M3 += m3 + (DeltaSq * Delta * t * res * (t - res) * BIG_NUMBER) / (tpres * tpres);
651 M3 += 3 * Delta * (t * m2 - res * M2) / tpres;
653 M2 += m2 + (DeltaSq * t * res * BIG_NUMBER) / tpres;
654 M1 += Delta * res / tpres;
657 long double variance = M2 / n;
658 long double skewness = std::sqrt(n) * M3 / std::pow(M2, 1.5);
659 long double exkurtosis = (n * M4) / (M2 * M2) - 3.0;
660 return std::make_tuple(M1, variance, skewness, exkurtosis);
The ProbabilityDistribution class Abstract class for all probability distributions.
Definition distribution.hpp:28
virtual void sample(detail::EngineRef g, std::span< T > outputData) const
Fills the output with variate(g); distributions with a faster bulk algorithm override it.
Definition distribution.hpp:66
The UnivariateDistribution class Abstract class for all univariate probability distributions.
Definition univariate.hpp:28
virtual double LogLikelihoodFunction(std::span< const T > sample) const =0
T Quantile(double p) const
Definition univariate.hpp:307
virtual std::complex< double > CFImpl(double t) const
Definition univariate.hpp:365
static bool allElementsAreNotGreaterThan(T value, std::span< const T > sample)
Definition univariate.hpp:483
virtual long double FourthMoment() const
Definition univariate.hpp:467
bool isLeftBounded() const
Definition univariate.hpp:293
virtual T Median() const
Definition univariate.hpp:396
virtual long double ExpectedValue(const std::function< double(T)> &funPtr, T minPoint, T maxPoint) const =0
T Quantile1m(double p) const
Definition univariate.hpp:324
static long double GetSampleMean(std::span< const T > sample)
Definition univariate.hpp:525
UnivariateDistribution()
Definition univariate.hpp:288
static std::tuple< long double, long double, long double, long double > GetSampleStatistics(std::span< const T > sample)
Definition univariate.hpp:594
virtual long double Skewness() const
Definition univariate.hpp:402
void HazardFunction(std::span< const T > x, std::span< double > y) const
Definition univariate.hpp:388
virtual long double ExcessKurtosis() const
Definition univariate.hpp:421
void QuantileFunction1m(std::span< const double > p, std::span< T > y) const
Definition univariate.hpp:349
virtual long double Kurtosis() const
Definition univariate.hpp:441
virtual ~UnivariateDistribution()
Definition univariate.hpp:33
bool isRightBounded() const
Definition univariate.hpp:300
std::complex< double > CF(double t) const
Definition univariate.hpp:357
static long double GetSampleSum(std::span< const T > sample)
Definition univariate.hpp:519
static LongDoublePair GetSampleMeanAndVariance(std::span< const T > sample)
Definition univariate.hpp:563
virtual double Hazard(const T &x) const =0
static bool allElementsAreNotSmallerThan(T value, std::span< const T > sample)
Definition univariate.hpp:493
virtual long double Mean() const =0
void CharacteristicFunction(std::span< const double > t, std::span< std::complex< double > > y) const
Definition univariate.hpp:379
virtual Support SupportType() const =0
virtual long double Variance() const =0
static long double GetSampleLogVariance(std::span< const T > sample, double logMean)
Definition univariate.hpp:552
virtual long double ThirdMoment() const
Definition univariate.hpp:454
virtual double LikelihoodFunction(std::span< const T > sample) const =0
static long double GetSampleVariance(std::span< const T > sample, double mean)
Definition univariate.hpp:541
static LongDoublePair GetSampleLogMeanAndVariance(std::span< const T > sample)
Definition univariate.hpp:578
virtual long double SecondMoment() const
Definition univariate.hpp:447
static bool allElementsArePositive(std::span< const T > sample)
Definition univariate.hpp:509
static bool allElementsAreNonNegative(std::span< const T > sample)
Definition univariate.hpp:503
static long double GetSampleLogMean(std::span< const T > sample)
Definition univariate.hpp:532
virtual T Mode() const =0
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
void QuantileFunction(std::span< const double > p, std::span< T > y) const
Definition univariate.hpp:341
Definition bivariate_normal.hpp:10
Support
Shape of the support of a univariate distribution.
Definition univariate.hpp:15
Pair< long double > LongDoublePair
Definition fwd.hpp:40