summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Subsampling/include/gudhi/sparsify_point_set.h97
1 files changed, 48 insertions, 49 deletions
diff --git a/src/Subsampling/include/gudhi/sparsify_point_set.h b/src/Subsampling/include/gudhi/sparsify_point_set.h
index 89770886..a6844919 100644
--- a/src/Subsampling/include/gudhi/sparsify_point_set.h
+++ b/src/Subsampling/include/gudhi/sparsify_point_set.h
@@ -33,66 +33,65 @@
namespace Gudhi {
- template <typename Kernel, typename Point_container, typename OutputIterator>
- bool
- sparsify_point_set(
- const Kernel &k, Point_container const& input_pts,
- typename Kernel::FT min_squared_dist,
- OutputIterator output_it)
- {
- typedef typename Gudhi::Spatial_tree_data_structure<
- Kernel, Point_container> Points_ds;
-
- typename Kernel::Squared_distance_d sqdist = k.squared_distance_d_object();
+template <typename Kernel, typename Point_container, typename OutputIterator>
+bool
+sparsify_point_set(
+ const Kernel &k, Point_container const& input_pts,
+ typename Kernel::FT min_squared_dist,
+ OutputIterator output_it)
+{
+ typedef typename Gudhi::Spatial_tree_data_structure<
+ Kernel, Point_container> Points_ds;
+
+ typename Kernel::Squared_distance_d sqdist = k.squared_distance_d_object();
#ifdef GUDHI_TC_PROFILING
- Gudhi::Clock t;
+ Gudhi::Clock t;
#endif
- Points_ds points_ds(input_pts);
+ Points_ds points_ds(input_pts);
+
+ std::vector<bool> dropped_points(input_pts.size(), false);
+
+ // Parse the input points, and add them if they are not too close to
+ // the other points
+ std::size_t pt_idx = 0;
+ for (typename Point_container::const_iterator it_pt = input_pts.begin() ;
+ it_pt != input_pts.end();
+ ++it_pt, ++pt_idx)
+ {
+ if (dropped_points[pt_idx])
+ continue;
- std::vector<bool> dropped_points(input_pts.size(), false);
+ *output_it++ = *it_pt;
- // Parse the input points, and add them if they are not too close to
- // the other points
- std::size_t pt_idx = 0;
- for (typename Point_container::const_iterator it_pt = input_pts.begin() ;
- it_pt != input_pts.end();
- ++it_pt, ++pt_idx)
+ auto ins_range = points_ds.query_incremental_ANN(*it_pt);
+
+ // If another point Q is closer that min_squared_dist, mark Q to be dropped
+ for (auto const& neighbor : ins_range)
+ {
+ std::size_t neighbor_point_idx = neighbor.first;
+ // If the neighbor is too close, we drop the neighbor
+ if (neighbor.second < min_squared_dist)
+ //if (neighbor.second < 0.2*((*it_pt)[0] + 1.)*0.5 + 0.00005)
+ //if (neighbor.second < ((*it_pt)[0] < 0 ? 0.2 : 0.00001))
{
- if (dropped_points[pt_idx])
- continue;
-
- *output_it++ = *it_pt;
-
- auto ins_range = points_ds.query_incremental_ANN(*it_pt);
-
- // If another point Q is closer that min_squared_dist, mark Q to be dropped
- for (auto const& neighbor : ins_range)
- {
- std::size_t neighbor_point_idx = neighbor.first;
- // If the neighbor is too close, we drop the neighbor
- if (neighbor.second < min_squared_dist)
- //if (neighbor.second < 0.2*((*it_pt)[0] + 1.)*0.5 + 0.00005)
- //if (neighbor.second < ((*it_pt)[0] < 0 ? 0.2 : 0.00001))
- {
- // N.B.: If neighbor_point_idx < pt_idx,
- // dropped_points[neighbor_point_idx] is already true but adding a
- // test doesn't make things faster, so why bother?
- dropped_points[neighbor_point_idx] = true;
- }
- else
- break;
- }
+ // N.B.: If neighbor_point_idx < pt_idx,
+ // dropped_points[neighbor_point_idx] is already true but adding a
+ // test doesn't make things faster, so why bother?
+ dropped_points[neighbor_point_idx] = true;
}
+ else
+ break;
+ }
+ }
#ifdef GUDHI_TC_PROFILING
- t.end();
- std::cerr << "Point set sparsified in " << t.num_seconds()
- << " seconds." << std::endl;
+ t.end();
+ std::cerr << "Point set sparsified in " << t.num_seconds()
+ << " seconds." << std::endl;
#endif
- }
-
+}
} //namespace Gudhi