1 #ifndef PYTHONIC_NUMPY_RANDOM_LOGISTIC_HPP 2 #define PYTHONIC_NUMPY_RANDOM_LOGISTIC_HPP 3 4 #include "pythonic/include/numpy/random/logistic.hpp" 5 #include "pythonic/include/numpy/random/generator.hpp" 6 7 #include "pythonic/types/ndarray.hpp" 8 #include "pythonic/types/NoneType.hpp" 9 #include "pythonic/types/tuple.hpp" 10 #include "pythonic/utils/functor.hpp" 11 12 #include <random> 13 #include <algorithm> 14 15 PYTHONIC_NS_BEGIN 16 namespace numpy 17 { 18 namespace random 19 { 20 21 template <class pS> logistic(double loc,double scale,pS const & shape)22 types::ndarray<double, pS> logistic(double loc, double scale, 23 pS const &shape) 24 { 25 types::ndarray<double, pS> result{shape, types::none_type()}; 26 std::generate(result.fbegin(), result.fend(), 27 [&]() { return logistic(loc, scale); }); 28 return result; 29 } 30 logistic(double loc,double scale,long size)31 auto logistic(double loc, double scale, long size) 32 -> decltype(logistic(loc, scale, types::array<long, 1>{{size}})) 33 { 34 return logistic(loc, scale, types::array<long, 1>{{size}}); 35 } 36 logistic(double loc,double scale,types::none_type d)37 double logistic(double loc, double scale, types::none_type d) 38 { 39 double U = 40 std::uniform_real_distribution<double>{0., 1.}(details::generator); 41 if (U > 0.0) { 42 return loc + scale * xsimd::log(U / (1 - U)); 43 } 44 return logistic(loc, scale); 45 } 46 } 47 } 48 PYTHONIC_NS_END 49 50 #endif 51