12 #ifndef EIGENRAND_RAND_UTILS_H
13 #define EIGENRAND_RAND_UTILS_H
23 template<
typename Packet,
typename Rng,
24 typename RngResult =
typename std::remove_reference<Rng>::type::result_type,
25 Rand::RandomEngineType reType = Rand::GetRandomEngineType<
26 typename std::remove_reference<Rng>::type
30 template<
typename PacketType,
typename Rng>
31 struct UniformRealUtils;
33 template<
typename PacketType,
typename Rng>
34 struct RandUtils :
public UniformRealUtils<PacketType, Rng>
36 EIGEN_STRONG_INLINE PacketType
balanced(Rng& rng)
38 return psub(pmul(this->zero_to_one(rng), pset1<PacketType>(2)), pset1<PacketType>(1));
41 template<
typename Scalar>
42 EIGEN_STRONG_INLINE PacketType
balanced(Rng& rng, Scalar slope, Scalar bias)
44 return padd(pmul(this->zero_to_one(rng), pset1<PacketType>(slope)), pset1<PacketType>(bias));
47 EIGEN_STRONG_INLINE PacketType nonzero_uniform_real(Rng& rng)
49 constexpr
auto epsilon = std::numeric_limits<typename unpacket_traits<PacketType>::type>::epsilon() / 8;
50 return padd(this->uniform_real(rng), pset1<PacketType>(epsilon));
54 template<
typename Gen,
typename _Scalar,
typename Rng,
bool _mutable = false>
55 struct scalar_rng_adaptor
58 Rand::IsScalarRandomEngine<
59 typename std::remove_reference<Rng>::type
61 Rand::IsPacketRandomEngine<
62 typename std::remove_reference<Rng>::type
64 "Rng must satisfy RandomNumberEngine"
70 scalar_rng_adaptor(
const Rng& _rng) : rng{ _rng }
74 template<
typename _Gen>
75 scalar_rng_adaptor(
const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
79 scalar_rng_adaptor(
const scalar_rng_adaptor& o) =
default;
80 scalar_rng_adaptor(scalar_rng_adaptor&& o) =
default;
82 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const _Scalar operator() ()
const
87 template<
typename Packet>
88 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp()
const
90 return gen.template packetOp<Packet>(rng);
94 template<
typename Gen,
typename _Scalar,
typename Rng>
95 struct scalar_rng_adaptor<Gen, _Scalar, Rng, true>
98 Rand::IsScalarRandomEngine<
99 typename std::remove_reference<Rng>::type
101 Rand::IsPacketRandomEngine<
102 typename std::remove_reference<Rng>::type
104 "Rng must satisfy RandomNumberEngine"
110 scalar_rng_adaptor(
const Rng& _rng) : rng{ _rng }
114 template<
typename _Gen>
115 scalar_rng_adaptor(
const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
119 scalar_rng_adaptor(
const scalar_rng_adaptor& o) =
default;
120 scalar_rng_adaptor(scalar_rng_adaptor&& o) =
default;
122 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const _Scalar operator() ()
const
127 template<
typename Packet>
128 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp()
const
130 return gen.template packetOp<Packet>(rng);
134 template<
typename Gen,
typename _Scalar,
typename Urng,
bool _mutable>
135 struct functor_traits<scalar_rng_adaptor<Gen, _Scalar, Urng, _mutable> >
137 enum { Cost = HugeCost, PacketAccess = packet_traits<_Scalar>::Vectorizable, IsRepeatable =
false };
143 #ifdef EIGEN_VECTORIZE_AVX
147 #ifdef EIGEN_VECTORIZE_SSE2
151 #ifdef EIGEN_VECTORIZE_NEON
160 EIGEN_STRONG_INLINE uint32_t collect_upper8bits(uint32_t a, uint32_t b, uint32_t c)
162 return ((a & 0xFF000000) >> 24) | ((b & 0xFF000000) >> 16) | ((c & 0xFF000000) >> 8);
167 #if defined(DEBUG) || defined(_DEBUG)
168 #define EIGENRAND_CHECK_INFINITY_LOOP() do { assert(_i < 100); } while(0)
170 #define EIGENRAND_CHECK_INFINITY_LOOP()
const BalancedType< Derived, Urng > balanced(Index rows, Index cols, Urng &&urng)
generates reals in a range [-1, 1]
Definition: Basic.h:550