fpmas 1.5
generator.h
Go to the documentation of this file.
1#ifndef FPMAS_RANDOM_GENERATOR_H
2#define FPMAS_RANDOM_GENERATOR_H
3
8#include <cstdint>
9#include <random>
10#include <sstream>
13
14namespace fpmas { namespace random {
15
16
17#ifndef DOXYGEN_BUILD
18 template<typename> class DistributedGenerator;
19#endif
20
28 template<typename Generator_t>
29 class UniformRandomBitGenerator: public api::random::Generator<typename Generator_t::result_type> {
30 protected:
34 Generator_t gen;
35
36 public:
38
44 static constexpr result_type min() {
45 return Generator_t::min();
46 }
47
53 static constexpr result_type max() {
54 return Generator_t::max();
55 }
56
63 return gen();
64 }
65 };
66
67 template<typename Generator_t>
68 class Generator;
69
78 template<typename Gen, class CharT, class Traits>
79 std::basic_ostream<CharT, Traits>& operator<<(
80 std::basic_ostream<CharT,Traits>& ost, const Generator<Gen>& g ) {
81 return ost << g.gen;
82 }
83
95 template<typename Gen, class CharT, class Traits>
96 std::basic_istream<CharT,Traits>&
97 operator>>(std::basic_istream<CharT,Traits>& ost, Generator<Gen>& g ) {
98 return ost >> g.gen;
99 }
100
112 template<typename Generator_t>
113 class Generator : public UniformRandomBitGenerator<Generator_t> {
114
115 public:
121
132 this->seed(seed);
133 }
134
135
136 void seed(result_type seed) override {
137 this->gen.seed(seed);
138 }
139
140 void discard(unsigned long long z) override {
141 this->gen.discard(z);
142 }
143
150 bool operator==(const Generator<Generator_t>& g) const {
151 return this->gen == g.gen;
152 };
153
157 bool operator!=(const Generator<Generator_t>& g) const {
158 return this->gen != g.gen;
159 };
160
161 template<typename Gen, class CharT, class Traits>
162 friend std::basic_ostream<CharT,Traits>&
163 operator<<(std::basic_ostream<CharT,Traits>& ost, const Generator<Gen>& g );
164
165 template<typename Gen, class CharT, class Traits>
166 friend std::basic_istream<CharT,Traits>&
167 operator>>(std::basic_istream<CharT,Traits>& ost, Generator<Gen>& g );
168 };
169
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>&) {
178 return ost;
179 }
180
186 template<class CharT, class Traits>
187 std::basic_istream<CharT,Traits>&
188 operator>>(std::basic_istream<CharT,Traits>& ost, Generator<std::random_device>& g ) {
189 return ost;
190 }
191
199 template<>
200 class Generator<std::random_device> : public UniformRandomBitGenerator<std::random_device> {
201 public:
206 }
210 Generator(std::random_device::result_type) {
211 }
212
221 }
222
231 }
232
241 return *this;
242 }
243
252 return *this;
253 }
254
258 void seed(std::random_device::result_type) override {
259 }
260
264 void discard(unsigned long long) override {
265 }
266
267 template<typename Gen, class CharT, class Traits>
268 friend std::basic_ostream<CharT,Traits>&
269 operator<<(std::basic_ostream<CharT,Traits>& ost, const Generator<Gen>& g );
270
271 template<typename Gen, class CharT, class Traits>
272 friend std::basic_istream<CharT,Traits>&
273 operator>>(std::basic_istream<CharT,Traits>& ost, Generator<Gen>& g );
274
275 };
276
301
321 template<typename Generator_t = mt19937_64>
322 class DistributedGenerator : public api::random::Generator<typename Generator_t::result_type> {
323 private:
324 Generator_t local_generator;
325 std::mt19937 seeder;
326
327 bool _init = false;
332 void init() {
333 int rank = communication::WORLD.getRank();
334 // Generates a different seed on each process
335 result_type local_seed = seeder() + rank;
336 // Seeds the local generator with the generated seed
337 local_generator.seed(local_seed);
338 _init = true;
339 }
340
341 public:
345 typedef typename Generator_t::result_type result_type;
346
367 : seeder(seed) {}
368
370 if(!_init)
371 init();
372 return local_generator();
373 }
374
375 void seed(result_type seed) override {
376 seeder.seed(seed);
377 init();
378 }
379
380 void discard(unsigned long long z) override {
381 if(!_init)
382 init();
383 local_generator.discard(z);
384 }
385
386
392 static constexpr result_type min() {
393 return Generator_t::min();
394 }
395
401 static constexpr result_type max() {
402 return Generator_t::max();
403 }
404 };
405
406 template<>
408 };
409}}
410
411namespace nlohmann {
415 template<typename Generator_t>
416 struct adl_serializer<fpmas::random::Generator<Generator_t>> {
417
424 template<typename JsonType>
425 static void to_json(JsonType& j, const fpmas::random::Generator<Generator_t>& gen) {
426 std::stringstream str_buf;
427 str_buf << gen;
428 j = str_buf.str();
429 }
430
437 template<typename JsonType>
438 static void from_json(const JsonType& j, fpmas::random::Generator<Generator_t>& gen) {
439 std::stringstream str_buf(j.template get<std::string>());
440 str_buf >> gen;
441 }
442 };
443}
444
445namespace fpmas { namespace io { namespace datapack {
449 template<typename Generator_t>
450 struct Serializer<fpmas::random::Generator<Generator_t>> {
459 template<typename PackType>
460 static std::size_t size(
461 const PackType& pack,
463 std::ostringstream str;
464 str << gen;
465 return pack.size(str.str());
466 }
467
474 template<typename PackType>
475 static void to_datapack(PackType& pack, const fpmas::random::Generator<Generator_t>& gen) {
476 std::ostringstream str;
477 str<<gen;
478 pack.template put(str.str());
479 }
480
487 template<typename PackType>
489 const PackType& pack) {
490 std::istringstream str(pack.template get<std::string>());
492 str>>gen;
493 return gen;
494 }
495 };
496}}}
497#endif
Definition: generator.h:20
T result_type
Definition: generator.h:25
int getRank() const override
Definition: communication.cpp:31
Definition: generator.h:322
DistributedGenerator(result_type seed)
Definition: generator.h:366
DistributedGenerator()
Definition: generator.h:351
void seed(result_type seed) override
Definition: generator.h:375
void discard(unsigned long long z) override
Definition: generator.h:380
static constexpr result_type min()
Definition: generator.h:392
static constexpr result_type max()
Definition: generator.h:401
Generator_t::result_type result_type
Definition: generator.h:345
result_type operator()() override
Definition: generator.h:369
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
static constexpr result_type max()
Definition: generator.h:53
Generator_t gen
Definition: generator.h:34
result_type operator()() override
Definition: generator.h:62
static constexpr result_type min()
Definition: generator.h:44
MpiCommWorld WORLD
Definition: communication.cpp:11
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
Definition: fpmas.cpp:3
static std::size_t size(const PackType &pack, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:460
static void to_datapack(PackType &pack, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:475
static fpmas::random::Generator< Generator_t > from_datapack(const PackType &pack)
Definition: generator.h:488
Definition: datapack.h:55
static void from_json(const JsonType &j, fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:438
static void to_json(JsonType &j, const fpmas::random::Generator< Generator_t > &gen)
Definition: generator.h:425