1 #ifndef ADAPTIVESAMPLING_HPP
2 #define ADAPTIVESAMPLING_HPP
10 #include "WeightedPoint.hpp"
11 #include "Randomness.hpp"
32 template<
typename ForwardIterator>
33 std::unique_ptr<std::vector<Point >>
computeCenterSet(ForwardIterator begin, ForwardIterator end,
size_t k,
size_t n = 0);
36 template<
typename ForwardIterator>
40 for (ForwardIterator it = begin; it != end; ++it)
43 std::mt19937 * rand = Randomness::getMT19937();
44 std::unique_ptr < std::vector < Point >> centers (
new std::vector<Point>(k));
47 std::uniform_int_distribution<> uniformFirst(0, n - 1);
48 size_t firstCenterIndex = uniformFirst(*rand);
49 ForwardIterator firstCenter = begin;
50 for (
size_t i = 0; i < firstCenterIndex; ++i)
52 (*centers)[0] = *firstCenter;
55 std::uniform_real_distribution<> uniformReal(0, 1);
56 std::vector<double> weights(n, std::numeric_limits<double>::infinity());
57 for (
size_t c = 1; c < k; ++c)
59 double sumWeights = 0;
62 ForwardIterator it = begin;
63 for (
size_t p = 0; p < n; ++p)
65 double dist = metric->distance((*centers)[c - 1], *it);
66 if (dist < weights[p])
68 sumWeights += weights[p];
75 double nextCenterCumWeight = uniformReal(*rand);
77 double nextCenterCumSearch = 0;
78 size_t nextCenterIndex = 0;
79 ForwardIterator it = begin;
80 for (
size_t p = 0; p < n; ++p)
85 double weight = weights[p];
86 if (nextCenterCumSearch + weight > nextCenterCumWeight)
89 nextCenterCumSearch += weight;