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