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>
25namespace subsampling {
65template <
typename Distance,
67typename 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);
92 static_assert(std::numeric_limits<double>::has_infinity,
"the number type needs to support infinity()");
94 *output_it++ = input_pts[starting_point];
95 *dist_it++ = std::numeric_limits<double>::infinity();
96 if (final_size == 1)
return;
98 std::vector<std::size_t> points(nb_points);
99 std::vector< double > dist_to_L(nb_points);
100 for(std::size_t i = 0; i < nb_points; ++i) {
102 dist_to_L[i] = dist(input_pts[i], input_pts[starting_point]);
111 std::size_t curr_max_w = starting_point;
113 for (std::size_t current_number_of_landmarks = 1; current_number_of_landmarks != final_size; current_number_of_landmarks++) {
114 std::size_t latest_landmark = points[curr_max_w];
117 std::size_t last = points.size() - 1;
118 if (curr_max_w != last) {
119 points[curr_max_w] = points[last];
120 dist_to_L[curr_max_w] = dist_to_L[last];
126 for (
auto p : points) {
127 double curr_dist = dist(input_pts[p], input_pts[latest_landmark]);
128 if (curr_dist < dist_to_L[i])
129 dist_to_L[i] = curr_dist;
134 double curr_max_dist = dist_to_L[curr_max_w];
135 for (i = 1; i < points.size(); i++)
136 if (dist_to_L[i] > curr_max_dist) {
137 curr_max_dist = dist_to_L[i];
140 *output_it++ = input_pts[points[curr_max_w]];
141 *dist_it++ = dist_to_L[curr_max_w];
void choose_n_farthest_points(Distance dist, Point_range const &input_pts, std::size_t final_size, std::size_t starting_point, PointOutputIterator output_it, DistanceOutputIterator dist_it={})
Subsample by a greedy strategy of iteratively adding the farthest point from the current chosen point...
Definition: choose_n_farthest_points.h:69
@ random_starting_point
Definition: choose_n_farthest_points.h:34
Definition: Null_output_iterator.h:19