RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
degenerate.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <span>
4
5#include <algorithm>
6#include <functional>
7
12
13namespace randlib
14{
15
24class DegenerateRand final : public ContinuousDistribution<double>
25{
26 double variate(detail::EngineRef g) const override { return (*this)(g); }
27
28 double a = 0;
29
30public:
31 explicit DegenerateRand(double value = 0);
32 [[nodiscard]] std::string Name() const override;
33 [[nodiscard]] Support SupportType() const override { return Support::Finite; }
34 [[nodiscard]] double MinValue() const override { return a; }
35 [[nodiscard]] double MaxValue() const override { return a; }
36
37 void SetValue(double value);
38 [[nodiscard]] inline double GetValue() const noexcept { return a; }
39
40 [[nodiscard]] double f(const double &x) const override;
41 [[nodiscard]] double logf(const double &x) const override;
42 [[nodiscard]] double F(const double &x) const override;
43 template <std::uniform_random_bit_generator G>
44 [[nodiscard]] double operator()(G &g) const;
45
46 [[nodiscard]] long double Mean() const override;
47 [[nodiscard]] long double Variance() const override;
48 [[nodiscard]] double Median() const override;
49 [[nodiscard]] double Mode() const override;
50 [[nodiscard]] long double Skewness() const override;
51 [[nodiscard]] long double ExcessKurtosis() const override;
52
53private:
54 double quantileImpl(double p) const override;
55 double quantileImpl1m(double p) const override;
56
57 std::complex<double> CFImpl(double t) const override;
58
59public:
60 [[nodiscard]] long double Entropy() const;
61
65 RANDLIB_DEPRECATED_FIT_MEMBER void Fit(std::span<const double> sample);
66};
67
68} // namespace randlib
69
70namespace randlib
71{
72
74{
75 SetValue(value);
76}
77
78inline std::string DegenerateRand::Name() const
79{
80 return "Degenerate";
81}
82
83inline void DegenerateRand::SetValue(double value)
84{
85 if (!std::isfinite(value))
86 throw std::invalid_argument("Degenerate distribution: value should be finite");
87 a = value;
88}
89
90inline double DegenerateRand::f(const double &x) const
91{
92 return (x == a) ? INFINITY : 0.0;
93}
94
95inline double DegenerateRand::logf(const double &x) const
96{
97 return (x == a) ? INFINITY : -INFINITY;
98}
99
100inline double DegenerateRand::F(const double &x) const
101{
102 return (x < a) ? 0.0 : 1.0;
103}
104
105template <std::uniform_random_bit_generator G>
107{
108 return a;
109}
110
111inline long double DegenerateRand::Mean() const
112{
113 return a;
114}
115
116inline long double DegenerateRand::Variance() const
117{
118 return 0.0;
119}
120
121inline std::complex<double> DegenerateRand::CFImpl(double t) const
122{
123 double re = std::cos(a * t);
124 double im = std::sin(a * t);
125 return std::complex<double>(re, im);
126}
127
128inline double DegenerateRand::quantileImpl(double) const
129{
130 return a;
131}
132
133inline double DegenerateRand::quantileImpl1m(double) const
134{
135 return a;
136}
137
138inline double DegenerateRand::Median() const
139{
140 return a;
141}
142
143inline double DegenerateRand::Mode() const
144{
145 return a;
146}
147
148inline long double DegenerateRand::Skewness() const
149{
150 return NAN;
151}
152
153inline long double DegenerateRand::ExcessKurtosis() const
154{
155 return NAN;
156}
157
158inline long double DegenerateRand::Entropy() const
159{
160 return 0.0;
161}
162
163inline void DegenerateRand::Fit(std::span<const double> sample)
164{
165 if (sample.empty())
166 throw this->fitError(FitErrorCode::TooFewElements, "The sample is empty");
167 if (std::adjacent_find(sample.begin(), sample.end(), std::not_equal_to<>()) != sample.end())
168 throw this->fitError(FitErrorCode::WrongSample, "All elements should be equal to each other");
169 SetValue(sample.front());
170}
171
172} // namespace randlib
The ContinuousDistribution class Abstract class for all continuous distributions.
Definition continuous.hpp:22
The DegenerateRand class Degenerate distribution.
Definition degenerate.hpp:25
double logf(const double &x) const override
Definition degenerate.hpp:95
double GetValue() const noexcept
Definition degenerate.hpp:38
long double ExcessKurtosis() const override
Definition degenerate.hpp:153
void SetValue(double value)
Definition degenerate.hpp:83
double f(const double &x) const override
Definition degenerate.hpp:90
double MinValue() const override
Definition degenerate.hpp:34
DegenerateRand(double value=0)
Definition degenerate.hpp:73
long double Skewness() const override
Definition degenerate.hpp:148
double MaxValue() const override
Definition degenerate.hpp:35
void Fit(std::span< const double > sample)
Definition degenerate.hpp:163
std::string Name() const override
Definition degenerate.hpp:78
long double Mean() const override
Definition degenerate.hpp:111
double operator()(G &g) const
Definition degenerate.hpp:106
double F(const double &x) const override
Definition degenerate.hpp:100
double Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition degenerate.hpp:143
long double Entropy() const
Definition degenerate.hpp:158
double Median() const override
Definition degenerate.hpp:138
Support SupportType() const override
Definition degenerate.hpp:33
long double Variance() const override
Definition degenerate.hpp:116
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
fit_error fitError(FitErrorCode code, const std::string &explanation) const
Definition distribution.hpp:220
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
Definition bivariate_normal.hpp:10
@ WrongSample
the sample could not have been drawn from this distribution
@ TooFewElements
the sample is too small
Support
Shape of the support of a univariate distribution.
Definition univariate.hpp:15