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 {
65 template <
typename Distance,
67 typename PointOutputIterator,
70 Point_range
const &input_pts,
71 std::size_t final_size,
72 std::size_t starting_point,
73 PointOutputIterator output_it,
74 DistanceOutputIterator dist_it = {}) {
75 std::size_t nb_points = boost::size(input_pts);
76 if (final_size > nb_points)
77 final_size = nb_points;
85 std::random_device rd;
86 std::mt19937 gen(rd());
87 std::uniform_int_distribution<std::size_t> dis(0, nb_points - 1);
88 starting_point = dis(gen);
91 std::size_t current_number_of_landmarks = 0;
92 static_assert(std::numeric_limits<double>::has_infinity,
"the number type needs to support infinity()");
94 const double infty = std::numeric_limits<double>::infinity();
95 std::vector< double > dist_to_L(nb_points, infty);
97 std::size_t curr_max_w = starting_point;
99 for (current_number_of_landmarks = 0; current_number_of_landmarks != final_size; current_number_of_landmarks++) {
101 *output_it++ = input_pts[curr_max_w];
102 *dist_it++ = dist_to_L[curr_max_w];
104 for (
auto&& p : input_pts) {
105 double curr_dist = dist(p, input_pts[curr_max_w]);
106 if (curr_dist < dist_to_L[i])
107 dist_to_L[i] = curr_dist;
111 double curr_max_dist = 0;
112 for (i = 0; i < dist_to_L.size(); i++)
113 if (dist_to_L[i] > curr_max_dist) {
114 curr_max_dist = dist_to_L[i];
118 if (curr_max_dist == 0)
break;
126 #endif // CHOOSE_N_FARTHEST_POINTS_H_