RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
bernoulli.hpp
Go to the documentation of this file.
1#pragma once
2
7
8namespace randlib
9{
10
24class BernoulliRand final : public BinomialDistribution<int>
25{
26 int variate(detail::EngineRef g) const override { return (*this)(g); }
27 void sample(detail::EngineRef g, std::span<int> outputData) const override;
28
29public:
30 explicit BernoulliRand(double probability = 0.5);
31 [[nodiscard]] std::string Name() const override;
32
33 void SetProbability(double probability);
34
35 [[nodiscard]] double P(const int &k) const override;
36 [[nodiscard]] double logP(const int &k) const override;
37 [[nodiscard]] double F(const int &k) const override;
38 [[nodiscard]] double S(const int &k) const override;
39 template <std::uniform_random_bit_generator G>
40 [[nodiscard]] int operator()(G &g) const;
41
42 template <std::uniform_random_bit_generator G>
43 [[nodiscard]] static int Variate(double probability, G &g);
44 template <std::uniform_random_bit_generator G>
45 [[nodiscard]] static int StandardVariate(G &g);
46
47 [[nodiscard]] inline double Entropy();
48};
49
50} // namespace randlib
51
52namespace randlib
53{
54
55inline BernoulliRand::BernoulliRand(double probability) : BinomialDistribution(1, probability)
56{
57}
58
59inline std::string BernoulliRand::Name() const
60{
61 return "Bernoulli(" + this->toStringWithPrecision(GetProbability()) + ")";
62}
63
64inline void BernoulliRand::SetProbability(double probability)
65{
66 if (!(probability >= 0.0 && probability <= 1.0))
67 throw std::invalid_argument("Bernoulli distribution: probability parameter should in interval [0, 1]");
68 SetParameters(1, probability);
69}
70
71inline double BernoulliRand::P(const int &k) const
72{
73 return (k == 0) ? q : ((k == 1) ? p : 0);
74}
75
76inline double BernoulliRand::logP(const int &k) const
77{
78 return (k == 0) ? log1mProb : ((k == 1) ? logProb : -INFINITY);
79}
80
81inline double BernoulliRand::F(const int &k) const
82{
83 return (k < 0) ? 0.0 : ((k < 1) ? q : 1);
84}
85
86inline double BernoulliRand::S(const int &k) const
87{
88 return (k < 0) ? 1.0 : ((k < 1) ? p : 0.0);
89}
90
91template <std::uniform_random_bit_generator G>
93{
94 return detail::uniform01<double>(g) < p;
95}
96
97template <std::uniform_random_bit_generator G>
98int BernoulliRand::Variate(double probability, G &g)
99{
100 if (!(probability >= 0.0 && probability <= 1.0))
101 throw std::invalid_argument("Bernoulli distribution: probability parameter should be in interval [0, 1]");
102 return detail::uniform01<double>(g) < probability;
103}
104
105template <std::uniform_random_bit_generator G>
107{
108 return static_cast<int>(detail::randomBits(g, 1));
109}
110
111inline void BernoulliRand::sample(detail::EngineRef g, std::span<int> outputData) const
112{
113 if (p == 0.5) {
114 for (int &var : outputData)
115 var = StandardVariate(g);
116 } else {
117 for (int &var : outputData)
118 var = (*this)(g);
119 }
120}
121
123{
124 if (p == 0.0 || q == 0.0)
125 return 0.0;
126 return -(p * logProb + q * log1mProb);
127}
128
129} // namespace randlib
The BernoulliRand class Bernoulli distribution.
Definition bernoulli.hpp:25
double S(const int &k) const override
Definition bernoulli.hpp:86
void SetProbability(double probability)
Definition bernoulli.hpp:64
std::string Name() const override
Definition bernoulli.hpp:59
double Entropy()
Definition bernoulli.hpp:122
int operator()(G &g) const
Definition bernoulli.hpp:92
double logP(const int &k) const override
Definition bernoulli.hpp:76
static int StandardVariate(G &g)
Definition bernoulli.hpp:106
double F(const int &k) const override
Definition bernoulli.hpp:81
double P(const int &k) const override
Definition bernoulli.hpp:71
BernoulliRand(double probability=0.5)
Definition bernoulli.hpp:55
The BinomialDistribution class Abstract class for Binomial distribution.
Definition binomial.hpp:29
double logProb
log(p)
Definition binomial.hpp:36
void SetParameters(int number, double probability)
Definition binomial.hpp:290
double q
probability of failure
Definition binomial.hpp:35
double GetProbability() const noexcept
Definition binomial.hpp:76
double log1mProb
log(q)
Definition binomial.hpp:37
double p
probability of success
Definition binomial.hpp:34
T Variate() const
Uses the engine of this object, so it is not thread-safe for one object; use operator() with one engi...
Definition distribution.hpp:133
std::string toStringWithPrecision(const double a_value, const int n=6) const
Definition distribution.hpp:181
The EngineRef class Non-owning, type-erased reference to any uniform random bit generator.
Definition engine/uniform.hpp:116
std::uint64_t randomBits(G &g, int count)
Definition engine/uniform.hpp:33
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45
Definition bivariate_normal.hpp:10