cMHN 1.1
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
12
13namespace pRC
14{
15 template<class T, class RNG, If<IsRandomEngine<RNG>> = 0,
16 If<IsFloat<T>> = 0>
17 static inline constexpr T generateCanonical(RNG &rng)
18 {
19 constexpr auto b = NumericLimits<T>::digits();
20
21 static_assert(RNG::max() - RNG::min() < NumericLimits<Size>::max(),
22 "Unsigned integer overflow.");
23
24 constexpr Size R = RNG::max() - RNG::min() + Size(1);
25
26 constexpr Size logR = iLog<2>(R);
27 constexpr Size k = max(ceilDiv(b, logR), Size(1));
28
29 T base = R;
30 T basic = rng() - RNG::min();
31
32 for(Index i = 1; i < k; ++i, base *= T(R))
33 {
34 basic += T(rng() - RNG::min()) * base;
35 }
36 basic /= base;
37
38 if(basic >= T(1))
39 {
40 return T(T(1) - NumericLimits<T>::epsilon() / T(2));
41 }
42 return basic;
43 }
44}
45#endif // pRC_CORE_RANDOM_CANONICAL_H
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition cholesky.hpp:18
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
static constexpr T generateCanonical(RNG &rng)
Definition canonical.hpp:17
Size Index
Definition type_traits.hpp:21
std::size_t Size
Definition type_traits.hpp:20
static constexpr auto ceilDiv(TA const a, TB const b)
Definition ceil_div.hpp:15
static constexpr X max(X &&a)
Definition max.hpp:13
Definition limits.hpp:13