23#ifndef RANDOM_GENERATORS_H
24#define RANDOM_GENERATORS_H
28#include <initializer_list>
36#include "randutils.hpp"
45class BaseRandomGenerator;
46template <
typename DistributionT >
47class RandomDistribution;
80 virtual unsigned long operator()( std::uniform_int_distribution< unsigned long >& d ) = 0;
81 virtual double operator()( std::uniform_real_distribution<>& d ) = 0;
82 virtual double operator()( std::normal_distribution<>& d ) = 0;
83 virtual double operator()( std::lognormal_distribution<>& d ) = 0;
84 virtual unsigned long operator()( std::binomial_distribution< unsigned long >& d ) = 0;
85 virtual double operator()( std::gamma_distribution<>& d ) = 0;
86 virtual double operator()( std::exponential_distribution<>& d ) = 0;
87 virtual unsigned long operator()( std::discrete_distribution< unsigned long >& d ) = 0;
88 virtual unsigned long operator()( std::poisson_distribution< unsigned long >& d ) = 0;
98 virtual unsigned long operator()( std::uniform_int_distribution< unsigned long >& d,
99 std::uniform_int_distribution< unsigned long >::param_type& p ) = 0;
100 virtual double operator()( std::uniform_real_distribution<>& d, std::uniform_real_distribution<>::param_type& p ) = 0;
101 virtual double operator()( std::normal_distribution<>& d, std::normal_distribution<>::param_type& p ) = 0;
102 virtual double operator()( std::lognormal_distribution<>& d, std::lognormal_distribution<>::param_type& p ) = 0;
103 virtual unsigned long operator()( std::binomial_distribution< unsigned long >& d,
104 std::binomial_distribution< unsigned long >::param_type& p ) = 0;
105 virtual double operator()( std::gamma_distribution<>& d, std::gamma_distribution<>::param_type& p ) = 0;
106 virtual double operator()( std::exponential_distribution<>& d, std::exponential_distribution<>::param_type& p ) = 0;
107 virtual unsigned long operator()( std::discrete_distribution< unsigned long >& d,
108 std::discrete_distribution< unsigned long >::param_type& p ) = 0;
109 virtual unsigned long operator()( std::poisson_distribution< unsigned long >& d,
110 std::poisson_distribution< unsigned long >::param_type& p ) = 0;
122 virtual unsigned long ulrand(
unsigned long N ) = 0;
135 std::back_insert_iterator< std::vector< NodeIDTriple > > dest,
156template <
typename RandomEngineT >
171 randutils::seed_seq_fe128 sseq( seed );
176 operator()( std::uniform_int_distribution< unsigned long >& d )
override
200 operator()( std::binomial_distribution< unsigned long >& d )
override
218 operator()( std::discrete_distribution< unsigned long >& d )
override
224 operator()( std::poisson_distribution< unsigned long >& d )
override
230 operator()( std::uniform_int_distribution< unsigned long >& d,
231 std::uniform_int_distribution< unsigned long >::param_type& p )
override
237 operator()( std::uniform_real_distribution<>& d, std::uniform_real_distribution<>::param_type& p )
override
243 operator()( std::normal_distribution<>& d, std::normal_distribution<>::param_type& p )
override
249 operator()( std::lognormal_distribution<>& d, std::lognormal_distribution<>::param_type& p )
override
256 std::binomial_distribution< unsigned long >::param_type& p )
override
262 operator()( std::gamma_distribution<>& d, std::gamma_distribution<>::param_type& p )
override
268 operator()( std::exponential_distribution<>& d, std::exponential_distribution<>::param_type& p )
override
275 std::discrete_distribution< unsigned long >::param_type& p )
override
282 std::poisson_distribution< unsigned long >::param_type& p )
override
296 std::uniform_int_distribution< unsigned long >::param_type param( 0, N - 1 );
303 std::back_insert_iterator< std::vector< NodeIDTriple > > dest,
306 std::sample( first, last, dest, n,
rng_ );
312 const size_t num_elems = std::min( n, data.size() );
317 for (
size_t next = 0, remaining = data.size(); next < num_elems; ++next, --remaining )
319 const size_t rnd = next +
ulrand( remaining );
320 std::swap( data[ next ], data[ rnd ] );
322 data.resize( num_elems );
344 virtual RngPtr create( std::initializer_list< std::uint32_t > seed_initializer )
const = 0;
350template <
typename RandomEngineT >
355 create( std::initializer_list< std::uint32_t > seed_initializer )
const override
368template <
typename DistributionT >
392 static_assert( std::is_same< result_type, unsigned long >::value or std::is_same< result_type, double >::value,
393 "result_type of the distribution must be unsigned long or double" );
409 static_assert( std::is_same< result_type, unsigned long >::value or std::is_same< result_type, double >::value,
410 "result_type of the distribution must be unsigned long or double" );
Base class for random generator factory.
Definition random_generators.h:335
virtual ~BaseRandomGeneratorFactory()
Definition random_generators.h:337
virtual RngPtr create(std::initializer_list< std::uint32_t > seed_initializer) const =0
Clones the RNG wrapper and sets the state of the cloned RNG engine.
Base class for RNG engine wrappers.
Definition random_generators.h:67
virtual ~BaseRandomGenerator()
Definition random_generators.h:69
virtual unsigned long operator()(std::uniform_int_distribution< unsigned long > &d, std::uniform_int_distribution< unsigned long >::param_type &p)=0
Calls the provided distribution with the wrapped RNG engine, using provided distribution parameters.
virtual unsigned long operator()(std::binomial_distribution< unsigned long > &d, std::binomial_distribution< unsigned long >::param_type &p)=0
virtual unsigned long operator()(std::binomial_distribution< unsigned long > &d)=0
virtual double operator()(std::gamma_distribution<> &d)=0
virtual double operator()(std::uniform_real_distribution<> &d)=0
virtual double operator()(std::gamma_distribution<> &d, std::gamma_distribution<>::param_type &p)=0
virtual void stable_sample(NodeCollection::const_iterator first, NodeCollection::const_iterator last, std::back_insert_iterator< std::vector< NodeIDTriple > > dest, size_t n)=0
Wrap std::sample for selection from NodeCollection.
virtual double operator()(std::lognormal_distribution<> &d, std::lognormal_distribution<>::param_type &p)=0
virtual unsigned long ulrand(unsigned long N)=0
Uses the wrapped RNG engine to draw an unsigned long from a uniform distribution in the range [0,...
virtual unsigned long operator()(std::uniform_int_distribution< unsigned long > &d)=0
Calls the provided distribution with the wrapped RNG engine.
virtual void partial_shuffle(std::vector< size_t > &data, const size_t n)=0
Select randomly shuffled elements from vector.
virtual unsigned long operator()(std::discrete_distribution< unsigned long > &d)=0
virtual double operator()(std::exponential_distribution<> &d)=0
virtual unsigned long operator()(std::poisson_distribution< unsigned long > &d, std::poisson_distribution< unsigned long >::param_type &p)=0
virtual double operator()(std::exponential_distribution<> &d, std::exponential_distribution<>::param_type &p)=0
virtual double operator()(std::normal_distribution<> &d, std::normal_distribution<>::param_type &p)=0
virtual unsigned long operator()(std::discrete_distribution< unsigned long > &d, std::discrete_distribution< unsigned long >::param_type &p)=0
virtual unsigned long operator()(std::poisson_distribution< unsigned long > &d)=0
virtual double drand()=0
Uses the wrapped RNG engine to draw a double from a uniform distribution in the range [0,...
virtual double operator()(std::normal_distribution<> &d)=0
virtual double operator()(std::lognormal_distribution<> &d)=0
virtual double operator()(std::uniform_real_distribution<> &d, std::uniform_real_distribution<>::param_type &p)=0
Wrapper for distributions.
Definition random_generators.h:370
result_type min() const
Returns the minimum value potentially generated by the distribution.
Definition random_generators.h:429
result_type operator()(RngPtr g)
Generating function.
Definition random_generators.h:390
~RandomDistribution()=default
RandomDistribution()=default
Constructs a distribution object with its default parameters.
typename DistributionT::param_type param_type
Definition random_generators.h:373
result_type operator()(RngPtr g, param_type ¶ms)
Generating function.
Definition random_generators.h:407
result_type max() const
Returns the maximum value potentially generated by the distribution.
Definition random_generators.h:438
DistributionT distribution_
Wrapped RandomDistribution.
Definition random_generators.h:444
void param(const param_type ¶ms)
Sets the distribution's associated parameter set to params.
Definition random_generators.h:420
typename DistributionT::result_type result_type
Definition random_generators.h:372
Definition random_generators.h:352
RngPtr create(std::initializer_list< std::uint32_t > seed_initializer) const override
Clones the RNG wrapper and sets the state of the cloned RNG engine.
Definition random_generators.h:355
Wrapper for RNG engines.
Definition random_generators.h:158
RandomGenerator(std::initializer_list< std::uint32_t > seed)
Definition random_generators.h:165
std::uniform_int_distribution< unsigned long > uniform_ulong_dist_
Definition random_generators.h:327
double operator()(std::uniform_real_distribution<> &d, std::uniform_real_distribution<>::param_type &p) override
Definition random_generators.h:237
typename RandomEngineT::result_type result_type
Definition random_generators.h:160
double operator()(std::normal_distribution<> &d, std::normal_distribution<>::param_type &p) override
Definition random_generators.h:243
unsigned long operator()(std::uniform_int_distribution< unsigned long > &d, std::uniform_int_distribution< unsigned long >::param_type &p) override
Calls the provided distribution with the wrapped RNG engine, using provided distribution parameters.
Definition random_generators.h:230
double operator()(std::uniform_real_distribution<> &d) override
Definition random_generators.h:182
RandomEngineT rng_
Wrapped RNG engine.
Definition random_generators.h:326
unsigned long ulrand(unsigned long N) override
Uses the wrapped RNG engine to draw an unsigned long from a uniform distribution in the range [0,...
Definition random_generators.h:294
double operator()(std::normal_distribution<> &d) override
Definition random_generators.h:188
double operator()(std::gamma_distribution<> &d) override
Definition random_generators.h:206
double operator()(std::gamma_distribution<> &d, std::gamma_distribution<>::param_type &p) override
Definition random_generators.h:262
unsigned long operator()(std::binomial_distribution< unsigned long > &d) override
Definition random_generators.h:200
double operator()(std::lognormal_distribution<> &d) override
Definition random_generators.h:194
double operator()(std::lognormal_distribution<> &d, std::lognormal_distribution<>::param_type &p) override
Definition random_generators.h:249
void partial_shuffle(std::vector< size_t > &data, const size_t n) override
Select randomly shuffled elements from vector.
Definition random_generators.h:310
void stable_sample(NodeCollection::const_iterator first, NodeCollection::const_iterator last, std::back_insert_iterator< std::vector< NodeIDTriple > > dest, size_t n) override
Wrap std::sample for selection from NodeCollection.
Definition random_generators.h:301
double drand() override
Uses the wrapped RNG engine to draw a double from a uniform distribution in the range [0,...
Definition random_generators.h:288
unsigned long operator()(std::binomial_distribution< unsigned long > &d, std::binomial_distribution< unsigned long >::param_type &p) override
Definition random_generators.h:255
unsigned long operator()(std::discrete_distribution< unsigned long > &d) override
Definition random_generators.h:218
unsigned long operator()(std::uniform_int_distribution< unsigned long > &d) override
Calls the provided distribution with the wrapped RNG engine.
Definition random_generators.h:176
std::uniform_real_distribution uniform_double_dist_0_1_
Definition random_generators.h:328
unsigned long operator()(std::poisson_distribution< unsigned long > &d, std::poisson_distribution< unsigned long >::param_type &p) override
Definition random_generators.h:281
double operator()(std::exponential_distribution<> &d) override
Definition random_generators.h:212
unsigned long operator()(std::discrete_distribution< unsigned long > &d, std::discrete_distribution< unsigned long >::param_type &p) override
Definition random_generators.h:274
unsigned long operator()(std::poisson_distribution< unsigned long > &d) override
Definition random_generators.h:224
RandomGenerator(const RandomEngineT &rng)=delete
double operator()(std::exponential_distribution<> &d, std::exponential_distribution<>::param_type &p) override
Definition random_generators.h:268
Iterator for NodeCollections.
Definition node_collection.h:415
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33