tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
bernoulli_distribution.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_RANDOM_BERNOULLI_DISTRIBUTION_HPP
5#define TETL_RANDOM_BERNOULLI_DISTRIBUTION_HPP
6
7#include <etl/_limits/numeric_limits.hpp>
8#include <etl/_random/generate_canonical.hpp>
9#include <etl/_tuple/tuple.hpp>
10
11namespace etl {
12
13/// \ingroup random
15 using result_type = bool;
16
17 struct param_type {
18 using distribution_type = bernoulli_distribution;
19
20 constexpr param_type() noexcept
21 : param_type{0.5}
22 {
23 }
24
25 explicit constexpr param_type(double p) noexcept
26 : probability{p}
27 {
28 }
29
30 [[nodiscard]] constexpr auto p() const noexcept -> double
31 {
32 return probability;
33 }
34
35 [[nodiscard]] friend constexpr auto operator==(param_type const& lhs, param_type const& rhs) noexcept -> bool
36 {
37 return lhs.probability == rhs.probability;
38 }
39
41 };
42
43 constexpr bernoulli_distribution() noexcept
45 {
46 }
47
48 explicit constexpr bernoulli_distribution(double p) noexcept
50 {
51 }
52
53 explicit constexpr bernoulli_distribution(param_type const& parm) noexcept
54 : _param{parm}
55 {
56 }
57
58 [[nodiscard]] constexpr auto p() const noexcept -> double
59 {
60 return _param.p();
61 }
62
63 constexpr auto param(param_type const& parm) noexcept -> void
64 {
65 _param = parm;
66 }
67
68 [[nodiscard]] constexpr auto param() const noexcept -> param_type
69 {
70 return _param;
71 }
72
73 [[nodiscard]] constexpr auto min() const noexcept -> result_type
74 {
75 (void)this;
76 return false;
77 }
78
79 [[nodiscard]] constexpr auto max() const noexcept -> result_type
80 {
81 (void)this;
82 return true;
83 }
84
85 constexpr auto reset() noexcept -> void
86 {
87 (void)this;
88 }
89
90 template <typename URBG>
91 [[nodiscard]] constexpr auto operator()(URBG& g) noexcept(noexcept(g())) -> result_type
92 {
93 return (*this)(g, _param);
94 }
95
96 template <typename URBG>
97 [[nodiscard]] constexpr auto operator()(URBG& g, param_type const& parm) noexcept(noexcept(g())) -> result_type
98 {
99 constexpr auto digits = static_cast<size_t>(numeric_limits<double>::digits);
100 constexpr auto bits = ~size_t{0};
101 constexpr auto minBits = digits < bits ? digits : bits;
102 static_assert(minBits <= 64);
103
104 return generate_canonical<double, minBits>(g) < parm.p();
105 }
106
107 [[nodiscard]] friend constexpr auto
108 operator==(bernoulli_distribution const& x, bernoulli_distribution const& y) noexcept -> bool
109 {
110 return x.param() == y.param();
111 }
112
113private:
114 param_type _param;
115};
116
117} // namespace etl
118
119#endif // TETL_RANDOM_BERNOULLI_DISTRIBUTION_HPP
Definition adjacent_find.hpp:9
Definition bernoulli_distribution.hpp:17
constexpr param_type() noexcept
Definition bernoulli_distribution.hpp:20
double probability
Definition bernoulli_distribution.hpp:40
constexpr auto p() const noexcept -> double
Definition bernoulli_distribution.hpp:30
constexpr param_type(double p) noexcept
Definition bernoulli_distribution.hpp:25
friend constexpr auto operator==(param_type const &lhs, param_type const &rhs) noexcept -> bool
Definition bernoulli_distribution.hpp:35
Definition bernoulli_distribution.hpp:14
constexpr bernoulli_distribution(param_type const &parm) noexcept
Definition bernoulli_distribution.hpp:53
constexpr auto operator()(URBG &g) noexcept(noexcept(g())) -> result_type
Definition bernoulli_distribution.hpp:91
friend constexpr auto operator==(bernoulli_distribution const &x, bernoulli_distribution const &y) noexcept -> bool
Definition bernoulli_distribution.hpp:108
constexpr auto param(param_type const &parm) noexcept -> void
Definition bernoulli_distribution.hpp:63
constexpr auto reset() noexcept -> void
Definition bernoulli_distribution.hpp:85
constexpr auto p() const noexcept -> double
Definition bernoulli_distribution.hpp:58
constexpr auto param() const noexcept -> param_type
Definition bernoulli_distribution.hpp:68
constexpr bernoulli_distribution(double p) noexcept
Definition bernoulli_distribution.hpp:48
constexpr auto max() const noexcept -> result_type
Definition bernoulli_distribution.hpp:79
constexpr auto min() const noexcept -> result_type
Definition bernoulli_distribution.hpp:73
constexpr auto operator()(URBG &g, param_type const &parm) noexcept(noexcept(g())) -> result_type
Definition bernoulli_distribution.hpp:97
constexpr bernoulli_distribution() noexcept
Definition bernoulli_distribution.hpp:43
static constexpr int digits
Definition numeric_limits.hpp:1111
Definition numeric_limits.hpp:18