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>
46 template<
typename Derived,
typename Urng>
47 inline const CwiseNullaryOp<internal::scalar_rng_adaptor<DerivedGen&, Scalar, Urng>,
const Derived>
51 rows, cols, { std::forward<Urng>(urng),
static_cast<DerivedGen&
>(*this) }
65 template<
typename Derived,
typename Urng>
66 inline const CwiseNullaryOp<internal::scalar_rng_adaptor<DerivedGen&, Scalar, Urng>,
const Derived>
70 o.rows(), o.cols(), { std::forward<Urng>(urng),
static_cast<DerivedGen&
>(*this) }
82 template<
typename DerivedGen,
typename _Scalar, Index Dim>
89 Index
dims()
const {
return static_cast<DerivedGen&
>(*this).dims(); }
100 template<
typename Urng>
101 inline Matrix<_Scalar, Dim, -1>
generate(Urng&& urng, Index samples)
103 return static_cast<DerivedGen&
>(*this).generatr(std::forward<Urng>(urng), samples);
113 template<
typename Urng>
114 inline Matrix<_Scalar, Dim, 1>
generate(Urng&& urng)
116 return static_cast<DerivedGen&
>(*this).generatr(std::forward<Urng>(urng));
127 template<
typename DerivedGen,
typename _Scalar, Index Dim>
134 Index
dims()
const {
return static_cast<DerivedGen&
>(*this).dims(); }
145 template<
typename Urng>
146 inline Matrix<_Scalar, Dim, -1>
generate(Urng&& urng, Index samples)
148 return static_cast<DerivedGen&
>(*this).generate(std::forward<Urng>(urng), samples);
158 template<
typename Urng>
159 inline Matrix<_Scalar, Dim, Dim>
generate(Urng&& urng)
161 return static_cast<DerivedGen&
>(*this).generate(std::forward<Urng>(urng));
165 template<Index _alignment=0>
169 enum { max_size =
sizeof(internal::find_best_packet<float, -1>::type) };
170 int8_t raw_data[max_size + _alignment - 1] = { 0, };
176 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
179 CacheStore(
const CacheStore& c)
181 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
182 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
185 CacheStore(CacheStore&& c)
187 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
188 aligned_ptr = (
void*)((((
size_t)raw_data + _alignment - 1) / _alignment) * _alignment);
191 template<
typename Ty>
194 return *(Ty*)aligned_ptr;
197 template<
typename Ty>
198 const Ty& get()
const
200 return *(
const Ty*)aligned_ptr;
208 enum { max_size =
sizeof(internal::find_best_packet<float, -1>::type) };
209 int8_t raw_data[max_size] = { 0, };
216 CacheStore(
const CacheStore& c)
218 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
221 CacheStore(CacheStore&& c)
223 std::copy(c.raw_data, c.raw_data + max_size, raw_data);
226 template<
typename Ty>
229 return *(Ty*)raw_data;
232 template<
typename Ty>
233 const Ty& get()
const
235 return *(
const Ty*)raw_data;
239 using OptCacheStore = CacheStore<EIGEN_MAX_ALIGN_BYTES>;
246 template<
typename _Scalar>
249 static_assert(std::is_integral<_Scalar>::value,
"randBits needs integral types.");
252 using Scalar = _Scalar;
254 template<
typename Rng>
255 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
257 using namespace Eigen::internal;
258 return pfirst(std::forward<Rng>(rng)());
261 template<
typename Packet,
typename Rng>
262 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
264 using namespace Eigen::internal;
265 using RUtils = RawbitsMaker<Packet, Rng>;
266 return RUtils{}.rawbits(std::forward<Rng>(rng));
275 template<
typename _Scalar>
278 static_assert(std::is_floating_point<_Scalar>::value,
"balanced needs floating point types.");
281 using Scalar = _Scalar;
283 template<
typename Rng>
284 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
286 using namespace Eigen::internal;
287 return ((_Scalar)((int32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) / 0x7FFFFFFF) * 2 - 1;
290 template<
typename Packet,
typename Rng>
291 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
293 using namespace Eigen::internal;
294 using RUtils = RandUtils<Packet, Rng>;
295 return RUtils{}.balanced(std::forward<Rng>(rng));
304 template<
typename _Scalar>
307 static_assert(std::is_floating_point<_Scalar>::value,
"uniformReal needs floating point types.");
310 using Scalar = _Scalar;
312 template<
typename Rng>
313 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
315 using namespace Eigen::internal;
316 return bit_scalar<_Scalar>{}.to_ur(pfirst(std::forward<Rng>(rng)()));
319 template<
typename Rng>
320 EIGEN_STRONG_INLINE
const _Scalar nzur_scalar(Rng&& rng)
322 using namespace Eigen::internal;
323 return bit_scalar<_Scalar>{}.to_nzur(pfirst(std::forward<Rng>(rng)()));
326 template<
typename Packet,
typename Rng>
327 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
329 using namespace Eigen::internal;
330 using RUtils = RandUtils<Packet, Rng>;
331 return RUtils{}.uniform_real(std::forward<Rng>(rng));
341 template<
typename _Scalar>
346 using Scalar = _Scalar;
350 eigen_assert(0 <= _p && _p <= 1 );
351 p = (uint32_t)(_p * 0x80000000);
360 template<
typename Rng>
361 EIGEN_STRONG_INLINE
const _Scalar operator() (Rng&& rng)
363 using namespace Eigen::internal;
364 return (((uint32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) < p) ? 1 : 0;
367 template<
typename Packet,
typename Rng>
368 EIGEN_STRONG_INLINE
const Packet packetOp(Rng&& rng)
370 using namespace Eigen::internal;
371 using IPacket = decltype(reinterpret_to_int(std::declval<Packet>()));
372 using RUtils = RawbitsMaker<IPacket, Rng>;
373 auto one = pset1<Packet>(1);
374 auto zero = pset1<Packet>(0);
375 auto r = RUtils{}.rawbits(std::forward<Rng>(rng));
376 r = pand(r, pset1<IPacket>(0x7FFFFFFF));
377 return pblendv(pcmplt(r, pset1<IPacket>(p)), one, zero);
382 template<
typename Derived,
typename Urng>
383 using RandBitsType = CwiseNullaryOp<internal::scalar_rng_adaptor<RandbitsGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
397 template<
typename Derived,
typename Urng>
398 inline const RandBitsType<Derived, Urng>
402 rows, cols, { std::forward<Urng>(urng) }
417 template<
typename Derived,
typename Urng>
418 inline const RandBitsType<Derived, Urng>
422 o.rows(), o.cols(), { std::forward<Urng>(urng) }
426 template<
typename Derived,
typename Urng>
427 using BalancedType = CwiseNullaryOp<internal::scalar_rng_adaptor<BalancedGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
441 template<
typename Derived,
typename Urng>
442 inline const BalancedType<Derived, Urng>
446 rows, cols, { std::forward<Urng>(urng) }
461 template<
typename Derived,
typename Urng>
462 inline const BalancedType<Derived, Urng>
466 o.rows(), o.cols(), { std::forward<Urng>(urng) }
470 template<
typename Derived,
typename Urng>
471 using UniformRealType = CwiseNullaryOp<internal::scalar_rng_adaptor<UniformRealGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
485 template<
typename Derived,
typename Urng>
486 inline const UniformRealType<Derived, Urng>
490 rows, cols, { std::forward<Urng>(urng) }
505 template<
typename Derived,
typename Urng>
506 inline const UniformRealType<Derived, Urng>
510 o.rows(), o.cols(), { std::forward<Urng>(urng) }
514 template<
typename Derived,
typename Urng>
515 using BernoulliType = CwiseNullaryOp<internal::scalar_rng_adaptor<BernoulliGen<typename Derived::Scalar>,
typename Derived::Scalar, Urng,
true>,
const Derived>;
528 template<
typename Derived,
typename Urng>
529 inline const BernoulliType<Derived, Urng>
530 bernoulli(Index rows, Index cols, Urng&& urng,
double p = 0.5)
547 template<
typename Derived,
typename Urng>
548 inline const BernoulliType<Derived, Urng>
Generator of reals in a range [-1, 1]
Definition: Basic.h:277
Generator of Bernoulli distribution.
Definition: Basic.h:343
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:48
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:67
Base class of all multivariate random matrix generators.
Definition: Basic.h:129
Matrix< _Scalar, Dim, -1 > generate(Urng &&urng, Index samples)
generates multiple samples at once
Definition: Basic.h:146
Matrix< _Scalar, Dim, Dim > generate(Urng &&urng)
generates one sample
Definition: Basic.h:159
Index dims() const
returns the dimensions of matrices to be generated
Definition: Basic.h:134
Base class of all multivariate random vector generators.
Definition: Basic.h:84
Matrix< _Scalar, Dim, -1 > generate(Urng &&urng, Index samples)
generates multiple samples at once
Definition: Basic.h:101
Index dims() const
returns the dimensions of vectors to be generated
Definition: Basic.h:89
Matrix< _Scalar, Dim, 1 > generate(Urng &&urng)
generates one sample
Definition: Basic.h:114
Generator of random bits for integral scalars.
Definition: Basic.h:248
const RandBitsType< Derived, Urng > randBits(Index rows, Index cols, Urng &&urng)
generates integers with random bits
Definition: Basic.h:399
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:530
const BalancedType< Derived, Urng > balanced(Index rows, Index cols, Urng &&urng)
generates reals in a range [-1, 1]
Definition: Basic.h:443
const UniformRealType< Derived, Urng > uniformReal(Index rows, Index cols, Urng &&urng)
generates reals in a range [0, 1)
Definition: Basic.h:487
const UniformRealType< Derived, Urng > uniformRealLike(Derived &o, Urng &&urng)
generates reals in a range [0, 1)
Definition: Basic.h:507
const BalancedType< Derived, Urng > balancedLike(const Derived &o, Urng &&urng)
generates reals in a range [-1, 1]
Definition: Basic.h:463
const RandBitsType< Derived, Urng > randBitsLike(Derived &o, Urng &&urng)
generates integers with random bits
Definition: Basic.h:419