11#ifndef MEB_FILTRATION_H_
12#define MEB_FILTRATION_H_
14namespace Gudhi::cech_complex {
35template<
typename Kernel,
typename SimplicialComplexForMEB,
typename Po
intRange>
37 using Point_d =
typename Kernel::Point_d;
38 using FT =
typename Kernel::FT;
39 using Sphere = std::pair<Point_d, FT>;
45 std::vector<Sphere> cache_;
46 std::vector<Point_d> pts;
47 CGAL::NT_converter<FT, Filtration_value> cvt;
50 if(std::begin(points) == std::end(points)) {
54 int ambient_dim = k.point_dimension_d_object()(*std::begin(points));
56 auto fun = [&](Simplex_handle sh,
int dim){
63 auto vert_it = verts.begin();
66 auto&& pu = points[u];
67 Point_d m = k.midpoint_d_object()(pu, points[v]);
68 FT r = k.squared_distance_d_object()(m, pu);
69 if (exact) CGAL::exact(r);
72 cache_.emplace_back(std::move(m), std::move(r));
73 }
else if (dim > ambient_dim) {
76 for (
auto face : complex.boundary_simplex_range(sh)) {
84 maxf = max(maxf, complex.
filtration(face_opposite_vertex.first));
86 auto key = complex.
key(face_opposite_vertex.first);
87 Sphere
const& sph = cache_[key];
88 if (k.squared_distance_d_object()(sph.first, points[face_opposite_vertex.second]) > sph.second)
continue;
100 pts.push_back(points[vertex]);
101 Point_d c = k.construct_circumcenter_d_object()(pts.begin(), pts.end());
102 FT r = k.squared_distance_d_object()(c, pts.front());
103 if (exact) CGAL::exact(r);
108 maxf = max(maxf, cvt(r));
111 cache_.emplace_back(std::move(c), std::move(r));
void assign_MEB_filtration(Kernel &&k, SimplicialComplexForMEB &complex, PointRange const &points, bool exact=false)
Given a simplicial complex and an embedding of its vertices, this assigns to each simplex a filtratio...
Definition MEB_filtration.h:36
Value type for a filtration function on a cell complex.
Definition FiltrationValue.h:20
Definition SimplicialComplexForMEB.h:22
unspecified Simplex_handle
Handle for a simplex.
Definition SimplicialComplexForMEB.h:24
Simplex_key key(Simplex_handle simplex)
Returns the key assigned to the 'simplex' with assign_key().
Filtration_value filtration(Simplex_handle simplex)
Returns the filtration value to the 'simplex'.
Boundary_opposite_vertex_simplex_range boundary_opposite_vertex_simplex_range(Simplex_handle simplex)
Returns a range of the pairs (simplex, opposite vertex) of the boundary of the 'simplex'.
unspecified Filtration_value
Type of filtration values.
Definition SimplicialComplexForMEB.h:29
void assign_key(Simplex_handle simplex, Simplex_key key)
Assigns this 'key' to the 'simplex'.
Simplex_vertex_range simplex_vertex_range(Simplex_handle simplex)
Returns a range over vertices (as Vertex_handle) of a given simplex.
unspecified Vertex_handle
Handle for a vertex. Must be a non-negative integer, it is also used as an index into the input list ...
Definition SimplicialComplexForMEB.h:27
int assign_filtration(Simplex_handle simplex, Filtration_value filtration)
Assigns this 'filtration' value to the 'simplex'.
void for_each_simplex(auto callback)
Calls callback(simplex, dim) for every simplex of the complex, with the guarantee that faces are visi...
Handle type for the vertices of a cell complex.
Definition VertexHandle.h:15