poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/random.cpp
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/random.cppRaw
1#include <cstdint>
2#include <random>
3
4#include "test_commons.h"
5
6bool is_pow2(uint64_t n) { return !(n & (n - 1)); }
7
8test_rng& randgen() {
9 static test_rng gen;
10 return gen;
11}
12uint64_t uniform_u64() {
13 static std::uniform_int_distribution<uint64_t> dist64(0, UINT64_MAX);
14 return dist64(randgen());
15}
16
17uint64_t uniform_u64_bits(uint64_t nbits) {
18 if (nbits >= 64) return uniform_u64();
19 return uniform_u64() >> (64 - nbits);
20}
21
22int64_t uniform_i64() {
23 std::uniform_int_distribution<int64_t> dist;
24 return dist(randgen());
25}
26
27int64_t uniform_i64_bits(uint64_t nbits) {
28 int64_t bound = int64_t(1) << nbits;
29 std::uniform_int_distribution<int64_t> dist(-bound, bound);
30 return dist(randgen());
31}
32
33int64_t uniform_i64_bounds(const int64_t lb, const int64_t ub) {
34 std::uniform_int_distribution<int64_t> dist(lb, ub);
35 return dist(randgen());
36}
37
38__int128_t uniform_i128_bounds(const __int128_t lb, const __int128_t ub) {
39 std::uniform_int_distribution<__int128_t> dist(lb, ub);
40 return dist(randgen());
41}
42
43double random_f64_gaussian(double stdev) {
44 std::normal_distribution<double> dist(0, stdev);
45 return dist(randgen());
46}
47
48double uniform_f64_bounds(const double lb, const double ub) {
49 std::uniform_real_distribution<double> dist(lb, ub);
50 return dist(randgen());
51}
52
53double uniform_f64_01() { return uniform_f64_bounds(0, 1); }