32 #ifndef MCKL_RANDOM_MKL_HPP 33 #define MCKL_RANDOM_MKL_HPP 43 #if MCKL_NO_RUNTIME_ASSERT 50 #else // MCKL_NO_RUNTIME_ASSERT 54 if (status == VSL_ERROR_OK)
62 msg +=
"; MKL function: ";
64 msg +=
"; Error code: ";
65 msg += std::to_string(status);
72 #endif // MCKL_NO_RUNTIME_ASSERT 81 explicit MKLStream(::VSLStreamStatePtr ptr =
nullptr) : ptr_(nullptr)
87 MKLStream(MKL_INT brng, MKL_UINT seed) : ptr_(nullptr)
93 MKLStream(MKL_INT brng, MKL_INT n,
unsigned *params) : ptr_(nullptr)
95 reset(brng, n, params);
101 ::VSLStreamStatePtr ptr =
nullptr;
103 "MKLStream::MKLStream",
"::vslCopyStream") == VSL_ERROR_OK) {
111 if (
this != &other) {
112 ::VSLStreamStatePtr ptr =
nullptr;
114 "MKLStream::operator=",
"::vslCopyStream") ==
127 if (
this != &other) {
130 other.ptr_ =
nullptr;
141 int status = release();
148 int reset(MKL_INT brng, MKL_UINT seed)
150 ::VSLStreamStatePtr ptr =
nullptr;
153 "MKLStream::reset",
"::vslNewStream");
154 if (status == VSL_ERROR_OK) {
162 int reset(MKL_INT brng, MKL_INT n,
unsigned *params)
164 ::VSLStreamStatePtr ptr =
nullptr;
167 "MKLStream::reset",
"::vslNewStreamEx");
168 if (status == VSL_ERROR_OK) {
178 if (ptr_ ==
nullptr) {
183 "MKLStream::release",
"::vslDeleteStream");
189 bool empty()
const {
return ptr_ ==
nullptr; }
192 int save_f(
const std::string &fname)
const 195 "MKLStream::save_f",
"::vslSaveStreamF");
201 ::VSLStreamStatePtr ptr =
nullptr;
204 "MKLStream::load_f",
"::vslSaveStreamF");
205 if (status == VSL_ERROR_OK) {
216 "MKLStream::save_m",
"::vslSaveStreamM");
222 ::VSLStreamStatePtr ptr =
nullptr;
224 "MKLStream::load_m",
"::vslLoadStreamM");
225 if (status == VSL_ERROR_OK) {
233 int get_size()
const { return ::vslGetStreamSize(ptr_); }
239 ::vslLeapfrogStream(ptr_, k, nstreams),
"MKLStream::leapfrog",
240 "::vslLeapfrogStream");
247 "MKLStream::skip_ahead",
"::vslSkipAheadStream");
251 int get_brng()
const { return ::vslGetStreamStateBrng(ptr_); }
258 MKL_INT brng, ::VSLBRngProperties *properties)
261 ::vslGetBrngProperties(brng, properties),
262 "MKLStream::get_brng_properties",
"::vslGetBrngProperties");
270 return ::vslLeapfrogStream(stream.ptr_, 1, 2) == VSL_ERROR_OK;
278 return ::vslSkipAheadStream(stream.ptr_, 1) == VSL_ERROR_OK;
283 MKL_INT brng, MKL_INT method = VSL_RNG_METHOD_UNIFORMBITS32_STD)
288 return ::viRngUniformBits32(method, stream.ptr_, 1, &r) ==
294 MKL_INT brng, MKL_INT method = VSL_RNG_METHOD_UNIFORMBITS64_STD)
297 unsigned MKL_INT64 r;
299 return ::viRngUniformBits64(method, stream.ptr_, 1, &r) ==
304 int uniform(MKL_INT n,
float *r,
float a,
float b,
305 MKL_INT method = VSL_RNG_METHOD_UNIFORM_STD)
308 ::vsRngUniform(method, ptr_, n, r, a, b),
"MKLStream::uniform",
313 int uniform(MKL_INT n,
double *r,
double a,
double b,
314 MKL_INT method = VSL_RNG_METHOD_UNIFORM_STD)
317 ::vdRngUniform(method, ptr_, n, r, a, b),
"MKLStream::uniform",
322 int gaussian(MKL_INT n,
float *r,
float a,
float sigma,
323 MKL_INT method = VSL_RNG_METHOD_GAUSSIAN_BOXMULLER2)
326 ::vsRngGaussian(method, ptr_, n, r, a, sigma),
327 "MKLStream::gaussian",
"::vsRngGaussian");
331 int gaussian(MKL_INT n,
double *r,
double a,
double sigma,
332 MKL_INT method = VSL_RNG_METHOD_GAUSSIAN_BOXMULLER2)
335 ::vdRngGaussian(method, ptr_, n, r, a, sigma),
336 "MKLStream::gaussian",
"::vdRngGaussian");
340 int gaussian_mv(MKL_INT n,
float *r, MKL_INT dimen, MKL_INT mstorage,
341 const float *a,
const float *t,
342 MKL_INT method = VSL_RNG_METHOD_GAUSSIANMV_BOXMULLER2)
345 ::vsRngGaussianMV(method, ptr_, n, r, dimen, mstorage, a, t),
346 "MKLStream::gaussian_mv",
"::vsRngGaussianMV");
350 int gaussian_mv(MKL_INT n,
double *r, MKL_INT dimen, MKL_INT mstorage,
351 const double *a,
const double *t,
352 MKL_INT method = VSL_RNG_METHOD_GAUSSIANMV_BOXMULLER2)
355 ::vdRngGaussianMV(method, ptr_, n, r, dimen, mstorage, a, t),
356 "MKLStream::gaussian_mv",
"::vdRngGaussianMV");
361 MKL_INT method = VSL_RNG_METHOD_EXPONENTIAL_ICDF)
364 ::vsRngExponential(method, ptr_, n, r, a, beta),
365 "MKLStream::exponential",
"::vsRngExponential");
370 MKL_INT method = VSL_RNG_METHOD_EXPONENTIAL_ICDF)
373 ::vdRngExponential(method, ptr_, n, r, a, beta),
374 "MKLStream::exponential",
"::vdRngExponential");
378 int laplace(MKL_INT n,
float *r,
float a,
float beta,
379 MKL_INT method = VSL_RNG_METHOD_LAPLACE_ICDF)
382 ::vsRngLaplace(method, ptr_, n, r, a, beta),
"MKLStream::laplace",
387 int laplace(MKL_INT n,
double *r,
double a,
double beta,
388 MKL_INT method = VSL_RNG_METHOD_LAPLACE_ICDF)
391 ::vdRngLaplace(method, ptr_, n, r, a, beta),
"MKLStream::laplace",
396 int weibull(MKL_INT n,
float *r,
float alpha,
float a,
float beta,
397 MKL_INT method = VSL_RNG_METHOD_WEIBULL_ICDF)
400 ::vsRngWeibull(method, ptr_, n, r, alpha, a, beta),
401 "MKLStream::weibull",
"::vsRngWeibull");
405 int weibull(MKL_INT n,
double *r,
double alpha,
double a,
double beta,
406 MKL_INT method = VSL_RNG_METHOD_WEIBULL_ICDF)
409 ::vdRngWeibull(method, ptr_, n, r, alpha, a, beta),
410 "MKLStream::weibull",
"::vdRngWeibull");
414 int cauchy(MKL_INT n,
float *r,
float a,
float beta,
415 MKL_INT method = VSL_RNG_METHOD_CAUCHY_ICDF)
418 ::vsRngCauchy(method, ptr_, n, r, a, beta),
"MKLStream::cauchy",
423 int cauchy(MKL_INT n,
double *r,
double a,
double beta,
424 MKL_INT method = VSL_RNG_METHOD_CAUCHY_ICDF)
427 ::vdRngCauchy(method, ptr_, n, r, a, beta),
"MKLStream::cauchy",
432 int rayleigh(MKL_INT n,
float *r,
float a,
float beta,
433 MKL_INT method = VSL_RNG_METHOD_RAYLEIGH_ICDF)
436 ::vsRngRayleigh(method, ptr_, n, r, a, beta),
437 "MKLStream::rayleigh",
"::vsRngRayleigh");
441 int rayleigh(MKL_INT n,
double *r,
double a,
double beta,
442 MKL_INT method = VSL_RNG_METHOD_RAYLEIGH_ICDF)
445 ::vdRngRayleigh(method, ptr_, n, r, a, beta),
446 "MKLStream::rayleigh",
"::vdRngRayleigh");
450 int lognormal(MKL_INT n,
float *r,
float a,
float sigma,
float b,
451 float beta, MKL_INT method = VSL_RNG_METHOD_LOGNORMAL_BOXMULLER2)
454 ::vsRngLognormal(method, ptr_, n, r, a, sigma, b, beta),
455 "MKLStream::lognormal",
"::vsRngLognormal");
459 int lognormal(MKL_INT n,
double *r,
double a,
double sigma,
double b,
460 double beta, MKL_INT method = VSL_RNG_METHOD_LOGNORMAL_BOXMULLER2)
463 ::vdRngLognormal(method, ptr_, n, r, a, sigma, b, beta),
464 "MKLStream::lognormal",
"::vdRngLognormal");
468 int gumbel(MKL_INT n,
float *r,
float a,
float beta,
469 MKL_INT method = VSL_RNG_METHOD_GUMBEL_ICDF)
472 ::vsRngGumbel(method, ptr_, n, r, a, beta),
"MKLStream::gumbel",
477 int gumbel(MKL_INT n,
double *r,
double a,
double beta,
478 MKL_INT method = VSL_RNG_METHOD_GUMBEL_ICDF)
481 ::vdRngGumbel(method, ptr_, n, r, a, beta),
"MKLStream::gumbel",
486 int gamma(MKL_INT n,
float *r,
float alpha,
float a,
float beta,
487 MKL_INT method = VSL_RNG_METHOD_GAMMA_GNORM)
490 ::vsRngGamma(method, ptr_, n, r, alpha, a, beta),
491 "MKLStream::gamma",
"::vsRngGamma");
495 int gamma(MKL_INT n,
double *r,
double alpha,
double a,
double beta,
496 MKL_INT method = VSL_RNG_METHOD_GAMMA_GNORM)
499 ::vdRngGamma(method, ptr_, n, r, alpha, a, beta),
500 "MKLStream::gamma",
"::vdRngGamma");
504 int beta(MKL_INT n,
float *r,
float p,
float q,
float a,
float beta,
505 MKL_INT method = VSL_RNG_METHOD_BETA_CJA)
508 ::vsRngBeta(method, ptr_, n, r, p, q, a, beta),
"MKLStream::beta",
513 int beta(MKL_INT n,
double *r,
double p,
double q,
double a,
double beta,
514 MKL_INT method = VSL_RNG_METHOD_BETA_CJA)
517 ::vdRngBeta(method, ptr_, n, r, p, q, a, beta),
"MKLStream::beta",
523 MKL_INT method = VSL_RNG_METHOD_UNIFORM_STD)
526 ::viRngUniform(method, ptr_, n, r, a, b),
"MKLStream::uniform",
532 MKL_INT method = VSL_RNG_METHOD_UNIFORMBITS_STD)
535 ::viRngUniformBits(method, ptr_, n, r),
"MKLStream::uniform_bits",
536 "::viRngUniformBits");
541 MKL_INT method = VSL_RNG_METHOD_UNIFORMBITS32_STD)
544 ::viRngUniformBits32(method, ptr_, n, r),
545 "MKLStream::uniform_bits32",
"::viRngUniformBits32");
550 MKL_INT method = VSL_RNG_METHOD_UNIFORMBITS64_STD)
553 ::viRngUniformBits64(method, ptr_, n, r),
554 "MKLStream::uniform_bits64",
"::viRngUniformBits64");
559 MKL_INT method = VSL_RNG_METHOD_BERNOULLI_ICDF)
562 ::viRngBernoulli(method, ptr_, n, r, p),
"MKLStream::bernoulli",
568 MKL_INT method = VSL_RNG_METHOD_GEOMETRIC_ICDF)
571 ::viRngGeometric(method, ptr_, n, r, p),
"MKLStream::geometric",
576 int binomial(MKL_INT n,
int *r,
int ntrial,
double p,
577 MKL_INT method = VSL_RNG_METHOD_BINOMIAL_BTPE)
580 ::viRngBinomial(method, ptr_, n, r, ntrial, p),
581 "MKLStream::binomial",
"::viRngBinomial");
586 MKL_INT method = VSL_RNG_METHOD_HYPERGEOMETRIC_H2PE)
589 ::viRngHypergeometric(method, ptr_, n, r, l, s, m),
590 "MKLStream::hypergeometric",
"::viRngHypergeometric");
595 MKL_INT method = VSL_RNG_METHOD_POISSON_POISNORM)
598 ::viRngPoisson(method, ptr_, n, r, lambda),
"MKLStream::poisson",
604 MKL_INT method = VSL_RNG_METHOD_POISSONV_POISNORM)
607 ::viRngPoissonV(method, ptr_, n, r, lambda),
608 "MKLStream::poisson_v",
"::viRngPoissonV");
613 MKL_INT method = VSL_RNG_METHOD_NEGBINOMIAL_NBAR)
616 ::viRngNegbinomial(method, ptr_, n, r, a, p),
617 "MKLStream::neg_binomial",
"::viRngNegbinomial");
621 ::VSLStreamStatePtr ptr_;
630 if (brng1 != brng2) {
633 if (brng1 == VSL_BRNG_NONDETERM) {
637 std::size_t n =
static_cast<std::size_t
>(stream1.
get_size());
640 stream1.
save_m(s1.data());
641 stream2.
save_m(s2.data());
653 return !(stream1 == stream2);
658 template <
typename CharT,
typename Traits>
660 std::basic_ostream<CharT, Traits> &os,
const MKLStream &stream)
666 std::size_t n =
static_cast<std::size_t
>(stream.
get_size());
667 std::size_t m =
sizeof(std::uintmax_t);
673 stream.
save_m(reinterpret_cast<char *>(s.data()));
683 template <
typename CharT,
typename Traits>
685 std::basic_istream<CharT, Traits> &is,
MKLStream &stream)
693 is >> std::ws >> brng;
698 tmp.
load_m(reinterpret_cast<const char *>(s.data()));
699 stream = std::move(tmp);
707 template <MKL_INT BRNG>
714 :
public std::integral_constant<MKL_INT, 6024>
719 class MKLMaxOffset<VSL_BRNG_WH> :
public std::integral_constant<MKL_INT, 273>
723 template <MKL_INT BRNG, MKL_INT MaxOffset = MKLMaxOffset<BRNG>::value>
727 static MKL_INT
eval(MKL_INT offset) {
return BRNG + offset % MaxOffset; }
730 template <MKL_INT BRNG>
734 static MKL_INT
eval(MKL_INT) {
return BRNG; }
737 template <MKL_INT,
int>
740 template <MKL_INT BRNG>
748 return std::numeric_limits<result_type>::min();
753 return std::numeric_limits<result_type>::max();
762 template <MKL_INT BRNG>
770 return std::numeric_limits<result_type>::min();
775 return std::numeric_limits<result_type>::max();
794 template <MKL_INT BRNG,
int Bits>
797 static_assert(Bits == 32 || Bits == 64,
798 "**MKLEngine** used with bits other than 32, or 64");
805 template <
typename T>
811 template <
typename SeedSeq>
813 std::enable_if_t<is_seed_seq<SeedSeq>::value> * =
nullptr)
822 "**MKLEngine** does not support offseting");
827 template <
typename SeedSeq>
829 std::enable_if_t<is_seed_seq<SeedSeq>::value> * =
nullptr)
833 "**MKLEngine** does not support offseting");
840 s %=
static_cast<result_type>(std::numeric_limits<MKL_UINT>::max());
841 MKL_INT brng = stream_.empty() ? BRNG : stream_.get_brng();
842 stream_.reset(brng, static_cast<MKL_UINT>(s));
846 template <
typename SeedSeq>
848 std::enable_if_t<is_seed_seq<SeedSeq>::value> * =
nullptr)
850 MKL_INT brng = stream_.empty() ? BRNG : stream_.get_brng();
852 MKL_INT n = seed_params(brng, seq, params);
853 stream_.reset(brng, n, params.data());
860 "**MKLEngine** does not support offseting");
862 s %=
static_cast<result_type>(std::numeric_limits<MKL_UINT>::max());
864 stream_.reset(brng, static_cast<MKL_UINT>(s));
868 template <
typename SeedSeq>
869 void seed(MKL_INT offset, SeedSeq &seq,
870 std::enable_if_t<is_seed_seq<SeedSeq>::value> * =
nullptr)
873 "**MKLEngine** does not support offseting");
877 MKL_INT n = seed_params(brng, seq, params);
878 stream_.reset(brng, n, params.data());
889 return result_[index_++];
894 internal::size_check<MKL_INT>(n,
"MKLEngine::operator()");
896 const std::size_t remain = M_ - index_;
899 std::memcpy(r, result_.data() + index_,
sizeof(
result_type) * n);
904 std::memcpy(r, result_.data() + index_,
sizeof(
result_type) * remain);
917 const std::size_t remain = M_ - index_;
930 const long long remain =
static_cast<long long>(M_ - index_);
931 if (nskip <= remain) {
932 index_ +=
static_cast<std::size_t
>(nskip);
938 ::VSLBRngProperties properties;
940 const int bits = properties.NBits;
941 const long long M =
static_cast<long long>(M_);
942 long long m = nskip / M * M;
944 m *= Bits / bits + (Bits % bits == 0 ? 0 : 1);
946 switch (stream_.get_brng()) {
948 stream_.skip_ahead(m);
950 case VSL_BRNG_PHILOX4X32X10:
951 stream_.skip_ahead(m);
954 stream_.skip_ahead(m);
956 case VSL_BRNG_MRG32K3A:
957 stream_.skip_ahead(m);
960 stream_.skip_ahead(m);
963 stream_.skip_ahead(m);
965 case VSL_BRNG_MT19937:
966 stream_.skip_ahead(m);
968 case VSL_BRNG_SFMT19937:
969 stream_.skip_ahead(m);
972 stream_.skip_ahead(m);
974 case VSL_BRNG_NIEDERR:
975 stream_.skip_ahead(m);
984 index_ =
static_cast<std::size_t
>(nskip % M);
1006 if (eng1.stream_ != eng2.stream_) {
1009 if (eng1.result_ != eng2.result_) {
1012 if (eng1.index_ != eng2.index_) {
1024 return !(eng1 == eng2);
1027 template <
typename CharT,
typename Traits>
1029 std::basic_ostream<CharT, Traits> &os,
1036 os << eng.stream_ <<
' ';
1037 os << eng.result_ <<
' ';
1043 template <
typename CharT,
typename Traits>
1052 std::array<result_type, M_> result;
1054 is >> std::ws >> stream;
1055 is >> std::ws >> result;
1056 is >> std::ws >> index;
1059 eng.stream_ = std::move(stream);
1060 eng.result_ = result;
1068 static constexpr std::size_t M_ = 256;
1070 std::array<result_type, M_> result_;
1077 stream_, static_cast<MKL_INT>(M_), result_.data());
1083 stream_, static_cast<MKL_INT>(n), r);
1086 template <
typename SeedSeq>
1089 ::VSLBRngProperties properties;
1091 MKL_INT n = properties.NSeeds;
1092 params.resize(static_cast<std::size_t>(n));
1093 seq.generate(params.begin(), params.end());
1099 template <MKL_INT BRNG,
int Bits>
1164 namespace internal {
1166 template <
typename RNGType>
1170 unsigned reserved1[2];
1171 unsigned reserved2[2];
1175 template <
typename RNGType>
1183 template <
typename RNGType>
1184 inline int mkl_init(RNGType &rng,
int n,
const unsigned *param, std::true_type)
1187 new (
static_cast<void *
>(&rng)) RNGType();
1189 new (
static_cast<void *
>(&rng))
1190 RNGType(static_cast<typename RNGType::result_type>(param[0]));
1196 template <
typename RNGType>
1198 int method, ::VSLStreamStatePtr stream,
int n,
const unsigned *param)
1202 if (method == VSL_INIT_METHOD_STANDARD) {
1204 new (
static_cast<void *
>(&rng)) RNGType();
1206 constexpr std::size_t ns = mkl_nseeds<RNGType>();
1209 std::array<unsigned, ns> useed;
1211 std::copy_n(param, std::min(static_cast<std::size_t>(n), ns),
1213 new (
static_cast<void *
>(&rng)) RNGType(buf.seed);
1217 if (method == VSL_INIT_METHOD_LEAPFROG) {
1218 return VSL_RNG_ERROR_LEAPFROG_UNSUPPORTED;
1221 if (method == VSL_INIT_METHOD_SKIPAHEAD) {
1222 rng.discard(static_cast<unsigned>(n));
1228 template <
typename RNGType,
typename RealType>
1230 ::VSLStreamStatePtr stream,
int n, RealType *r, RealType a, RealType b)
1238 template <
typename RNGType>
1255 template <
typename RNGType>
1258 static ::VSLBRngProperties properties = {
1260 internal::mkl_nseeds<RNGType>(), 1, 4, 32, internal::mkl_init<RNGType>,
1261 internal::mkl_uniform_real<RNGType, float>,
1262 internal::mkl_uniform_real<RNGType, double>,
1263 internal::mkl_uniform_int<RNGType>};
1264 static int brng = ::vslRegisterBrng(&properties);
1269 #if MCKL_USE_MKL_VSL 1271 template <MKL_INT BRNG,
int Bits>
1273 float *r,
float alpha,
float beta)
1275 internal::size_check<MKL_INT>(n,
"beta_distribution");
1276 rng.
stream().beta(static_cast<MKL_INT>(n), r, alpha, beta, 0, 1);
1279 template <MKL_INT BRNG,
int Bits>
1281 double *r,
double alpha,
double beta)
1283 internal::size_check<MKL_INT>(n,
"beta_distribution");
1284 rng.
stream().beta(static_cast<MKL_INT>(n), r, alpha, beta, 0, 1);
1287 template <MKL_INT BRNG,
int Bits>
1291 internal::size_check<MKL_INT>(n,
"cauchy_distribution");
1292 rng.
stream().cauchy(static_cast<MKL_INT>(n), r, a, b);
1295 template <MKL_INT BRNG,
int Bits>
1299 internal::size_check<MKL_INT>(n,
"cauchy_distribution");
1300 rng.
stream().cauchy(static_cast<MKL_INT>(n), r, a, b);
1303 template <MKL_INT BRNG,
int Bits>
1307 internal::size_check<MKL_INT>(n,
"exponential_distribution");
1308 rng.
stream().exponential(static_cast<MKL_INT>(n), r, 0, 1 / lambda);
1311 template <MKL_INT BRNG,
int Bits>
1315 internal::size_check<MKL_INT>(n,
"exponential_distribution");
1316 rng.
stream().exponential(static_cast<MKL_INT>(n), r, 0, 1 / lambda);
1319 template <MKL_INT BRNG,
int Bits>
1323 internal::size_check<MKL_INT>(n,
"extreme_value_distribution");
1324 rng.
stream().gumbel(static_cast<MKL_INT>(n), r, a, b);
1325 sub(n, 2 * a, r, r);
1328 template <MKL_INT BRNG,
int Bits>
1332 internal::size_check<MKL_INT>(n,
"extreme_value_distribution");
1333 rng.
stream().gumbel(static_cast<MKL_INT>(n), r, a, b);
1334 sub(n, 2 * a, r, r);
1337 template <MKL_INT BRNG,
int Bits>
1339 float *r,
float alpha,
float beta)
1341 internal::size_check<MKL_INT>(n,
"gamma_distribution");
1342 rng.
stream().gamma(static_cast<MKL_INT>(n), r, alpha, 0, beta);
1345 template <MKL_INT BRNG,
int Bits>
1347 double *r,
double alpha,
double beta)
1349 internal::size_check<MKL_INT>(n,
"gamma_distribution");
1350 rng.
stream().gamma(static_cast<MKL_INT>(n), r, alpha, 0, beta);
1353 template <MKL_INT BRNG,
int Bits>
1355 float *r,
float location,
float scale)
1357 internal::size_check<MKL_INT>(n,
"lapace_distribution");
1358 rng.
stream().laplace(static_cast<MKL_INT>(n), r, location, scale);
1361 template <MKL_INT BRNG,
int Bits>
1363 double *r,
double location,
double scale)
1365 internal::size_check<MKL_INT>(n,
"lapace_distribution");
1366 rng.
stream().laplace(static_cast<MKL_INT>(n), r, location, scale);
1369 template <MKL_INT BRNG,
int Bits>
1373 internal::size_check<MKL_INT>(n,
"lognormal_distribution");
1374 rng.
stream().lognormal(static_cast<MKL_INT>(n), r, m, s, 0, 1);
1377 template <MKL_INT BRNG,
int Bits>
1381 internal::size_check<MKL_INT>(n,
"lognormal_distribution");
1382 rng.
stream().lognormal(static_cast<MKL_INT>(n), r, m, s, 0, 1);
1385 template <MKL_INT BRNG,
int Bits>
1387 float *r,
float mean,
float stddev)
1389 internal::size_check<MKL_INT>(n,
"normal_distribution");
1390 rng.
stream().gaussian(static_cast<MKL_INT>(n), r, mean, stddev);
1393 template <MKL_INT BRNG,
int Bits>
1395 double *r,
double mean,
double stddev)
1397 internal::size_check<MKL_INT>(n,
"normal_distribution");
1398 rng.
stream().gaussian(static_cast<MKL_INT>(n), r, mean, stddev);
1401 template <MKL_INT BRNG,
int Bits>
1403 float *r, std::size_t m,
const float *mean,
const float *chol)
1405 internal::size_check<MKL_INT>(n,
"normal_mv_distribution");
1406 internal::size_check<MKL_INT>(m,
"normal_mv_distribution");
1407 rng.
stream().gaussian_mv(static_cast<MKL_INT>(n), r,
1408 static_cast<MKL_INT>(m), VSL_MATRIX_STORAGE_PACKED, mean, chol);
1411 template <MKL_INT BRNG,
int Bits>
1413 double *r, std::size_t m,
const double *mean,
const double *chol)
1415 internal::size_check<MKL_INT>(n,
"normal_mv_distribution");
1416 internal::size_check<MKL_INT>(m,
"normal_mv_distribution");
1417 rng.
stream().gaussian_mv(static_cast<MKL_INT>(n), r,
1418 static_cast<MKL_INT>(m), VSL_MATRIX_STORAGE_PACKED, mean, chol);
1421 template <MKL_INT BRNG,
int Bits>
1425 internal::size_check<MKL_INT>(n,
"rayleigh_distribution");
1430 template <MKL_INT BRNG,
int Bits>
1434 internal::size_check<MKL_INT>(n,
"rayleigh_distribution");
1439 template <MKL_INT BRNG,
int Bits>
1443 internal::size_check<MKL_INT>(n,
"uniform_real_distribution");
1444 rng.
stream().uniform(static_cast<MKL_INT>(n), r, a, b);
1447 template <MKL_INT BRNG,
int Bits>
1451 internal::size_check<MKL_INT>(n,
"uniform_real_distribution");
1452 rng.
stream().uniform(static_cast<MKL_INT>(n), r, a, b);
1455 template <MKL_INT BRNG,
int Bits>
1459 internal::size_check<MKL_INT>(n,
"weibull_distribution");
1460 rng.
stream().weibull(static_cast<MKL_INT>(n), r, a, 0, b);
1463 template <MKL_INT BRNG,
int Bits>
1467 internal::size_check<MKL_INT>(n,
"weibull_distribution");
1468 rng.
stream().weibull(static_cast<MKL_INT>(n), r, a, 0, b);
1471 template <MKL_INT BRNG,
int Bits>
1475 internal::size_check<MKL_INT>(n,
"bernoulli_distribution");
1476 rng.
stream().bernoulli(static_cast<MKL_INT>(n), r, p);
1479 template <MKL_INT BRNG,
int Bits>
1483 internal::size_check<MKL_INT>(n,
"geometric_distribution");
1484 rng.
stream().geometric(static_cast<MKL_INT>(n), r, p);
1487 template <MKL_INT BRNG,
int Bits>
1491 internal::size_check<MKL_INT>(n,
"uniform_int_distribution");
1492 if (b < std::numeric_limits<int>::max()) {
1493 rng.
stream().uniform(static_cast<MKL_INT>(n), r, a, b + 1);
1495 rng.
stream().uniform(static_cast<MKL_INT>(n), r, a - 1, b);
1498 rng.
stream().uniform_bits32(
1499 static_cast<MKL_INT>(n), reinterpret_cast<unsigned *>(r));
1503 #endif // MCKL_USE_MKL_VSL 1507 #endif // MCKL_RANDOM_MKL_HPP int mkl_error_check(int status, const char *cpp, const char *c)
int binomial(MKL_INT n, int *r, int ntrial, double p, MKL_INT method=VSL_RNG_METHOD_BINOMIAL_BTPE)
viRngBinomial
MKLStream(::VSLStreamStatePtr ptr=nullptr)
void cauchy_distribution(RNGType &rng, std::size_t N, RealType *r, RealType a, RealType b)
int skip_ahead(long long nskip)
vslSkipAheadStream
void normal_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, float mean, float stddev)
int lognormal(MKL_INT n, double *r, double a, double sigma, double b, double beta, MKL_INT method=VSL_RNG_METHOD_LOGNORMAL_BOXMULLER2)
vdRngLognormal
int gumbel(MKL_INT n, double *r, double a, double beta, MKL_INT method=VSL_RNG_METHOD_GUMBEL_ICDF)
vdRngGumbel
MKLStream(MKLStream &&other)
friend bool operator!=(const MKLEngine< BRNG, Bits > &eng1, const MKLEngine< BRNG, Bits > &eng2)
eng1 != eng2 is a necessary condition for subsequent call of operator() output different results...
static MKL_INT eval(MKL_INT)
void normal_mv_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, std::size_t m, const float *mean, const float *chol)
void uniform_int_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, int *r, int a, int b)
void laplace_distribution(RNGType &rng, std::size_t N, RealType *r, RealType a, RealType b)
static constexpr result_type min()
constexpr double const_sqrt_2< double >() noexcept
friend bool operator==(const MKLEngine< BRNG, Bits > &eng1, const MKLEngine< BRNG, Bits > &eng2)
eng1 == eng2 is a sufficent condition for subsequent call of operator() output the same results...
int laplace(MKL_INT n, float *r, float a, float beta, MKL_INT method=VSL_RNG_METHOD_LAPLACE_ICDF)
vsRngLaplace
int poisson_v(MKL_INT n, int *r, const double *lambda, MKL_INT method=VSL_RNG_METHOD_POISSONV_POISNORM)
viRngPoissonV
static bool has_skip_ahead(MKL_INT brng)
Test if vslSkipAheadStream is supported.
int beta(MKL_INT n, float *r, float p, float q, float a, float beta, MKL_INT method=VSL_RNG_METHOD_BETA_CJA)
vsRngBeta
void uniform_bits_distribution(RNGType &rng, std::size_t n, UIntType *r)
std::vector< T, Alloc > Vector
std::vector with Allocator as the default allocator
int gumbel(MKL_INT n, float *r, float a, float beta, MKL_INT method=VSL_RNG_METHOD_GUMBEL_ICDF)
vsRngGumbel
int reset(MKL_INT brng, MKL_INT n, unsigned *params)
vslNewStreamEx
constexpr float const_sqrt_2< float >() noexcept
friend std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &is, MKLEngine< BRNG, Bits > &eng)
void exponential_distribution(RNGType &rng, std::size_t N, RealType *r, RealType lambda)
~MKLStream()
vslDeleteStream
int load_m(const char *memptr)
vslLoadStreamM
void gamma_distribution(RNGType &rng, std::size_t n, RealType *r, RealType alpha, RealType beta)
int uniform_bits32(MKL_INT n, unsigned *r, MKL_INT method=VSL_RNG_METHOD_UNIFORMBITS32_STD)
viRngUniform32
int gamma(MKL_INT n, float *r, float alpha, float a, float beta, MKL_INT method=VSL_RNG_METHOD_GAMMA_GNORM)
vsRngGamma
int weibull(MKL_INT n, double *r, double alpha, double a, double beta, MKL_INT method=VSL_RNG_METHOD_WEIBULL_ICDF)
vdRngWeibull
void discard(long long nskip)
static int get_brng_properties(MKL_INT brng, ::VSLBRngProperties *properties)
vslGetBrngProperties
MKLEngine(result_type s=1)
MKLEngine(MKL_INT offset, result_type s)
int get_brng() const
vslGetStreamStateBrng
MKLStream(MKL_INT brng, MKL_INT n, unsigned *params)
vslNewStreamEx
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const MKLEngine< BRNG, Bits > &eng)
void seed(MKL_INT offset, SeedSeq &seq, std::enable_if_t< is_seed_seq< SeedSeq >::value > *=nullptr)
int reset(MKL_INT brng, MKL_UINT seed)
vslNewStream
void beta_distribution(RNGType &rng, std::size_t n, RealType *r, RealType alpha, RealType beta)
int neg_binomial(MKL_INT n, int *r, double a, double p, MKL_INT method=VSL_RNG_METHOD_NEGBINOMIAL_NBAR)
viRngNegbinomial
void rayleigh_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, float sigma)
int load_f(const std::string &fname)
vslSaveStreamF
int uniform(MKL_INT n, float *r, float a, float b, MKL_INT method=VSL_RNG_METHOD_UNIFORM_STD)
vsRngUniform
Use MKL BRNG as RNG engine.
const MKLStream & stream() const
int exponential(MKL_INT n, float *r, float a, float beta, MKL_INT method=VSL_RNG_METHOD_EXPONENTIAL_ICDF)
vsRngExponential
MKLStream(const MKLStream &other)
vslCopyStream
int weibull(MKL_INT n, float *r, float alpha, float a, float beta, MKL_INT method=VSL_RNG_METHOD_WEIBULL_ICDF)
vsRngWeibull
int laplace(MKL_INT n, double *r, double a, double beta, MKL_INT method=VSL_RNG_METHOD_LAPLACE_ICDF)
vdRngLaplace
MKLEngine(MKL_INT offset, SeedSeq &seq, std::enable_if_t< is_seed_seq< SeedSeq >::value > *=nullptr)
void sub(std::size_t n, const float *a, const float *b, float *y)
void bernoulli_distribution(RNGType &rng, std::size_t N, InType *r, double p)
constexpr int mkl_nseeds()
int save_f(const std::string &fname) const
vslSaveStreamF
std::size_t discard()
Discard the result.
void lognormal_distribution(RNGType &rng, std::size_t N, RealType *r, RealType m, RealType s)
int release()
vslDeleteStream
static bool has_uniform_bits32(MKL_INT brng, MKL_INT method=VSL_RNG_METHOD_UNIFORMBITS32_STD)
Test if viRngUniformBits32 is supported.
static bool has_leap_frog(MKL_INT brng)
Test if vslLeapfrogStream is supported.
int save_m(char *memptr) const
vslSaveStreamM
static int get_num_reg_brngs()
vslGetNumRegBrngs
int reset(::VSLStreamStatePtr ptr)
int bernoulli(MKL_INT n, int *r, double p, MKL_INT method=VSL_RNG_METHOD_BERNOULLI_ICDF)
viRngBernoulli
static constexpr result_type max()
int gaussian_mv(MKL_INT n, float *r, MKL_INT dimen, MKL_INT mstorage, const float *a, const float *t, MKL_INT method=VSL_RNG_METHOD_GAUSSIANMV_BOXMULLER2)
vsRngGaussianMV
int cauchy(MKL_INT n, float *r, float a, float beta, MKL_INT method=VSL_RNG_METHOD_CAUCHY_ICDF)
vsRngCauchy
int exponential(MKL_INT n, double *r, double a, double beta, MKL_INT method=VSL_RNG_METHOD_EXPONENTIAL_ICDF)
vdRngExponential
void weibull_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, float a, float b)
void extreme_value_distribution(RNGType &rng, std::size_t N, RealType *r, RealType a, RealType b)
void seed(MKL_INT offset, result_type s)
int uniform(MKL_INT n, double *r, double a, double b, MKL_INT method=VSL_RNG_METHOD_UNIFORM_STD)
vdRngUniform
int beta(MKL_INT n, double *r, double p, double q, double a, double beta, MKL_INT method=VSL_RNG_METHOD_BETA_CJA)
vdRngBeta
MKLStream & operator=(MKLStream &&other)
int gamma(MKL_INT n, double *r, double alpha, double a, double beta, MKL_INT method=VSL_RNG_METHOD_GAMMA_GNORM)
vdRngGamma
std::integral_constant< bool, std::is_class< T >::value &&!std::is_convertible< T, RNGType >::value &&!std::is_convertible< T, typename RNGType::result_type >::value &&!std::is_convertible< T, KeyType >::value > is_seed_seq
int mkl_init(RNGType &rng, int n, const unsigned *param, std::true_type)
int uniform_bits(MKL_INT n, unsigned *r, MKL_INT method=VSL_RNG_METHOD_UNIFORMBITS_STD)
viRngUniform
int mkl_uniform_real(::VSLStreamStatePtr stream, int n, RealType *r, RealType a, RealType b)
static bool has_uniform_bits64(MKL_INT brng, MKL_INT method=VSL_RNG_METHOD_UNIFORMBITS64_STD)
Test if viRngUniformBits64 is supported.
int mkl_brng()
Register an RNG as MKL BRNG.
int geometric(MKL_INT n, int *r, double p, MKL_INT method=VSL_RNG_METHOD_GEOMETRIC_ICDF)
viRngGeometric
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Matrix< T, Layout, Alloc > &mat)
Output operator.
void rand(RNGType &rng, ArcsineDistribution< RealType > &distribution, std::size_t N, RealType *r)
bool operator!=(const MKLStream &stream1, const MKLStream &stream2)
Inequality comparison of MKLStream.
int uniform_bits64(MKL_INT n, unsigned MKL_INT64 *r, MKL_INT method=VSL_RNG_METHOD_UNIFORMBITS64_STD)
viRngUniform64
int get_size() const
vslGetStreamSize
int uniform(MKL_INT n, int *r, int a, int b, MKL_INT method=VSL_RNG_METHOD_UNIFORM_STD)
viRngUniform
void uniform_real_distribution(MKLEngine< BRNG, Bits > &rng, std::size_t n, float *r, float a, float b)
static MKL_INT eval(MKL_INT offset)
int mkl_uniform_int(::VSLStreamStatePtr stream, int n, unsigned *r)
bool operator==(const MKLStream &stream1, const MKLStream &stream2)
Equality comparison of MKLStream.
MKLStream & operator=(const MKLStream &other)
vslCopyStream/vslCopySreamState
int gaussian_mv(MKL_INT n, double *r, MKL_INT dimen, MKL_INT mstorage, const double *a, const double *t, MKL_INT method=VSL_RNG_METHOD_GAUSSIANMV_BOXMULLER2)
vdRngGaussianMV
MKLStream(MKL_INT brng, MKL_UINT seed)
vslNewStream
int rayleigh(MKL_INT n, double *r, double a, double beta, MKL_INT method=VSL_RNG_METHOD_RAYLEIGH_ICDF)
vdRngRayleigh
void operator()(std::size_t n, result_type *r)
std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &is, Matrix< T, Layout, Alloc > &mat)
Input operator.
int lognormal(MKL_INT n, float *r, float a, float sigma, float b, float beta, MKL_INT method=VSL_RNG_METHOD_LOGNORMAL_BOXMULLER2)
vsRngLognormal
typename internal::MKLUniformBits< BRNG, Bits >::result_type result_type
int cauchy(MKL_INT n, double *r, double a, double beta, MKL_INT method=VSL_RNG_METHOD_CAUCHY_ICDF)
vdRngCauchy
void seed(SeedSeq &seq, std::enable_if_t< is_seed_seq< SeedSeq >::value > *=nullptr)
int rayleigh(MKL_INT n, float *r, float a, float beta, MKL_INT method=VSL_RNG_METHOD_RAYLEIGH_ICDF)
vsRngRayleigh
int gaussian(MKL_INT n, float *r, float a, float sigma, MKL_INT method=VSL_RNG_METHOD_GAUSSIAN_BOXMULLER2)
vsRngGaussian
typename SeedTrait< RNGType >::type SeedType
int poisson(MKL_INT n, int *r, double lambda, MKL_INT method=VSL_RNG_METHOD_POISSON_POISNORM)
viRngPoisson
int gaussian(MKL_INT n, double *r, double a, double sigma, MKL_INT method=VSL_RNG_METHOD_GAUSSIAN_BOXMULLER2)
vdRngGaussian
int hypergeometric(MKL_INT n, int *r, int l, int s, int m, MKL_INT method=VSL_RNG_METHOD_HYPERGEOMETRIC_H2PE)
viRngHypergeometric
void geometric_distribution(RNGType &rng, std::size_t N, InType *r, double p)
void runtime_assert(bool cond, const char *msg, bool soft=false)
int leapfrog(MKL_INT k, MKL_INT nstreams)
vslLeapfrogStream
MKL VSLStreamStatePtr wrapper.
MKLEngine(SeedSeq &seq, std::enable_if_t< is_seed_seq< SeedSeq >::value > *=nullptr)
void add(std::size_t n, const float *a, const float *b, float *y)