2 * @file ISintegrator.tpp
3 * @brief ISMontecarloIntegrator template implementation.
4 * @details Contains inline implementations for importance sampling integration
5 * with custom proposal distributions.
7#include "integrator.hpp"
8#include "../geometry.hpp"
14namespace mc::integrators {
17 * @brief Construct an importance sampling integrator.
18 * @tparam dim Dimensionality parameter.
19 * @param d Reference to the integration domain.
22ISMontecarloIntegrator<dim>::ISMontecarloIntegrator(const mc::domains::IntegrationDomain<dim> &d)
23 : Integrator<dim>(d) {}
26 * @brief Compute the integral using importance sampling.
27 * @tparam dim Dimensionality parameter.
28 * @param f Integrand function: ℝⁿ → ℝ.
29 * @param n_samples Number of samples drawn from the proposal.
30 * @param proposal Custom sampling distribution q(x) (should approximate f for efficiency).
31 * @param seed Random seed for reproducibility.
32 * @return Estimated integral ∫_Ω f(x) dx.
35 * 1. Uses ISMeanEstimator to sample from proposal q(x)
36 * 2. Computes weighted mean: μ̂ = (1/N) ∑ [f(xᵢ)/q(xᵢ)]
37 * 3. Returns mean directly (no volume factor for importance sampling)
39 * **Variance reduction**: When q(x) ≈ f(x), the weights f/q are nearly constant,
40 * reducing variance compared to uniform sampling.
43double ISMontecarloIntegrator<dim>::integrate(
44 const std::function<double(const mc::geom::Point<dim>&)>& f,
46 const mc::proposals::Proposal<dim>& proposal,
49 mc::estimators::ISMeanEstimator<dim> mean_estimator;
50 mc::estimators::ImportanceEstimate<dim> mean_estimate = mean_estimator.estimate(this->domain, seed, n_samples, proposal, f);
51 return mean_estimate.mean;
54} // namespace mc::integrators