Monte Carlo Integration Library 1.0
High-performance Monte Carlo methods for numerical integration and optimization
integrator.hpp
Go to the documentation of this file.
1
9#ifndef MONTECARLO_1_INTEGRATOR_HPP
10#define MONTECARLO_1_INTEGRATOR_HPP
11
12#include <random>
13#include <functional>
14#include <array>
15#include <fstream>
16#include <vector>
17
18#include "../domains/integration_domain.hpp"
19#include "../domains/hypersphere.hpp"
20#include "../domains/hypercylinder.hpp"
21#include "../domains/hyperrectangle.hpp"
22
23namespace mc::integrators {
24
33template <size_t dim>
35{
36protected:
38 std::vector<std::mt19937> randomizer;
39
49 std::vector<mc::geom::Point<dim>> initializeRandomizer(int numbers)
50 {
51 // Initialize seed sequence for random number generators
52 std::seed_seq seq{1, 2, 3, 4, 5};
53 std::vector<std::uint32_t> seeds(dim);
54 seq.generate(seeds.begin(), seeds.end());
55
56 // Create 'dim' independent random engines (one per dimension)
57 std::array<std::mt19937, dim> engines;
58 for (size_t i = 0; i < dim; ++i)
59 engines[i].seed(seeds[i]);
60
61 // Create uniform distributions for each dimension
62 std::array<std::uniform_real_distribution<double>, dim> distributions;
63 for (size_t i = 0; i < dim; ++i)
64 {
65 auto bounds = this->domain.getBounds();
66 distributions[i] = std::uniform_real_distribution<double>(bounds[i].first,
67 bounds[i].second);
68 }
69
70 // Reserve storage for samples
71 std::vector<mc::geom::Point<dim>> random_numbers;
72 random_numbers.reserve(numbers);
73
74 // Open output file based on domain type for visualization
75 std::ofstream outfile;
76 if (typeid(domain) == typeid(mc::domains::Hypersphere<dim>))
77 {
78 outfile.open("hsphere_samples.dat");
79 }
80 else if (typeid(domain) == typeid(mc::domains::HyperCylinder<dim>))
81 {
82 outfile.open("cylinder_samples.dat");
83 }
84 else if (typeid(domain) == typeid(mc::domains::HyperRectangle<dim>))
85 {
86 outfile.open("hrectangle_samples.dat");
87 }
88 else
89 {
90 outfile.open("generic_samples.dat");
91 }
92
93 // Generate 'numbers' sample points, one per line in output file
94 for (int j = 0; j < numbers; ++j)
95 {
97 for (size_t i = 0; i < dim; ++i)
98 {
99 x[i] = distributions[i](engines[i]);
100 outfile << x[i];
101 if (i + 1 < dim)
102 outfile << ' ';
103 }
104 random_numbers.push_back(x);
105 outfile << "\n";
106 }
107
108 return random_numbers;
109 }
110
111public:
117
118 virtual double integrate(const std::function<double(const mc::geom::Point<dim>&)>& f,
119 int n_samples,
120 const mc::proposals::Proposal<dim>& proposal,
121 std::uint32_t seed) = 0;
122
126 virtual ~Integrator() = default;
127};
128
129} // namespace mc::integrators
130
131#endif // MONTECARLO_1_INTEGRATOR_HPP
N-dimensional hypercylinder.
Axis-aligned hyperrectangular domain.
N-dimensional ball (solid sphere).
Abstract base class for N-dimensional integration domains.
virtual mc::geom::Bounds< dim > getBounds() const =0
Get the axis-aligned bounding box of the domain.
N-dimensional point representation.
Definition geometry.hpp:32
Abstract base class for Monte Carlo integration in N dimensions.
const mc::domains::IntegrationDomain< dim > & domain
Reference to the integration domain.
std::vector< std::mt19937 > randomizer
Per-thread random number generators.
std::vector< mc::geom::Point< dim > > initializeRandomizer(int numbers)
Initializes random samples uniformly distributed in the domain.
virtual ~Integrator()=default
Virtual destructor for proper polymorphic cleanup.
Integrator(const mc::domains::IntegrationDomain< dim > &d)
Constructs an integrator for a specific domain.
virtual double integrate(const std::function< double(const mc::geom::Point< dim > &)> &f, int n_samples, const mc::proposals::Proposal< dim > &proposal, std::uint32_t seed)=0
Abstract proposal distribution interface.
Definition proposal.hpp:29
constexpr int dim
Default dimensionality for integration.
Definition main.cpp:36