34#include <Random123/philox.h>
74template <RNGSalt salt>
80 using key_type = rng_type::key_type;
111template <RNGSalt salt, std::
size_t N = 3>
112 requires((
N >= 1)
and (
N <= 4))
117 for (std::size_t i = 0; i <
N; ++i) {
142template <RNGSalt salt, std::
size_t N = 3>
143 requires((
N >= 1)
and (
N <= 4))
149 constexpr std::size_t
M = (
N <= 2) ? 2 : 4;
150 constexpr auto epsilon = std::numeric_limits<double>::min();
152 for (std::size_t i = 0; i <
M; ++i) {
154 u[i] = (
res < epsilon) ? epsilon :
res;
163 auto const modulo = std::sqrt(-2. * std::log(
u[0]));
164 auto const angle = 2. * std::numbers::pi *
u[1];
171 auto const modulo = std::sqrt(-2. *
log(
u[2]));
172 auto const angle = 2. * std::numbers::pi *
u[3];
188template <
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.
DEVICE_QUALIFIER auto noise_uniform(uint64_t counter, uint32_t seed, int key1, int key2=0)
Generator for random uniform noise.
DEVICE_QUALIFIER auto noise_gaussian(uint64_t counter, uint32_t seed, int key1, int key2=0)
Generator for Gaussian noise.
DEVICE_QUALIFIER auto philox_4_uint64s(uint64_t counter, uint32_t seed, int key1, int key2=0)
get 4 random uint 64 from the Philox RNG
std::mt19937 mt19937(T &&seed)
Mersenne Twister with warmup.
DEVICE_QUALIFIER constexpr uint64_t u32_to_u64(uint32_t high, uint32_t low)
constexpr DEVICE_QUALIFIER double uniform(uint64_t in)
Uniformly map unsigned integer to double.
@ THERMAL_STONER_WOHLFARTH