2 * @file MCintegrator.tpp
3 * @brief MontecarloIntegrator template implementation.
4 * @details Contains inline implementations for classic uniform Monte Carlo
5 * and importance-weighted integration.
9#include "integrator.hpp"
10#include "../geometry.hpp"
16namespace mc::integrators {
19 * @brief Construct a uniform Monte Carlo integrator.
20 * @tparam dim Dimensionality parameter.
21 * @param d Reference to the integration domain.
24MontecarloIntegrator<dim>::MontecarloIntegrator(const mc::domains::IntegrationDomain<dim>& d)
25 : Integrator<dim>(d) {}
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.
34 * @deprecated Use integrate() instead.
35 * @details Uses initializeRandomizer() to generate uniform samples,
36 * evaluates f at inside points, and normalizes by volume.
39double MontecarloIntegrator<dim>::OLDintegrate(const std::function<double(const mc::geom::Point<dim>&)>& f,
42 std::vector<mc::geom::Point<dim>> points = this->initializeRandomizer(n_samples);
45 for (const auto& p : points) {
46 if (this->domain.isInside(p)) sum += f(p);
49 const double volume = this->domain.getBoxVolume();
50 return (sum / static_cast<double>(n_samples)) * volume;
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.
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_Ω · μ̂
69double MontecarloIntegrator<dim>::integrate(const std::function<double(const mc::geom::Point<dim>&)>& f,
71 const mc::proposals::Proposal<dim>&,
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);
78 return mean_estimate.mean * this->domain.getBoxVolume();
81} // namespace mc::integrators