1#ifndef FPMAS_RANDOM_GENERATOR_H
2#define FPMAS_RANDOM_GENERATOR_H
14namespace fpmas {
namespace random {
28 template<
typename Generator_t>
45 return Generator_t::min();
54 return Generator_t::max();
67 template<
typename Generator_t>
78 template<
typename Gen,
class CharT,
class Traits>
80 std::basic_ostream<CharT,Traits>& ost,
const Generator<Gen>& g ) {
95 template<
typename Gen,
class CharT,
class Traits>
96 std::basic_istream<CharT,Traits>&
112 template<
typename Generator_t>
137 this->
gen.seed(seed);
141 this->
gen.discard(z);
151 return this->
gen == g.
gen;
158 return this->
gen != g.
gen;
161 template<
typename Gen,
class CharT,
class Traits>
162 friend std::basic_ostream<CharT,Traits>&
165 template<
typename Gen,
class CharT,
class Traits>
166 friend std::basic_istream<CharT,Traits>&
175 template<
class CharT,
class Traits>
176 std::basic_ostream<CharT, Traits>&
operator<<(
177 std::basic_ostream<CharT,Traits>& ost,
const Generator<std::random_device>&) {
186 template<
class CharT,
class Traits>
187 std::basic_istream<CharT,Traits>&
258 void seed(std::random_device::result_type)
override {
267 template<
typename Gen,
class CharT,
class Traits>
268 friend std::basic_ostream<CharT,Traits>&
271 template<
typename Gen,
class CharT,
class Traits>
272 friend std::basic_istream<CharT,Traits>&
321 template<
typename Generator_t = mt19937_64>
325 Generator_t local_generator;
336 std::vector<std::mt19937::result_type> seed_sequence(size);
339 seed_sequence[0] = seeder();
340 for(
int i = 1; i < size; i++)
341 seed_sequence[i]=seed_sequence[i-1]+1;
342 std::seed_seq gen(seed_sequence.begin(), seed_sequence.end());
344 gen.generate(seed_sequence.begin(), seed_sequence.end());
350 local_generator.seed(local_seed);
368 : comm(&communication::WORLD) {}
391 : comm(&communication::WORLD), seeder(
seed) {}
404 : comm(&comm), seeder(
seed) {}
409 return local_generator();
420 local_generator.discard(z);
430 return Generator_t::min();
439 return Generator_t::max();
452 template<
typename Generator_t>
453 struct adl_serializer<
fpmas::random::Generator<Generator_t>> {
461 template<
typename JsonType>
463 std::stringstream str_buf;
474 template<
typename JsonType>
476 std::stringstream str_buf(j.template get<std::string>());
482namespace fpmas {
namespace io {
namespace datapack {
486 template<
typename Generator_t>
496 template<
typename PackType>
498 const PackType& pack,
500 std::ostringstream str;
502 return pack.size(str.str());
511 template<
typename PackType>
513 std::ostringstream str;
515 pack.template put(str.str());
524 template<
typename PackType>
526 const PackType& pack) {
527 std::istringstream str(pack.template get<std::string>());
Definition: communication.h:251
virtual int getRank() const =0
virtual int getSize() const =0
Definition: generator.h:20
T result_type
Definition: generator.h:25
Definition: generator.h:322
DistributedGenerator(result_type seed)
Definition: generator.h:390
DistributedGenerator()
Definition: generator.h:367
void seed(result_type seed) override
Definition: generator.h:412
void discard(unsigned long long z) override
Definition: generator.h:417
static constexpr result_type min()
Definition: generator.h:429
DistributedGenerator(api::communication::MpiCommunicator &comm)
Definition: generator.h:378
static constexpr result_type max()
Definition: generator.h:438
DistributedGenerator(api::communication::MpiCommunicator &comm, result_type seed)
Definition: generator.h:402
Generator_t::result_type result_type
Definition: generator.h:359
result_type operator()() override
Definition: generator.h:406
Definition: generator.h:200
Generator(Generator< std::random_device > &&)
Definition: generator.h:230
void seed(std::random_device::result_type) override
Definition: generator.h:258
Generator(std::random_device::result_type)
Definition: generator.h:210
Generator< std::random_device > & operator=(const Generator< std::random_device > &)
Definition: generator.h:240
Generator(const Generator< std::random_device > &)
Definition: generator.h:220
void discard(unsigned long long) override
Definition: generator.h:264
Generator()
Definition: generator.h:205
Generator< std::random_device > & operator=(Generator< std::random_device > &&)
Definition: generator.h:251
Definition: generator.h:113
Generator()
Definition: generator.h:125
bool operator!=(const Generator< Generator_t > &g) const
Definition: generator.h:157
bool operator==(const Generator< Generator_t > &g) const
Definition: generator.h:150
void seed(result_type seed) override
Definition: generator.h:136
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &ost, const Generator< Gen > &g)
Definition: generator.h:79
UniformRandomBitGenerator< Generator_t >::result_type result_type
Definition: generator.h:120
Generator(result_type seed)
Definition: generator.h:131
void discard(unsigned long long z) override
Definition: generator.h:140
friend std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &ost, Generator< Gen > &g)
Definition: generator.h:97
Generator< std::minstd_rand > minstd_rand
Definition: generator.h:294
Generator< std::mt19937 > mt19937
Definition: generator.h:282
std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &ost, Generator< Gen > &g)
Definition: generator.h:97
Generator< std::mt19937_64 > mt19937_64
Definition: generator.h:288
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &ost, const Generator< Gen > &g)
Definition: generator.h:79
Generator< std::random_device > random_device
Definition: generator.h:300
static std::size_t size(const PackType &pack, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:497
static void to_datapack(PackType &pack, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:512
static fpmas::random::Generator< Generator_t > from_datapack(const PackType &pack)
Definition: generator.h:525
Definition: datapack.h:55
static void from_json(const JsonType &j, fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:475
static void to_json(JsonType &j, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:462