/** * @file Basic.h * @author bab2min (bab2min@gmail.com) * @brief * @version 0.2.0 * @date 2020-06-22 * * @copyright Copyright (c) 2020 * */ #ifndef EIGENRAND_DISTS_BASIC_H #define EIGENRAND_DISTS_BASIC_H namespace Eigen { namespace internal { namespace constant { static constexpr double pi = 3.1415926535897932; static constexpr double e = 2.7182818284590452; } template struct scalar_randbits_op : public scalar_base_rng { static_assert(std::is_integral::value, "randBits needs integral types."); using scalar_base_rng::scalar_base_rng; EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const { return pfirst(this->rng()); } template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const { using RUtils = RawbitsMaker; return RUtils{}.rawbits(this->rng); } }; template struct functor_traits > { enum { Cost = HugeCost, PacketAccess = packet_traits::Vectorizable, IsRepeatable = false }; }; template struct scalar_uniform_real_op : public scalar_base_rng { static_assert(std::is_floating_point::value, "uniformReal needs floating point types."); using scalar_base_rng::scalar_base_rng; EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const { return bit_scalar{}.to_ur(pfirst(this->rng())); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar nzur_scalar() const { return bit_scalar{}.to_nzur(pfirst(this->rng())); } template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const { using RUtils = RandUtils; return RUtils{}.uniform_real(this->rng); } }; template struct functor_traits > { enum { Cost = HugeCost, PacketAccess = packet_traits::Vectorizable, IsRepeatable = false }; }; template struct scalar_balanced_op : public scalar_base_rng { static_assert(std::is_floating_point::value, "balanced needs floating point types."); using scalar_base_rng::scalar_base_rng; EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const { return ((Scalar)((int32_t)pfirst(this->rng()) & 0x7FFFFFFF) / 0x7FFFFFFF) * 2 - 1; } template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const { using RUtils = RandUtils; return RUtils{}.balanced(this->rng); } }; template struct functor_traits > { enum { Cost = HugeCost, PacketAccess = packet_traits::Vectorizable, IsRepeatable = false }; }; } } #endif