Monte Carlo Integration Library 1.0
High-performance Monte Carlo methods for numerical integration and optimization
MCintegrator.tpp
Go to the documentation of this file.
1/**
2 * @file MCintegrator.tpp
3 * @brief MontecarloIntegrator template implementation.
4 * @details Contains inline implementations for classic uniform Monte Carlo
5 * and importance-weighted integration.
6 */
7
8// MCintegrator.tpp
9#include "integrator.hpp"
10#include "../geometry.hpp"
11
12#include <cstdint>
13#include <functional>
14#include <vector>
15
16namespace mc::integrators {
17
18/**
19 * @brief Construct a uniform Monte Carlo integrator.
20 * @tparam dim Dimensionality parameter.
21 * @param d Reference to the integration domain.
22 */
23template <size_t dim>
24MontecarloIntegrator<dim>::MontecarloIntegrator(const mc::domains::IntegrationDomain<dim>& d)
25 : Integrator<dim>(d) {}
26
27/**
28 * @brief Legacy integration using pre-sampled points.
29 * @tparam dim Dimensionality parameter.
30 * @param f Integrand function.
31 * @param n_samples Number of sample points.
32 * @return Estimated integral value.
33 *
34 * @deprecated Use integrate() instead.
35 * @details Uses initializeRandomizer() to generate uniform samples,
36 * evaluates f at inside points, and normalizes by volume.
37 */
38template <size_t dim>
39double MontecarloIntegrator<dim>::OLDintegrate(const std::function<double(const mc::geom::Point<dim>&)>& f,
40 int n_samples)
41{
42 std::vector<mc::geom::Point<dim>> points = this->initializeRandomizer(n_samples);
43
44 double sum = 0.0;
45 for (const auto& p : points) {
46 if (this->domain.isInside(p)) sum += f(p);
47 }
48
49 const double volume = this->domain.getBoxVolume();
50 return (sum / static_cast<double>(n_samples)) * volume;
51}
52
53/**
54 * @brief Compute the integral using uniform Monte Carlo sampling.
55 * @tparam dim Dimensionality parameter.
56 * @param f Integrand function: ℝⁿ → ℝ.
57 * @param n_samples Number of sample points to evaluate.
58 * @param proposal Ignored (for API consistency with importance sampling).
59 * @param seed Random seed for reproducibility.
60 * @return Estimated value of ∫_Ω f(x) dx.
61 *
62 * @details Algorithm:
63 * 1. Uses MCMeanEstimator to sample uniformly from bounding box
64 * 2. Evaluates f at points inside Ω (zero outside)
65 * 3. Computes mean: μ̂ = (1/N) ∑ f(xᵢ)
66 * 4. Returns integral: V_Ω · μ̂
67 */
68template <size_t dim>
69double MontecarloIntegrator<dim>::integrate(const std::function<double(const mc::geom::Point<dim>&)>& f,
70 int n_samples,
71 const mc::proposals::Proposal<dim>&,
72 std::uint32_t seed)
73{
74 mc::estimators::MCMeanEstimator<dim> mean_estimator;
75 mc::estimators::MeanEstimate<dim> mean_estimate =
76 mean_estimator.estimate(this->domain, seed, static_cast<std::size_t>(n_samples), f);
77
78 return mean_estimate.mean * this->domain.getBoxVolume();
79}
80
81} // namespace mc::integrators