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