23 #ifndef CHOOSE_N_FARTHEST_POINTS_H_ 24 #define CHOOSE_N_FARTHEST_POINTS_H_ 26 #include <boost/range.hpp> 28 #include <gudhi/Null_output_iterator.h> 37 namespace subsampling {
74 template <
typename Kernel,
76 typename PointOutputIterator,
79 Point_range
const &input_pts,
80 std::size_t final_size,
81 std::size_t starting_point,
82 PointOutputIterator output_it,
83 DistanceOutputIterator dist_it = {}) {
84 std::size_t nb_points = boost::size(input_pts);
85 if (final_size > nb_points)
86 final_size = nb_points;
94 std::random_device rd;
95 std::mt19937 gen(rd());
96 std::uniform_int_distribution<std::size_t> dis(0, nb_points - 1);
97 starting_point = dis(gen);
100 typename Kernel::Squared_distance_d sqdist = k.squared_distance_d_object();
102 std::size_t current_number_of_landmarks = 0;
103 const double infty = std::numeric_limits<double>::infinity();
104 std::vector< double > dist_to_L(nb_points, infty);
106 std::size_t curr_max_w = starting_point;
108 for (current_number_of_landmarks = 0; current_number_of_landmarks != final_size; current_number_of_landmarks++) {
110 *output_it++ = input_pts[curr_max_w];
111 *dist_it++ = dist_to_L[curr_max_w];
113 for (
auto&& p : input_pts) {
114 double curr_dist = sqdist(p, *(std::begin(input_pts) + curr_max_w));
115 if (curr_dist < dist_to_L[i])
116 dist_to_L[i] = curr_dist;
120 double curr_max_dist = 0;
121 for (i = 0; i < dist_to_L.size(); i++)
122 if (dist_to_L[i] > curr_max_dist) {
123 curr_max_dist = dist_to_L[i];
133 #endif // CHOOSE_N_FARTHEST_POINTS_H_ Definition: Null_output_iterator.h:31
void choose_n_farthest_points(Kernel const &k, 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:78
Definition: SimplicialComplexForAlpha.h:26
Definition: choose_n_farthest_points.h:46