RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
rademacher.hpp
Go to the documentation of this file.
1#pragma once
2
7
8namespace randlib
9{
10
22class RademacherRand final : public DiscreteDistribution<int>
23{
24 int variate(detail::EngineRef g) const override { return (*this)(g); }
25
26public:
28 [[nodiscard]] std::string Name() const override;
29 [[nodiscard]] Support SupportType() const override { return Support::Finite; }
30 [[nodiscard]] int MinValue() const override { return -1; }
31 [[nodiscard]] int MaxValue() const override { return 1; }
32
33 [[nodiscard]] double P(const int &k) const override;
34 [[nodiscard]] double logP(const int &k) const override;
35 [[nodiscard]] double F(const int &k) const override;
36 template <std::uniform_random_bit_generator G>
37 [[nodiscard]] int operator()(G &g) const;
38
39 [[nodiscard]] long double Mean() const override;
40 [[nodiscard]] long double Variance() const override;
41 [[nodiscard]] int Median() const override;
42 [[nodiscard]] int Mode() const override;
43 [[nodiscard]] long double Skewness() const override;
44 [[nodiscard]] long double ExcessKurtosis() const override;
45
46private:
47 int quantileImpl(double p) const override;
48 int quantileImpl1m(double p) const override;
49 std::complex<double> CFImpl(double t) const override;
50
51public:
52 [[nodiscard]] double Entropy();
53};
54
55} // namespace randlib
56
58
59namespace randlib
60{
61
65
66inline std::string RademacherRand::Name() const
67{
68 return "Rademacher";
69}
70
71inline double RademacherRand::P(const int &k) const
72{
73 return (k == 1 || k == -1) ? 0.5 : 0.0;
74}
75
76inline double RademacherRand::logP(const int &k) const
77{
78 return (k == 1 || k == -1) ? -randlib::consts::ln2 : -INFINITY;
79}
80
81inline double RademacherRand::F(const int &k) const
82{
83 if (k < -1)
84 return 0;
85 return (k < 1) ? 0.5 : 1.0;
86}
87
88template <std::uniform_random_bit_generator G>
90{
91 return BernoulliRand::StandardVariate(g) ? 1 : -1;
92}
93
94inline long double RademacherRand::Mean() const
95{
96 return 0;
97}
98
99inline long double RademacherRand::Variance() const
100{
101 return 1;
102}
103
104inline std::complex<double> RademacherRand::CFImpl(double t) const
105{
106 return std::cos(t);
107}
108
109inline int RademacherRand::Median() const
110{
111 return -1;
112}
113
114inline int RademacherRand::Mode() const
115{
117 return -1;
118}
119
120inline long double RademacherRand::Skewness() const
121{
122 return 0.0;
123}
124
125inline long double RademacherRand::ExcessKurtosis() const
126{
127 return -2.0;
128}
129
130inline int RademacherRand::quantileImpl(double p) const
131{
132 return (p <= 0.5) ? -1 : 1;
133}
134
135inline int RademacherRand::quantileImpl1m(double p) const
136{
137 return (p >= 0.5) ? -1 : 1;
138}
139
141{
143}
144
145} // namespace randlib
static int StandardVariate(G &g)
Definition bernoulli.hpp:106
The DiscreteDistribution class Abstract class for all discrete distributions.
Definition discrete.hpp:21
The RademacherRand class Rademacher distribution.
Definition rademacher.hpp:23
int MaxValue() const override
Definition rademacher.hpp:31
double F(const int &k) const override
Definition rademacher.hpp:81
double Entropy()
Definition rademacher.hpp:140
RademacherRand()
Definition rademacher.hpp:62
int MinValue() const override
Definition rademacher.hpp:30
double P(const int &k) const override
Definition rademacher.hpp:71
long double Mean() const override
Definition rademacher.hpp:94
std::string Name() const override
Definition rademacher.hpp:66
long double Variance() const override
Definition rademacher.hpp:99
Support SupportType() const override
Definition rademacher.hpp:29
long double ExcessKurtosis() const override
Definition rademacher.hpp:125
long double Skewness() const override
Definition rademacher.hpp:120
int operator()(G &g) const
Definition rademacher.hpp:89
double logP(const int &k) const override
Definition rademacher.hpp:76
int Mode() const override
Mode is the value, which has the largest probability to happen, or, in the case of continuous distrib...
Definition rademacher.hpp:114
int Median() const override
Definition rademacher.hpp:109
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
Definition bivariate_normal.hpp:10
Support
Shape of the support of a univariate distribution.
Definition univariate.hpp:15