cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
gaussian.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_RANDOM_DISTRIBUTIONS_GAUSSIAN_H
4#define pRC_CORE_RANDOM_DISTRIBUTIONS_GAUSSIAN_H
5
8
9namespace pRC
10{
11 template<IsFloat T>
13 : public RandomDistribution<GaussianDistribution<T>>
14 {
15 public:
16 constexpr explicit GaussianDistribution(T const mean = zero(),
17 T const stdDev = identity())
18 : mMean(mean)
19 , mStdDev(stdDev)
20 {
21 if(!(mStdDev > zero()))
22 {
24 "Parameter standard deviation of Gaussian distribution "
25 "must be positive.");
26 }
27 }
28
29 constexpr auto reset()
30 {
31 mHot = false;
32 }
33
34 constexpr auto &mean() const
35 {
36 return mMean;
37 }
38
39 constexpr auto &stdDev() const
40 {
41 return mStdDev;
42 }
43
44 constexpr auto min() const
45 {
47 }
48
49 constexpr auto max() const
50 {
51 return NumericLimits<T>::max();
52 }
53
54 template<class URNG>
55 constexpr auto operator()(URNG &rng)
56 {
57 auto basic = [&]() -> T
58 {
59 if(mHot)
60 {
61 mHot = false;
62 return mNextValue;
63 }
64 else
65 {
66 T u, v, s;
67 UniformDistribution<T> uniform(T(-1), T(1));
68
69 do
70 {
71 u = uniform(rng);
72 v = uniform(rng);
73 s = u * u + v * v;
74 }
75 while(s > T(1) || s == zero());
76
77 auto m = sqrt(T(-2) * log(s) / s);
78
79 mNextValue = v * m;
80 mHot = true;
81
82 return u * m;
83 }
84 }();
85 return basic * stdDev() + mean();
86 }
87
88 private:
89 T mMean;
90 T mStdDev;
91 T mNextValue = zero();
92 Bool mHot = false;
93 };
94
95 template<class T>
96 constexpr auto operator==(GaussianDistribution<T> const &lhs,
97 GaussianDistribution<T> const &rhs)
98 {
99 if(lhs.mean() == rhs.mean() && lhs.stdDev() == rhs.stdDev())
100 {
101 if(lhs.mHot == rhs.mHot)
102 {
103 if(!lhs.mHot || lhs.mNextValue == rhs.mNextValue)
104 {
105 return true;
106 }
107 }
108 }
109
110 return false;
111 }
112
113 template<class T>
114 constexpr auto operator!=(GaussianDistribution<T> const &lhs,
115 GaussianDistribution<T> const &rhs)
116 {
117 return !(lhs == rhs);
118 }
119}
120#endif // pRC_CORE_RANDOM_DISTRIBUTIONS_GAUSSIAN_H
Definition value.hpp:12
Definition gaussian.hpp:14
constexpr auto reset()
Definition gaussian.hpp:29
constexpr auto operator()(URNG &rng)
Definition gaussian.hpp:55
constexpr GaussianDistribution(T const mean=zero(), T const stdDev=identity())
Definition gaussian.hpp:16
constexpr auto min() const
Definition gaussian.hpp:44
constexpr auto & stdDev() const
Definition gaussian.hpp:39
constexpr auto & mean() const
Definition gaussian.hpp:34
constexpr auto max() const
Definition gaussian.hpp:49
Definition distribution.hpp:12
Definition uniform.hpp:18
pRC::Float<> T
Definition externs_nonTT.hpp:1
static void error(Xs &&...args)
Definition log.hpp:14
Definition cholesky.hpp:10
static constexpr auto sqrt(T const &a)
Definition sqrt.hpp:11
static constexpr auto operator!=(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:291
static constexpr auto operator==(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:284
static constexpr auto identity()
Definition identity.hpp:13
static constexpr auto zero()
Definition zero.hpp:12
static constexpr auto log(T const &a)
Definition log.hpp:11
Definition gtest_pred_impl_unittest.cc:54
Definition limits.hpp:13