33 #if !(defined TRNG_UNIFORM01_DIST_HPP)
35 #define TRNG_UNIFORM01_DIST_HPP
37 #include <trng/cuda.hpp>
38 #include <trng/limits.hpp>
39 #include <trng/utility.hpp>
48 template<
typename float_t =
double>
51 using result_type = float_t;
69 template<
typename char_t,
typename traits_t>
70 friend std::basic_ostream<char_t, traits_t> &operator<<(
71 std::basic_ostream<char_t, traits_t> &out,
const param_type &) {
72 std::ios_base::fmtflags flags(out.flags());
73 out.flags(std::ios_base::dec | std::ios_base::fixed | std::ios_base::left);
79 template<
typename char_t,
typename traits_t>
80 friend std::basic_istream<char_t, traits_t> &operator>>(
81 std::basic_istream<char_t, traits_t> &in,
param_type &) {
82 std::ios_base::fmtflags flags(in.flags());
83 in.flags(std::ios_base::dec | std::ios_base::fixed | std::ios_base::left);
84 in >> utility::delim(
'(') >> utility::delim(
')');
103 TRNG_CUDA_ENABLE result_type operator()(R &r) {
104 return utility::uniformco<result_type>(r);
107 TRNG_CUDA_ENABLE result_type operator()(R &r,
const param_type &) {
108 return utility::uniformco<result_type>(r);
113 result_type min()
const {
return 0; }
115 result_type max()
const {
return 1; }
117 param_type param()
const {
return p; }
119 void param(
const param_type &) {}
122 result_type pdf(result_type x)
const {
129 result_type cdf(result_type x)
const {
138 result_type icdf(result_type x)
const {
139 if (x < 0 or x > 1) {
140 #if !(defined TRNG_CUDA)
143 return math::numeric_limits<result_type>::quiet_NaN();
152 template<
typename float_t>
153 TRNG_CUDA_ENABLE
inline bool operator==(
const uniform01_dist<float_t> &g1,
154 const uniform01_dist<float_t> &g2) {
155 return g1.param() == g2.param();
158 template<
typename float_t>
159 TRNG_CUDA_ENABLE
inline bool operator!=(
const uniform01_dist<float_t> &g1,
160 const uniform01_dist<float_t> &g2) {
161 return g1.param() != g2.param();
165 template<
typename char_t,
typename traits_t,
typename float_t>
166 std::basic_ostream<char_t, traits_t> &operator<<(std::basic_ostream<char_t, traits_t> &out,
167 const uniform01_dist<float_t> &g) {
168 std::ios_base::fmtflags flags(out.flags());
169 out.flags(std::ios_base::dec | std::ios_base::fixed | std::ios_base::left);
170 out <<
"[uniform01 " << g.param() <<
']';
175 template<
typename char_t,
typename traits_t,
typename float_t>
176 std::basic_istream<char_t, traits_t> &operator>>(std::basic_istream<char_t, traits_t> &in,
177 uniform01_dist<float_t> &g) {
178 typename uniform01_dist<float_t>::param_type P;
179 std::ios_base::fmtflags flags(in.flags());
180 in.flags(std::ios_base::dec | std::ios_base::fixed | std::ios_base::left);
181 in >> utility::ignore_spaces() >> utility::delim(
"[uniform01 ") >> P >> utility::delim(
']');