5#include <boost/math/special_functions/prime.hpp>
6#include <boost/random/sobol.hpp>
7#include <boost/random/niederreiter_base2.hpp>
8#include <boost/random/faure.hpp>
24 virtual Eigen::MatrixXd
construct(
const size_t &nPoints) = 0;
25 virtual size_t dim()
const = 0;
54 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
57 std::vector<boost::uint_least64_t> seq(
dimension_);
59 for(
size_t i = 0; i < nPoints; ++i) {
60 gen_.generate(seq.begin(), seq.end());
69 std::iota(indices.data(), indices.data() + indices.size(), 0);
70 std::shuffle(indices.data(), indices.data() + indices.size(),
gen_);
82 std::vector<boost::uint_least64_t> seq(
dimension_);
84 gen_.generate(seq.begin(), seq.end());
92 size_t dim()
const override {
125 static inline uint64_t
hash_prefix(uint64_t prefix, uint64_t seed) {
126 uint64_t v = prefix ^ seed;
128 v *= 0xbf58476d1ce4e5b9ULL;
130 v *= 0x94d049bb133111ebULL;
138 for(
int i = 0; i < 64; ++i) {
142 uint64_t prefix = (i == 0) ? 0 : (val >> (shift + 1));
146 uint64_t bit = ((val >> shift) & 1) ^ flip;
148 result = (result << 1) | bit;
155 const Eigen::Ref<const Eigen::VectorXd> &upperBound,
156 unsigned int seed = 42)
161 std::default_random_engine rng(seed);
168 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
170 for(
size_t i = 0; i < nPoints; ++i) {
179 std::vector<boost::uint_least64_t> seq(
dimension_);
181 gen_.generate(seq.begin(), seq.end());
182 double max_val =
static_cast<double>(
gen_.max());
186 double u =
static_cast<double>(seq[d]) / max_val;
191 uint64_t fractional_bits =
static_cast<uint64_t
>(u * 18446744073709551615.0);
197 double scrambled_u =
static_cast<double>(scrambled_bits) / 18446744073709551615.0;
205 size_t dim()
const override {
222 std::default_random_engine
rng_;
223 std::uniform_real_distribution<double>
dist_;
234 MonteCarloGrid(
const Eigen::Ref<const Eigen::VectorXd> &lowerBound,
const Eigen::Ref<const Eigen::VectorXd> &upperBound,
unsigned int seed = 42)
241 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
243 for(
size_t i = 0; i < nPoints; ++i) {
265 size_t dim()
const override {
288 std::default_random_engine
rng_;
299 LatinHypercubeGrid(
const Eigen::Ref<const Eigen::VectorXd> &lowerBound,
const Eigen::Ref<const Eigen::VectorXd> &upperBound,
unsigned int seed = 42)
306 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
307 Eigen::MatrixXd grid_points(nPoints,
dimension_);
309 std::uniform_real_distribution<double> dist(0.0, 1.0);
313 std::vector<size_t> bins(nPoints);
314 std::iota(bins.begin(), bins.end(), 0);
317 std::shuffle(bins.begin(), bins.end(),
rng_);
320 for(
size_t i = 0; i < nPoints; i++) {
321 double u = dist(
rng_);
332 size_t dim()
const override {
364 LinspacedGrid(
const Eigen::Ref<const Eigen::VectorXd> &lowerBound,
const Eigen::Ref<const Eigen::VectorXd> &upperBound)
371 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
374 size_t n_pts_per_dim =
static_cast<size_t>(std::ceil(std::pow(nPoints, 1.0 /
dimension_)));
375 size_t total_points =
static_cast<size_t>(std::pow(n_pts_per_dim,
dimension_));
377 Eigen::MatrixXd grid_points(total_points,
dimension_);
378 for(
size_t i = 0; i < total_points; i++) {
399 size_t dim()
const override {
413 boost::random::niederreiter_base2
gen_;
424 NiederreiterGrid(
const Eigen::Ref<const Eigen::VectorXd> &lowerBound,
const Eigen::Ref<const Eigen::VectorXd> &upperBound)
431 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
433 std::vector<boost::uint_least64_t> seq(
dimension_);
435 for(
size_t i = 0; i < nPoints; ++i) {
436 gen_.generate(seq.begin(), seq.end());
445 std::iota(indices.data(), indices.data() + indices.size(), 0);
446 std::shuffle(indices.data(), indices.data() + indices.size(),
gen_);
460 std::vector<boost::uint_least64_t> seq(
dimension_);
462 gen_.generate(seq.begin(), seq.end());
473 size_t dim()
const override {
487 std::default_random_engine
rng_;
499 FaureGrid(
const Eigen::Ref<const Eigen::VectorXd> &lowerBound,
const Eigen::Ref<const Eigen::VectorXd> &upperBound,
unsigned int seed = 42)
506 Eigen::MatrixXd
construct(
const size_t &nPoints)
override {
508 std::vector<boost::uint_least64_t> seq(
dimension_);
510 for(
size_t i = 0; i < nPoints; ++i) {
511 gen_.generate(seq.begin(), seq.end());
520 std::iota(indices.data(), indices.data() + indices.size(), 0);
521 std::shuffle(indices.data(), indices.data() + indices.size(),
rng_);
535 std::vector<boost::uint_least64_t> seq(
dimension_);
537 gen_.generate(seq.begin(), seq.end());
548 size_t dim()
const override {
Faure low-discrepancy sequence grid generator.
Definition grid.h:484
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:490
std::default_random_engine rng_
Random engine for shuffling.
Definition grid.h:487
Eigen::VectorXd operator()()
Evaluates a single Faure sample.
Definition grid.h:533
FaureGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound, unsigned int seed=42)
Constructs a FaureGrid generator.
Definition grid.h:499
size_t dim() const override
Returns the dimension of the domain.
Definition grid.h:548
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:491
Eigen::MatrixXd construct(const size_t &nPoints) override
Constructs a matrix of Faure points.
Definition grid.h:506
size_t dimension_
Number of dimensions.
Definition grid.h:488
boost::random::faure gen_
Faure sequence generator.
Definition grid.h:486
Abstract base class for numerical integration grids and space-filling designs.
Definition grid.h:22
virtual Eigen::MatrixXd construct(const size_t &nPoints)=0
virtual size_t dim() const =0
Latin Hypercube Sampling (LHS) grid generator.
Definition grid.h:285
LatinHypercubeGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound, unsigned int seed=42)
Constructs a LatinHypercubeGrid generator.
Definition grid.h:299
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:290
size_t dimension_
Number of dimensions.
Definition grid.h:287
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:291
size_t dim() const override
Returns the dimension of the domain.
Definition grid.h:332
Eigen::MatrixXd construct(const size_t &nPoints) override
Constructs a Latin Hypercube matrix of samples.
Definition grid.h:306
std::default_random_engine rng_
Pseudo-random number generator.
Definition grid.h:288
Linearly spaced Cartesian tensor product grid generator.
Definition grid.h:347
Eigen::VectorXs gridElement(const size_t &index, const size_t &n_pts, const size_t &dim)
Helper to retrieve the multi-dimensional grid index matching a flat index.
Definition grid.cpp:5
LinspacedGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound)
Constructs a LinspacedGrid.
Definition grid.h:364
size_t dimension_
Number of dimensions.
Definition grid.h:349
size_t dim() const override
Returns the dimension of the domain.
Definition grid.h:399
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:350
Eigen::MatrixXd construct(const size_t &nPoints) override
Constructs the linearly spaced grid matrix.
Definition grid.h:371
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:351
Standard Monte Carlo random grid generator.
Definition grid.h:219
Eigen::MatrixXd construct(const size_t &nPoints) override
Constructs a matrix of random Monte Carlo samples.
Definition grid.h:241
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:226
std::default_random_engine rng_
Pseudo-random number generator.
Definition grid.h:222
size_t dimension_
Number of dimensions.
Definition grid.h:221
std::uniform_real_distribution< double > dist_
Uniform distribution range [0, 1].
Definition grid.h:223
MonteCarloGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound, unsigned int seed=42)
Constructs a MonteCarloGrid generator.
Definition grid.h:234
size_t dim() const override
Returns the dimension of the domain.
Definition grid.h:265
Eigen::VectorXd operator()()
Evaluates a single random Monte Carlo sample.
Definition grid.h:254
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:225
Niederreiter (base 2) low-discrepancy sequence grid generator.
Definition grid.h:411
size_t dimension_
Number of dimensions.
Definition grid.h:414
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:416
Eigen::VectorXd operator()()
Evaluates a single Niederreiter sample.
Definition grid.h:458
Eigen::MatrixXd construct(const size_t &nPoints) override
Constructs a matrix of Niederreiter points.
Definition grid.h:431
size_t dim() const override
Returns the dimension of the domain.
Definition grid.h:473
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:417
boost::random::niederreiter_base2 gen_
Niederreiter sequence generator.
Definition grid.h:413
NiederreiterGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound)
Constructs a NiederreiterGrid generator.
Definition grid.h:424
Owen-scrambled Sobol low-discrepancy sequence grid generator.
Definition grid.h:113
static uint64_t owen_scramble(uint64_t val, uint64_t seed)
Definition grid.h:136
static uint64_t hash_prefix(uint64_t prefix, uint64_t seed)
Definition grid.h:125
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:118
Eigen::MatrixXd construct(const size_t &nPoints) override
Definition grid.h:168
boost::random::sobol gen_
Boost Sobol sequence generator.
Definition grid.h:115
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:119
size_t dimension_
Number of dimensions.
Definition grid.h:116
Eigen::VectorXd operator()()
Definition grid.h:177
ScrambledSobolGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound, unsigned int seed=42)
Definition grid.h:154
size_t dim() const override
Definition grid.h:205
std::vector< uint64_t > dim_seeds_
Seeds used to initialize scrambling for each coordinate dimension.
Definition grid.h:122
Sobol low-discrepancy sequence grid generator.
Definition grid.h:44
Eigen::VectorXd operator()()
Definition grid.h:80
Eigen::VectorXd lowerBound_
Lower bounds vector.
Definition grid.h:49
Eigen::MatrixXd construct(const size_t &nPoints) override
Definition grid.h:54
boost::random::sobol gen_
Boost Sobol sequence generator.
Definition grid.h:46
SobolGrid(const Eigen::Ref< const Eigen::VectorXd > &lowerBound, const Eigen::Ref< const Eigen::VectorXd > &upperBound)
Definition grid.h:52
size_t dimension_
Number of dimensions.
Definition grid.h:47
size_t dim() const override
Definition grid.h:92
Eigen::VectorXd upperBound_
Upper bounds vector.
Definition grid.h:50
Matrix< size_t, Eigen::Dynamic, 1 > VectorXs
Definition cmp_defines.h:20
Derived::PlainObject slice(const Eigen::MatrixBase< Derived > &mat, const Eigen::VectorXs &indices)
Slices a matrix along its rows based on a set of indices.
Definition cmp_defines.h:178