33#include <Random123/philox.h>
74template <RNGSalt salt>
79 using key_type = rng_type::key_type;
111 std::enable_if_t<(
N > 1)
and (
N <= 4),
int> = 0>
116 std::ranges::transform(
integers | std::ranges::views::take(
N),
noise.begin(),
117 [](std::size_t v) { return Utils::uniform(v) - 0.5; });
121template <RNGSalt salt, std::
size_t N, std::enable_if_t<N == 1,
int> = 0>
149 class = std::enable_if_t<(
N >= 1)
and (
N <= 4)>>
153 static const double epsilon = std::numeric_limits<double>::min();
155 constexpr std::size_t
M = (
N <= 2) ? 2 : 4;
157 std::ranges::transform(
integers | std::ranges::views::take(
M),
u.begin(),
158 [](std::size_t value) {
159 auto u = Utils::uniform(value);
160 return (u < epsilon) ? epsilon : u;
169 auto const modulo = sqrt(-2. *
log(
u[0]));
170 auto const angle = 2. * std::numbers::pi *
u[1];
177 auto const modulo = sqrt(-2. *
log(
u[2]));
178 auto const angle = 2. * std::numbers::pi *
u[3];
194template <
typename T> std::mt19937
mt19937(T &&seed) {
194template <
typename T> std::mt19937
mt19937(T &&seed) {
…}
Vector implementation and trait types for boost qvm interoperability.
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
auto philox_4_uint64s(uint64_t counter, uint32_t seed, int key1, int key2=0)
get 4 random uint 64 from the Philox RNG
auto noise_uniform(uint64_t counter, uint32_t seed, int key1, int key2=0)
Generator for random uniform noise.
auto noise_gaussian(uint64_t counter, uint32_t seed, int key1, int key2=0)
Generator for Gaussian noise.
std::mt19937 mt19937(T &&seed)
Mersenne Twister with warmup.
constexpr double uniform(uint64_t in)
Uniformly map unsigned integer to double.
constexpr uint64_t u32_to_u64(uint32_t high, uint32_t low)