12#ifndef EIGENRAND_DISTS_BASIC_H
13#define EIGENRAND_DISTS_BASIC_H
21 static constexpr double pi = 3.1415926535897932;
22 static constexpr double e = 2.7182818284590452;
31 template<
typename DerivedGen,
typename Scalar>
38 DerivedGen &
derived() {
return static_cast<DerivedGen &
>(*this); }
51 template<
typename Derived,
typename Urng>
52 inline const CwiseNullaryOp<internal::scalar_rng_adaptor<DerivedGen&, Scalar, Urng>,
const Derived>
56 rows, cols, { std::forward<Urng>(urng),
derived() }
70 template<
typename Derived,
typename Urng>
71 inline const CwiseNullaryOp<internal::scalar_rng_adaptor<DerivedGen&, Scalar, Urng>,
const Derived>
75 o.rows(), o.cols(), { std::forward<Urng>(urng),
derived() }
80 template<
typename DerivedGen,
typename Scalar,
typename ScalarA>
87 DerivedGen &derived() {
return static_cast<DerivedGen &
>(*this); }
99 template<
typename Lhs,
typename Urng>
101 internal::scalar_unary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, Urng>,
103 > generate(Urng&& urng,
const ArrayBase<Lhs>& a)
106 a, { std::forward<Urng>(urng), derived() }
111 template<
typename DerivedGen,
typename Scalar,
typename ScalarA,
typename ScalarB>
118 DerivedGen &derived() {
return static_cast<DerivedGen &
>(*this); }
130 template<
typename Lhs,
typename Rhs,
typename Urng>
131 inline CwiseBinaryOp<
132 internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng>,
134 > generate(Urng&& urng,
const ArrayBase<Lhs>& a,
const ArrayBase<Rhs>& b)
137 a, b, { std::forward<Urng>(urng), derived() }
141 template<
typename Lhs,
typename Rhs,
typename Urng>
142 inline CwiseBinaryOp<
143 internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, Rhs, Urng>,
144 const Lhs, CwiseNullaryOp<internal::scalar_constant_op<Rhs>,
const Lhs>
145 > generate(Urng&& urng,
const ArrayBase<Lhs>& a, Rhs b)
148 a, { a.rows(), a.cols(), internal::scalar_constant_op<Rhs>{ b } },
149 { std::forward<Urng>(urng), derived() }
153 template<
typename Lhs,
typename Rhs,
typename Urng>
154 inline CwiseBinaryOp<
155 internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, Lhs, typename Rhs::Scalar, Urng>,
156 CwiseNullaryOp<internal::scalar_constant_op<Lhs>,
const Rhs>,
const Rhs
157 > generate(Urng&& urng, Lhs a,
const ArrayBase<Rhs>& b)
160 { b.rows(), b.cols(), internal::scalar_constant_op<Lhs>{ a } }, b,
161 { std::forward<Urng>(urng), derived() }
173 template<
typename DerivedGen,
typename _Scalar, Index Dim>
180 DerivedGen &
derived() {
return static_cast<DerivedGen &
>(*this); }
196 template<
typename Urng>
197 inline Matrix<_Scalar, Dim, -1>
generate(Urng&& urng, Index samples)
199 return derived().generate(std::forward<Urng>(urng), samples);
209 template<
typename Urng>
210 inline Matrix<_Scalar, Dim, 1>
generate(Urng&& urng)
212 return derived().generate(std::forward<Urng>(urng));
223 template<
typename DerivedGen,
typename _Scalar, Index Dim>
230 DerivedGen &
derived() {
return static_cast<DerivedGen &
>(*this); }
246 template<
typename Urng>
247 inline Matrix<_Scalar, Dim, -1>
generate(Urng&& urng, Index samples)
249 return derived().generate(std::forward<Urng>(urng), samples);
259 template<
typename Urng>
260 inline Matrix<_Scalar, Dim, Dim>
generate(Urng&& urng)
262 return derived().generate(std::forward<Urng>(urng));
266 template<Index _alignment=0>
270 enum { max_size =
sizeof(internal::find_best_packet<float, -1>::type) };
271 int8_t raw_data[max_size + _alignment - 1] = { 0, };
277 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
280 CacheStore(
const CacheStore& c)
282 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
283 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
286 CacheStore(CacheStore&& c)
288 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
289 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
292 template<
typename Ty>
295 return *(Ty*)aligned_ptr;
298 template<
typename Ty>
299 const Ty& get()
const
301 return *(
const Ty*)aligned_ptr;
309 enum { max_size =
sizeof(internal::find_best_packet<float, -1>::type) };
310 int8_t raw_data[max_size] = { 0, };
317 CacheStore(
const CacheStore& c)
319 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
322 CacheStore(CacheStore&& c)
324 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
327 template<
typename Ty>
330 return *(Ty*)raw_data;
333 template<
typename Ty>
334 const Ty& get()
const
336 return *(
const Ty*)raw_data;
340 using OptCacheStore = CacheStore<EIGEN_MAX_ALIGN_BYTES>;
342 template<
typename _Scalar>
343 struct ExtractFirstUint;
346 struct ExtractFirstUint<float>
348 template<
typename Packet>
349 auto operator()(Packet v) ->
decltype(Eigen::internal::pfirst(v))
351 return Eigen::internal::pfirst(v);
356 struct ExtractFirstUint<double>
358 template<
typename Packet>
359 auto operator()(Packet v) -> uint64_t
361#ifdef EIGEN_VECTORIZE_AVX512
362 return Eigen::internal::pfirst(v);
364 uint64_t arr[
sizeof(Packet) / 8];
365 Eigen::internal::pstoreu((Packet*)arr, v);
376 template<
typename _Scalar>
379 static_assert(std::is_integral<_Scalar>::value,
"randBits needs integral types.");
382 using Scalar = _Scalar;
384 template<
typename Rng>
385 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
387 using namespace Eigen::internal;
388 return pfirst(std::forward<Rng>(rng)());
391 template<
typename Packet,
typename Rng>
392 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
394 using namespace Eigen::internal;
395 using RUtils = RawbitsMaker<Packet, Rng>;
396 return RUtils{}.rawbits(std::forward<Rng>(rng));
405 template<
typename _Scalar>
408 static_assert(std::is_floating_point<_Scalar>::value,
"balanced needs floating point types.");
411 using Scalar = _Scalar;
413 template<
typename Rng>
414 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
416 using namespace Eigen::internal;
417 return ((_Scalar)((int32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) / 0x7FFFFFFF) * 2 - 1;
420 template<
typename Packet,
typename Rng>
421 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
423 using namespace Eigen::internal;
424 using RUtils = RandUtils<Packet, Rng>;
425 return RUtils{}.balanced(std::forward<Rng>(rng));
434 template<
typename _Scalar>
437 static_assert(std::is_floating_point<_Scalar>::value,
"balanced needs floating point types.");
438 _Scalar slope = 2, bias = -1;
440 using Scalar = _Scalar;
448 : slope{ _b - _a }, bias{ _a }
452 template<
typename Rng>
453 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
455 using namespace Eigen::internal;
456 return ((_Scalar)((int32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) / 0x7FFFFFFF) * slope + bias;
459 template<
typename Packet,
typename Rng>
460 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
462 using namespace Eigen::internal;
463 using RUtils = RandUtils<Packet, Rng>;
464 return RUtils{}.balanced(std::forward<Rng>(rng), slope, bias);
468 template<
typename _Scalar>
469 class BalancedVGen :
public BinaryGenBase<BalancedVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
471 static_assert(std::is_floating_point<_Scalar>::value,
"balanced needs floating point types.");
474 using Scalar = _Scalar;
476 template<
typename Rng>
477 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
479 using namespace Eigen::internal;
480 return ((_Scalar)((int32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) / 0x7FFFFFFF) * (b - a) + a;
483 template<
typename Packet,
typename Rng>
484 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng,
const Packet& a,
const Packet& b)
486 using namespace Eigen::internal;
487 using RUtils = RandUtils<Packet, Rng>;
488 return padd(pmul(RUtils{}.zero_to_one(std::forward<Rng>(rng)), psub(b, a)), a);
497 static constexpr size_t value = BitWidth<v / 2>::value + 1;
503 static constexpr size_t value = 0;
509 static constexpr size_t _min = Rng::min();
510 static constexpr size_t _max = Rng::max();
512 static constexpr bool _fullbit_rng = _min == 0 && (_max & (_max + 1)) == 0;
513 static constexpr size_t value = IsPacketRandomEngine<Rng>::value ?
sizeof(
typename Rng::result_type) * 8 : (_fullbit_rng ? BitWidth<_max>::value : 0);
522 template<
typename _Scalar>
525 static_assert(std::is_floating_point<_Scalar>::value,
"uniformReal needs floating point types.");
528 using Scalar = _Scalar;
530 template<
typename Rng,
531 typename std::enable_if<
sizeof(Scalar) * 8 <= detail::RngBitSize<
typename std::remove_const<
typename std::remove_reference<Rng>::type>::type>::value,
int>::type = 0
533 EIGEN_STRONG_INLINE
const _Scalar
operator() (Rng&& rng)
535 using namespace Eigen::internal;
536 return BitScalar<_Scalar>{}.to_ur(ExtractFirstUint<_Scalar>{}(std::forward<Rng>(rng)()));
539 template<
typename Rng,
540 typename std::enable_if<detail::RngBitSize<typename std::remove_const<typename std::remove_reference<Rng>::type>::type>::value <
sizeof(Scalar) * 8,
int>::type = 0
542 EIGEN_STRONG_INLINE
const _Scalar
operator() (Rng&& rng)
544 using RRng =
typename std::remove_const<typename std::remove_reference<Rng>::type>::type;
545 static_assert(detail::RngBitSize<RRng>::value > 0,
546 "BaseRng must be a kind of mersenne_twister_engine.");
547 using ResultType =
typename std::conditional<detail::RngBitSize<RRng>::value == 32, uint32_t, uint64_t>::type;
548 using namespace Eigen::internal;
549 ResultType arr[
sizeof(Scalar) /
sizeof(ResultType)];
550 for (
size_t i = 0; i <
sizeof(Scalar) /
sizeof(ResultType); ++i)
554 return BitScalar<_Scalar>{}.to_ur(*(uint64_t*)arr);
557 template<
typename Rng,
558 typename std::enable_if<
sizeof(Scalar) <=
sizeof(
typename std::remove_const<
typename std::remove_reference<Rng>::type>::type::result_type),
int>::type = 0
560 EIGEN_STRONG_INLINE
const _Scalar nzur_scalar(Rng&& rng)
562 using namespace Eigen::internal;
563 return BitScalar<_Scalar>{}.to_nzur(ExtractFirstUint<_Scalar>{}(std::forward<Rng>(rng)()));
566 template<
typename Rng,
567 typename std::enable_if<
sizeof(
typename std::remove_const<typename std::remove_reference<Rng>::type>::type::result_type) <
sizeof(Scalar),
int > ::type = 0
569 EIGEN_STRONG_INLINE
const _Scalar nzur_scalar(Rng&& rng)
571 using namespace Eigen::internal;
572 using RngResult =
typename std::remove_const<typename std::remove_reference<Rng>::type>::type::result_type;
573 RngResult arr[
sizeof(Scalar) /
sizeof(RngResult)];
574 for (
size_t i = 0; i <
sizeof(Scalar) /
sizeof(RngResult); ++i)
578 return BitScalar<_Scalar>{}.to_nzur(*(Scalar*)arr);
581 template<
typename Packet,
typename Rng>
582 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
584 using namespace Eigen::internal;
585 using RUtils = RandUtils<Packet, Rng>;
586 return RUtils{}.uniform_real(std::forward<Rng>(rng));
595 template<
typename _Scalar>
598 static_assert(std::is_floating_point<_Scalar>::value,
"uniformReal needs floating point types.");
602 using Scalar = _Scalar;
605 : bias{ _min }, slope{ _max - _min }
615 template<
typename Rng>
616 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
618 using namespace Eigen::internal;
619 return bias + BitScalar<_Scalar>{}.to_ur(pfirst(std::forward<Rng>(rng)())) * slope;
622 template<
typename Packet,
typename Rng>
623 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
625 using namespace Eigen::internal;
626 using RUtils = RandUtils<Packet, Rng>;
628 RUtils{}.uniform_real(std::forward<Rng>(rng)), pset1<Packet>(slope)
629 ), pset1<Packet>(bias));
633 template<
typename _Scalar>
634 class UniformRealVGen :
public BinaryGenBase<UniformRealVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
636 static_assert(std::is_floating_point<_Scalar>::value,
"uniformReal needs floating point types.");
639 using Scalar = _Scalar;
641 template<
typename Rng>
642 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
644 using namespace Eigen::internal;
645 return a + BitScalar<_Scalar>{}.to_ur(pfirst(std::forward<Rng>(rng)())) * (b - a);
648 template<
typename Packet,
typename Rng>
649 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng,
const Packet& a,
const Packet& b)
651 using namespace Eigen::internal;
652 using RUtils = RandUtils<Packet, Rng>;
654 RUtils{}.uniform_real(std::forward<Rng>(rng)), psub(b, a)
665 template<
typename _Scalar>
670 using Scalar = _Scalar;
674 eigen_assert(0 <= _p && _p <= 1 );
675 p = (uint32_t)(_p * 0x80000000);
684 template<
typename Rng>
685 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
687 using namespace Eigen::internal;
688 return (((uint32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) < p) ? 1 : 0;
691 template<
typename Packet,
typename Rng>
692 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
694 using namespace Eigen::internal;
695 using IPacket =
decltype(reinterpret_to_int(std::declval<Packet>()));
696 using RUtils = RawbitsMaker<IPacket, Rng>;
697 auto one = pset1<Packet>(1);
698 auto zero = pset1<Packet>(0);
699 auto r = RUtils{}.rawbits(std::forward<Rng>(rng));
700 r = pand(r, pset1<IPacket>(0x7FFFFFFF));
701 return pblendv(pcmplt(r, pset1<IPacket>(p)), one, zero);
705 template<
typename _Scalar>
706 class BernoulliVGen :
public UnaryGenBase<BernoulliVGen<_Scalar>, _Scalar, _Scalar>
708 static_assert(std::is_floating_point<_Scalar>::value,
"vectorized `bernoulli` needs a float type.");
710 using Scalar = _Scalar;
712 template<
typename Rng>
713 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng, _Scalar a)
715 using namespace Eigen::internal;
716 uint32_t p = (uint32_t)(a * 0x80000000);
717 return (((uint32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) < p) ? 1 : 0;
720 template<
typename Packet,
typename Rng>
721 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng,
const Packet& a)
723 using namespace Eigen::internal;
724 using IPacket =
decltype(reinterpret_to_int(std::declval<Packet>()));
725 using RUtils = RawbitsMaker<IPacket, Rng>;
726 auto one = pset1<Packet>(1);
727 auto zero = pset1<Packet>(0);
728 auto p = pcast<Packet, IPacket>(pmul(a, pset1<Packet>(0x80000000)));
729 auto r = RUtils{}.rawbits(std::forward<Rng>(rng));
730 r = pand(r, pset1<IPacket>(0x7FFFFFFF));
731 return pblendv(pcmplt(r, p), one, zero);
735 template<
typename Derived,
typename Urng>
736 using RandBitsType = CwiseNullaryOp<internal::scalar_rng_adaptor<RandbitsGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
750 template<
typename Derived,
typename Urng>
751 inline const RandBitsType<Derived, Urng>
755 rows, cols, { std::forward<Urng>(urng) }
770 template<
typename Derived,
typename Urng>
771 inline const RandBitsType<Derived, Urng>
775 o.rows(), o.cols(), { std::forward<Urng>(urng) }
779 template<
typename Derived,
typename Urng>
780 using BalancedType = CwiseNullaryOp<internal::scalar_rng_adaptor<BalancedGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
794 template<
typename Derived,
typename Urng>
795 inline const BalancedType<Derived, Urng>
799 rows, cols, { std::forward<Urng>(urng) }
814 template<
typename Derived,
typename Urng>
815 inline const BalancedType<Derived, Urng>
819 o.rows(), o.cols(), { std::forward<Urng>(urng) }
823 template<
typename Derived,
typename Urng>
824 using Balanced2Type = CwiseNullaryOp<internal::scalar_rng_adaptor<Balanced2Gen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
839 template<
typename Derived,
typename Urng>
840 inline const Balanced2Type<Derived, Urng>
841 balanced(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar a,
typename Derived::Scalar b)
860 template<
typename Derived,
typename Urng>
861 inline const Balanced2Type<Derived, Urng>
862 balancedLike(
const Derived& o, Urng&& urng,
typename Derived::Scalar a,
typename Derived::Scalar b)
869 template<
typename Derived,
typename Urng>
870 using BalancedVVType = CwiseBinaryOp<
871 internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
872 const Derived,
const Derived
888 template<
typename Lhs,
typename Rhs,
typename Urng>
889 inline const BalancedVVType<Lhs, Urng>
890 balanced(Urng&& urng,
const ArrayBase<Lhs>& a,
const ArrayBase<Rhs>& b)
892 static_assert(std::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value,
"`Lhs::Scalar` must be equal to `Rhs::Scalar`");
894 static_cast<const Lhs&
>(a),
static_cast<const Rhs&
>(b),
895 { std::forward<Urng>(urng), BalancedVGen<typename Lhs::Scalar>{} }
899 template<
typename Derived,
typename Urng>
900 using BalancedVSType = CwiseBinaryOp<
901 internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
902 const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>,
const Derived>
905 template<
typename Lhs,
typename Urng>
906 inline const BalancedVSType<Lhs, Urng>
907 balanced(Urng&& urng,
const ArrayBase<Lhs>& a,
typename Lhs::Scalar b)
910 static_cast<const Lhs&
>(a), { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
911 { std::forward<Urng>(urng), BalancedVGen<typename Lhs::Scalar>{} }
915 template<
typename Derived,
typename Urng>
916 using BalancedSVType = CwiseBinaryOp<
917 internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
918 CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>,
const Derived>,
const Derived
921 template<
typename Rhs,
typename Urng>
922 inline const BalancedSVType<Rhs, Urng>
923 balanced(Urng&& urng,
typename Rhs::Scalar a,
const ArrayBase<Rhs>& b)
926 { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
static_cast<const Rhs&
>(b),
927 { std::forward<Urng>(urng), BalancedVGen<typename Rhs::Scalar>{} }
931 template<
typename Derived,
typename Urng>
932 using StdUniformRealType = CwiseNullaryOp<internal::scalar_rng_adaptor<StdUniformRealGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
946 template<
typename Derived,
typename Urng>
947 inline const StdUniformRealType<Derived, Urng>
951 rows, cols, { std::forward<Urng>(urng) }
966 template<
typename Derived,
typename Urng>
967 inline const StdUniformRealType<Derived, Urng>
971 o.rows(), o.cols(), { std::forward<Urng>(urng) }
975 template<
typename Derived,
typename Urng>
976 using UniformRealType = CwiseNullaryOp<internal::scalar_rng_adaptor<UniformRealGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
991 template<
typename Derived,
typename Urng>
992 inline const UniformRealType<Derived, Urng>
993 uniformReal(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar min,
typename Derived::Scalar max)
1012 template<
typename Derived,
typename Urng>
1013 inline const UniformRealType<Derived, Urng>
1014 uniformRealLike(Derived& o, Urng&& urng,
typename Derived::Scalar min,
typename Derived::Scalar max)
1021 template<
typename Derived,
typename Urng>
1022 using UniformRealVVType = CwiseBinaryOp<
1023 internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
1024 const Derived,
const Derived
1040 template<
typename Lhs,
typename Rhs,
typename Urng>
1041 inline const UniformRealVVType<Lhs, Urng>
1042 uniformReal(Urng&& urng,
const ArrayBase<Lhs>& a,
const ArrayBase<Rhs>& b)
1044 static_assert(std::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value,
"`Lhs::Scalar` must be equal to `Rhs::Scalar`");
1046 static_cast<const Lhs&
>(a),
static_cast<const Rhs&
>(b),
1047 { std::forward<Urng>(urng), UniformRealVGen<typename Lhs::Scalar>{} }
1051 template<
typename Derived,
typename Urng>
1052 using UniformRealVSType = CwiseBinaryOp<
1053 internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
1054 const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>,
const Derived>
1057 template<
typename Lhs,
typename Urng>
1058 inline const UniformRealVSType<Lhs, Urng>
1059 uniformReal(Urng&& urng,
const ArrayBase<Lhs>& a,
typename Lhs::Scalar b)
1062 static_cast<const Lhs&
>(a), { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1063 { std::forward<Urng>(urng), UniformRealVGen<typename Lhs::Scalar>{} }
1068 template<
typename Derived,
typename Urng>
1069 using UniformRealSVType = CwiseBinaryOp<
1070 internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
1071 CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>,
const Derived>,
const Derived
1074 template<
typename Rhs,
typename Urng>
1075 inline const UniformRealSVType<Rhs, Urng>
1076 uniformReal(Urng&& urng,
typename Rhs::Scalar a,
const ArrayBase<Rhs>& b)
1079 { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
static_cast<const Rhs&
>(b),
1080 { std::forward<Urng>(urng), UniformRealVGen<typename Rhs::Scalar>{} }
1084 template<
typename Derived,
typename Urng>
1085 using BernoulliType = CwiseNullaryOp<internal::scalar_rng_adaptor<BernoulliGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
1098 template<
typename Derived,
typename Urng>
1099 inline const BernoulliType<Derived, Urng>
1100 bernoulli(Index rows, Index cols, Urng&& urng,
double p = 0.5)
1117 template<
typename Derived,
typename Urng>
1118 inline const BernoulliType<Derived, Urng>
1126 template<
typename Derived,
typename Urng>
1127 using BernoulliVType = CwiseUnaryOp<
1128 internal::scalar_unary_rng_adaptor<BernoulliVGen<typename Derived::Scalar>,
typename Derived::Scalar,
typename Derived::Scalar, Urng,
true>,
1141 template<
typename Lhs,
typename Urng>
1142 inline const BernoulliVType<Lhs, Urng>
1145 return BernoulliVType<Lhs, Urng>{
1146 static_cast<const Lhs&
>(p), { std::forward<Urng>(urng), BernoulliVGen<typename Lhs::Scalar>{} }
Generator of reals in a range [a, b]
Definition Basic.h:436
Balanced2Gen(_Scalar _a=-1, _Scalar _b=1)
Construct a new balanced generator.
Definition Basic.h:447
Generator of reals in a range [-1, 1]
Definition Basic.h:407
Generator of Bernoulli distribution.
Definition Basic.h:667
Base class of all univariate random generators.
Definition Basic.h:33
const CwiseNullaryOp< internal::scalar_rng_adaptor< DerivedGen &, Scalar, Urng >, const Derived > generate(Index rows, Index cols, Urng &&urng)
generate random values from its distribution
Definition Basic.h:53
const CwiseNullaryOp< internal::scalar_rng_adaptor< DerivedGen &, Scalar, Urng >, const Derived > generateLike(const Derived &o, Urng &&urng)
generate random values from its distribution
Definition Basic.h:72
DerivedGen & derived()
Return a reference to the derived type.
Definition Basic.h:38
Base class of all multivariate random matrix generators.
Definition Basic.h:225
DerivedGen & derived()
Return a reference to the derived type.
Definition Basic.h:230
Index dims() const
returns the dimensions of matrices to be generated
Definition Basic.h:235
Matrix< _Scalar, Dim, -1 > generate(Urng &&urng, Index samples)
generates multiple samples at once
Definition Basic.h:247
Matrix< _Scalar, Dim, Dim > generate(Urng &&urng)
generates one sample
Definition Basic.h:260
Base class of all multivariate random vector generators.
Definition Basic.h:175
DerivedGen & derived()
Return a reference to the derived type.
Definition Basic.h:180
Matrix< _Scalar, Dim, 1 > generate(Urng &&urng)
generates one sample
Definition Basic.h:210
Index dims() const
returns the dimensions of vectors to be generated
Definition Basic.h:185
Matrix< _Scalar, Dim, -1 > generate(Urng &&urng, Index samples)
generates multiple samples at once
Definition Basic.h:197
Generator of random bits for integral scalars.
Definition Basic.h:378
const BalancedType< Derived, Urng > balanced(Index rows, Index cols, Urng &&urng)
generates reals in a range [-1, 1]
Definition Basic.h:796
const RandBitsType< Derived, Urng > randBitsLike(Derived &o, Urng &&urng)
generates integers with random bits
Definition Basic.h:772
const BalancedType< Derived, Urng > balancedLike(const Derived &o, Urng &&urng)
generates reals in a range [-1, 1]
Definition Basic.h:816
const RandBitsType< Derived, Urng > randBits(Index rows, Index cols, Urng &&urng)
generates integers with random bits
Definition Basic.h:752
const StdUniformRealType< Derived, Urng > uniformRealLike(Derived &o, Urng &&urng)
generates reals in a range [0, 1)
Definition Basic.h:968
const StdUniformRealType< Derived, Urng > uniformReal(Index rows, Index cols, Urng &&urng)
generates reals in a range [0, 1)
Definition Basic.h:948
const BernoulliType< Derived, Urng > bernoulli(Index rows, Index cols, Urng &&urng, double p=0.5)
generates 1 with probability p and 0 with probability 1 - p
Definition Basic.h:1100