40namespace triqs::mc_tools {
75 virtual ~rng_concept() =
default;
77 virtual void refill(std::vector<double> &) = 0;
78 virtual std::ostream &to_ostream(std::ostream &)
const = 0;
79 virtual std::istream &from_istream(std::istream &) = 0;
83 template <
typename T>
struct rng_model :
public rng_concept {
85 rng_model(T rng) : rng_{std::move(rng)} {}
86 double operator()()
override {
return rng_(); }
87 void refill(std::vector<double> &buffer)
override {
88 for (
auto &x : buffer) x = rng_();
90 std::ostream &to_ostream(std::ostream &os)
const override {
94 std::istream &from_istream(std::istream &is)
override {
131 [[nodiscard]] std::string
name()
const {
return name_; }
140 template <
typename T>
141 requires(std::integral<T>)
143 return (i == 1 ? 0 :
static_cast<T
>(std::floor(i * this->
operator()())));
151 if (idx_ > buffer_.size() - 1) refill();
152 return buffer_[idx_];
160 if (idx_ > buffer_.size() - 1) refill();
161 return buffer_[idx_++];
180 return a + (b - a) * (this->
operator()());
184 [[nodiscard]]
static std::string
hdf5_format() {
return "random_generator"; }
194 auto gr = g.create_group(
name);
195 h5::write_hdf5_format(gr, rng);
196 h5::write(gr,
"name", rng.name_);
197 h5::write(gr,
"buffer", rng.buffer_);
198 h5::write(gr,
"idx", rng.idx_);
199 std::ostringstream os;
200 rng.ptr_->to_ostream(os);
201 h5::write(gr,
"rng", os.str());
212 auto gr = g.open_group(
name);
213 h5::assert_hdf5_format(gr, rng);
214 h5::read(gr,
"name", rng.name_);
215 h5::read(gr,
"buffer", rng.buffer_);
216 h5::read(gr,
"idx", rng.idx_);
218 std::string rng_state;
219 h5::read(gr,
"rng", rng_state);
220 std::istringstream is{rng_state};
221 rng.ptr_->from_istream(is);
227 ptr_->refill(buffer_);
232 void initialize_rng(std::string
const &
name, std::uint32_t seed);
235 std::unique_ptr<rng_concept> ptr_;
237 std::vector<double> buffer_;
std::string random_generator_names(std::string const &sep)
Get a string containing the names of all available RNGs.
std::vector< std::string > random_generator_names_list()
Get a list of all available RNG names.