cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
canonical.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_RANDOM_CANONICAL_H
4#define pRC_CORE_RANDOM_CANONICAL_H
5
11
12namespace pRC
13{
14 template<IsFloat T, IsRandomEngine RNG>
15 requires(RNG::max() - RNG::min() < NumericLimits<Size>::max())
16 static inline constexpr auto generateCanonical(RNG &rng)
17 {
18 constexpr auto b = NumericLimits<T>::digits();
19
20 constexpr Size R = RNG::max() - RNG::min() + Size(1);
21
22 constexpr Size logR = iLog<2>(R);
23 constexpr Size k = max(ceilDiv(b, logR), Size(1));
24
25 T base = R;
26 T basic = rng() - RNG::min();
27
28 for(Index i = 1; i < k; ++i, base *= T(R))
29 {
30 basic += T(rng() - RNG::min()) * base;
31 }
32 basic /= base;
33
34 if(basic >= T(1))
35 {
36 return T(T(1) - NumericLimits<T>::epsilon() / T(2));
37 }
38 return basic;
39 }
40}
41#endif // pRC_CORE_RANDOM_CANONICAL_H
Definition value.hpp:12
pRC::Float<> T
Definition externs_nonTT.hpp:1
int i
Definition gmock-matchers-comparisons_test.cc:603
Definition cholesky.hpp:10
static constexpr auto ceilDiv(TA const a, TB const b)
Definition ceil_div.hpp:13
static constexpr T iLog(T const a)
Definition ilog.hpp:11
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
static constexpr auto generateCanonical(RNG &rng)
Definition canonical.hpp:16
static constexpr decltype(auto) max(X &&a)
Definition max.hpp:13
Definition limits.hpp:13