PointSampler library (C++)
Loading...
Searching...
No Matches
importance_resampling.hpp
Go to the documentation of this file.
1/* Copyright (c) 2025 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4#pragma once
5#include <optional>
6
9
10namespace ps
11{
12
55template <typename T, size_t N, typename DensityFn>
56std::vector<Point<T, N>> importance_resampling(
57 size_t count,
58 size_t oversampling_ratio,
59 const std::array<std::pair<T, T>, N> &axis_ranges,
61 std::optional<unsigned int> seed = std::nullopt)
62{
63 std::mt19937 gen(seed ? *seed : std::random_device{}());
64
65 // Generate grid
67 std::vector<Point<T, N>> grid_points = halton<T, N>(count_grid, axis_ranges, seed);
68
69 // Weights
70 std::vector<T> weights;
71 weights.reserve(count_grid);
72
73 for (auto &p : grid_points)
74 weights.push_back(density_fn(p));
75
76 // Normalize weights
77 T sum = std::accumulate(weights.begin(), weights.end(), T(0));
78 for (auto &w : weights)
79 w /= sum;
80
81 // Resample
82 std::discrete_distribution<size_t> dist(weights.begin(), weights.end());
83 std::vector<Point<T, N>> samples;
84 samples.reserve(count);
85 for (size_t i = 0; i < count; ++i)
86 samples.push_back(grid_points[dist(gen)]);
87
88 return samples;
89}
90
91} // namespace ps
Definition dbscan_clustering.hpp:11
std::vector< Point< T, N > > random(size_t count, const std::array< std::pair< T, T >, N > &axis_ranges, std::optional< unsigned int > seed=std::nullopt)
Generates a specified number of uniformly distributed random points in N-dimensional space.
Definition random.hpp:66
std::vector< Point< T, N > > importance_resampling(size_t count, size_t oversampling_ratio, const std::array< std::pair< T, T >, N > &axis_ranges, DensityFn density_fn, std::optional< unsigned int > seed=std::nullopt)
Generates a point set via importance resampling from a quasi-random oversampled grid.
Definition importance_resampling.hpp:56