11 #ifndef CHOOSE_N_FARTHEST_POINTS_H_
12 #define CHOOSE_N_FARTHEST_POINTS_H_
14 #include <boost/range.hpp>
16 #include <gudhi/Null_output_iterator.h>
25 namespace subsampling {
62 template <
typename Kernel,
64 typename PointOutputIterator,
67 Point_range
const &input_pts,
68 std::size_t final_size,
69 std::size_t starting_point,
70 PointOutputIterator output_it,
71 DistanceOutputIterator dist_it = {}) {
72 std::size_t nb_points = boost::size(input_pts);
73 if (final_size > nb_points)
74 final_size = nb_points;
82 std::random_device rd;
83 std::mt19937 gen(rd());
84 std::uniform_int_distribution<std::size_t> dis(0, nb_points - 1);
85 starting_point = dis(gen);
88 typename Kernel::Squared_distance_d sqdist = k.squared_distance_d_object();
90 std::size_t current_number_of_landmarks = 0;
91 const double infty = std::numeric_limits<double>::infinity();
92 std::vector< double > dist_to_L(nb_points, infty);
94 std::size_t curr_max_w = starting_point;
96 for (current_number_of_landmarks = 0; current_number_of_landmarks != final_size; current_number_of_landmarks++) {
98 *output_it++ = input_pts[curr_max_w];
99 *dist_it++ = dist_to_L[curr_max_w];
101 for (
auto&& p : input_pts) {
102 double curr_dist = sqdist(p, *(std::begin(input_pts) + curr_max_w));
103 if (curr_dist < dist_to_L[i])
104 dist_to_L[i] = curr_dist;
108 double curr_max_dist = 0;
109 for (i = 0; i < dist_to_L.size(); i++)
110 if (dist_to_L[i] > curr_max_dist) {
111 curr_max_dist = dist_to_L[i];
121 #endif // CHOOSE_N_FARTHEST_POINTS_H_