32 #ifndef MCKL_RANDOM_NORMAL_DISTRIBUTION_HPP 33 #define MCKL_RANDOM_NORMAL_DISTRIBUTION_HPP 44 template <
typename RealType>
50 template <std::
size_t K,
typename RealType,
typename RNGType>
52 RNGType &rng, std::size_t n, RealType *r, RealType mean, RealType stddev)
55 const std::size_t nu = n / 2;
56 RealType *
const u1 = r;
57 RealType *
const u2 = r + nu;
59 log(nu, u1, s.data());
60 mul(nu, static_cast<RealType>(-2), s.data(), s.data());
61 sqrt(nu, s.data(), s.data());
62 mul(nu, const_pi_2<RealType>(), u2, u2);
67 mul(nu, stddev, s.data(), s.data());
70 muladd(nu, s.data(), u1, mean, u1);
71 muladd(nu, s.data(), u2, mean, u2);
73 mul(nu, s.data(), u1, u1);
74 mul(nu, s.data(), u2, u2);
82 template <
typename RealType,
typename RNGType>
84 RNGType &rng, std::size_t n, RealType *r, RealType mean, RealType stddev)
87 const std::size_t m = n / k;
88 const std::size_t l = n % k;
89 for (std::size_t i = 0; i != m; ++i, r += k) {
90 internal::normal_distribution_impl<k>(rng, k, r, mean, stddev);
92 internal::normal_distribution_impl<k>(rng, l, r, mean, stddev);
95 RealType u =
u01(rng);
96 RealType v =
u01(rng);
99 std::cos(const_pi_2<RealType>() * v);
103 template <
typename RealType,
typename RNGType>
113 template <
typename RealType>
122 result_type min()
const 124 return std::numeric_limits<result_type>::lowest();
136 template <
typename RNGType>
161 #endif // MCKL_RANDOM_NORMAL_DISTRIBUTION_HPP #define MCKL_DEFINE_RANDOM_DISTRIBUTION_2( Name, name, T, T1, p1, v1, T2, p2, v2)
void mul(std::size_t n, const float *a, const float *b, float *y)
void normal_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, float mean, float stddev)
#define MCKL_PUSH_CLANG_WARNING(warning)
result_type stddev() const
void u01_oc_distribution(RNGType &rng, std::size_t n, RealType *r)
void sin(std::size_t n, const float *a, float *y)
void log(std::size_t n, const float *a, float *y)
void normal_distribution_impl(RNGType &rng, std::size_t n, RealType *r, RealType mean, RealType stddev)
Standard uniform distribution on (0, 1].
#define MCKL_DEFINE_RANDOM_DISTRIBUTION_RAND(Name, T)
void sincos(std::size_t n, const float *a, float *y, float *z)
RealType u01(UIntType u)
Convert uniform unsigned integers to floating points within [0, 1].
#define MCKL_PUSH_INTEL_WARNING(wid)
void sqrt(std::size_t n, const float *a, float *y)
void cos(std::size_t n, const float *a, float *y)
#define MCKL_POP_CLANG_WARNING
#define MCKL_ALIGNMENT
The default alignment for scalar type.
#define MCKL_DEFINE_RANDOM_DISTRIBUTION_ASSERT_REAL_TYPE(Name)
bool normal_distribution_check_param(RealType, RealType stddev)
#define MCKL_POP_INTEL_WARNING
#define MCKL_DEFINE_RANDOM_DISTRIBUTION_MEMBER_2(T1, m1, T2, m2)