From db938dbd74460e7a0fd705be8628984052f71dc0 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 4 Sep 2020 17:23:16 +0200 Subject: Alpha_kernel_d, its tests and Alpha complex to use it --- src/Alpha_complex/example/CMakeLists.txt | 3 + .../example/Weighted_alpha_complex_from_points.cpp | 54 ++++++++ src/Alpha_complex/include/gudhi/Alpha_complex.h | 106 ++++++++-------- .../include/gudhi/Alpha_complex/Alpha_kernel_d.h | 137 +++++++++++++++++++++ .../test/Alpha_kernel_d_unit_test.cpp | 132 ++++++++++++++++++++ src/Alpha_complex/test/CMakeLists.txt | 4 + 6 files changed, 387 insertions(+), 49 deletions(-) create mode 100644 src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp create mode 100644 src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h create mode 100644 src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt index 2eecd50c..c9b937ed 100644 --- a/src/Alpha_complex/example/CMakeLists.txt +++ b/src/Alpha_complex/example/CMakeLists.txt @@ -7,10 +7,13 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) target_link_libraries(Alpha_complex_example_from_off ${CGAL_LIBRARY}) add_executable ( Alpha_complex_example_fast_from_off Fast_alpha_complex_from_off.cpp ) target_link_libraries(Alpha_complex_example_fast_from_off ${CGAL_LIBRARY}) + add_executable ( Weighted_alpha_complex_example_from_points Weighted_alpha_complex_from_points.cpp ) + target_link_libraries(Weighted_alpha_complex_example_from_points ${CGAL_LIBRARY}) if (TBB_FOUND) target_link_libraries(Alpha_complex_example_from_points ${TBB_LIBRARIES}) target_link_libraries(Alpha_complex_example_from_off ${TBB_LIBRARIES}) target_link_libraries(Alpha_complex_example_fast_from_off ${TBB_LIBRARIES}) + target_link_libraries(Weighted_alpha_complex_example_from_points ${TBB_LIBRARIES}) endif() add_test(NAME Alpha_complex_example_from_points COMMAND $) diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp new file mode 100644 index 00000000..19a04282 --- /dev/null +++ b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp @@ -0,0 +1,54 @@ +#include +// to construct a simplex_tree from alpha complex +#include + +#include + +#include +#include + +// Explicit dimension 2 Epeck_d kernel +using Kernel = CGAL::Epeck_d< CGAL::Dimension_tag<2> >; +using Bare_point = Kernel::Point_d; +using Weighted_point = Kernel::Weighted_point_d; +using Vector_of_points = std::vector; + +int main() { + // ---------------------------------------------------------------------------- + // Init of a list of points + // ---------------------------------------------------------------------------- + Vector_of_points points; + points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 1.)); + points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 1.)); + points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 1.)); + points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 1.)); + points.push_back(Weighted_point(Bare_point(0.0, 14.0), 1.)); + points.push_back(Weighted_point(Bare_point(2.0, 19.0), 1.)); + points.push_back(Weighted_point(Bare_point(9.0, 17.0), 1.)); + + // ---------------------------------------------------------------------------- + // Init of an alpha complex from the list of points + // ---------------------------------------------------------------------------- + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_weighted_points(points); + + Gudhi::Simplex_tree<> simplex; + if (alpha_complex_from_weighted_points.create_complex(simplex)) { + // ---------------------------------------------------------------------------- + // Display information about the alpha complex + // ---------------------------------------------------------------------------- + std::clog << "Weighted alpha complex is of dimension " << simplex.dimension() << + " - " << simplex.num_simplices() << " simplices - " << + simplex.num_vertices() << " vertices." << std::endl; + + std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : simplex.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + } + return 0; +} diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index ba91998d..8e9fe773 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -12,6 +12,7 @@ #ifndef ALPHA_COMPLEX_H_ #define ALPHA_COMPLEX_H_ +#include #include // to construct Alpha_complex from a OFF file of points #include @@ -20,6 +21,7 @@ #include // isnan, fmax #include +#include // aka. Weighted Delaunay triangulation #include // For EXACT or SAFE version #include // For FAST version #include @@ -91,49 +93,55 @@ template struct Is_Epeck_D> { static const bool val * guarantee that the output is a valid filtration (faces have a filtration value no larger than their cofaces). * - For performances reasons, it is advised to use `Alpha_complex` with \ref cgal ≥ 5.0.0. */ -template> +template, bool Weighted = false> class Alpha_complex { public: + /** \brief Geometric traits class that provides the geometric types and predicates needed by the triangulations.*/ + using Geom_traits = typename std::conditional, + Kernel>::type; // Add an int in TDS to save point index in the structure - typedef CGAL::Triangulation_data_structure, - CGAL::Triangulation_full_cell > TDS; - /** \brief A Delaunay triangulation of a set of points in \f$ \mathbb{R}^D\f$.*/ - typedef CGAL::Delaunay_triangulation Delaunay_triangulation; + using TDS = CGAL::Triangulation_data_structure, + CGAL::Triangulation_full_cell >; + /** \brief A (Weighted or not) Delaunay triangulation of a set of points in \f$ \mathbb{R}^D\f$.*/ + using Triangulation = typename std::conditional, + CGAL::Delaunay_triangulation>::type; + + using A_kernel_d = Alpha_kernel_d; + + // Numeric type of coordinates in the kernel + using FT = typename A_kernel_d::FT; + + /** \brief If Weighted, the weighted point is cached (point + weight [= squared radius]), + * else a pair of point and squared radius is cached. + */ + using Sphere = typename A_kernel_d::Sphere; /** \brief A point in Euclidean space.*/ - typedef typename Kernel::Point_d Point_d; - /** \brief Geometric traits class that provides the geometric types and predicates needed by Delaunay - * triangulations.*/ - typedef Kernel Geom_traits; + using Point_d = typename std::conditional::type; private: - typedef typename Kernel::Compute_squared_radius_d Squared_Radius; - typedef typename Kernel::Side_of_bounded_sphere_d Is_Gabriel; - typedef typename Kernel::Point_dimension_d Point_Dimension; - // Vertex_iterator type from CGAL. - typedef typename Delaunay_triangulation::Vertex_iterator CGAL_vertex_iterator; + using CGAL_vertex_iterator = typename Triangulation::Vertex_iterator; // size_type type from CGAL. - typedef typename Delaunay_triangulation::size_type size_type; + using size_type = typename Triangulation::size_type; // Structure to switch from simplex tree vertex handle to CGAL vertex iterator. - typedef typename std::vector< CGAL_vertex_iterator > Vector_vertex_iterator; - - // Numeric type of coordinates in the kernel - typedef typename Kernel::FT FT; + using Vector_vertex_iterator = typename std::vector< CGAL_vertex_iterator >; private: /** \brief Vertex iterator vector to switch from simplex tree vertex handle to CGAL vertex iterator. * Vertex handles are inserted sequentially, starting at 0.*/ Vector_vertex_iterator vertex_handle_to_iterator_; /** \brief Pointer on the CGAL Delaunay triangulation.*/ - Delaunay_triangulation* triangulation_; + Triangulation* triangulation_; /** \brief Kernel for triangulation_ functions access.*/ - Kernel kernel_; + A_kernel_d kernel_; + /** \brief Cache for geometric constructions: circumcenter and squared radius of a simplex.*/ - std::vector> cache_, old_cache_; + std::vector cache_, old_cache_; public: /** \brief Alpha_complex constructor from an OFF file name. @@ -160,10 +168,10 @@ class Alpha_complex { * * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous. * - * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d + * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. * * The type InputPointRange must be a range for which std::begin and - * std::end return input iterators on a Kernel::Point_d. + * std::end return input iterators on a Kernel::Point_d or Kernel::Weighted_point_d. */ template Alpha_complex(const InputPointRange& points) @@ -206,11 +214,8 @@ class Alpha_complex { auto last = std::end(points); if (first != last) { - // point_dimension function initialization - Point_Dimension point_dimension = kernel_.point_dimension_d_object(); - - // Delaunay triangulation is point dimension. - triangulation_ = new Delaunay_triangulation(point_dimension(*first)); + // Delaunay triangulation init with point dimension. + triangulation_ = new Triangulation(kernel_.get_dimension(*first)); std::vector point_cloud(first, last); @@ -218,18 +223,22 @@ class Alpha_complex { std::vector indices(boost::counting_iterator(0), boost::counting_iterator(point_cloud.size())); - typedef boost::iterator_property_map::iterator, - CGAL::Identity_property_map> Point_property_map; - typedef CGAL::Spatial_sort_traits_adapter_d Search_traits_d; + using Point_property_map = boost::iterator_property_map::iterator, + CGAL::Identity_property_map>; + using Search_traits_d = CGAL::Spatial_sort_traits_adapter_d; CGAL::spatial_sort(indices.begin(), indices.end(), Search_traits_d(std::begin(point_cloud))); - typename Delaunay_triangulation::Full_cell_handle hint; + typename Triangulation::Full_cell_handle hint; for (auto index : indices) { - typename Delaunay_triangulation::Vertex_handle pos = triangulation_->insert(point_cloud[index], hint); - // Save index value as data to retrieve it after insertion - pos->data() = index; - hint = pos->full_cell(); + typename Triangulation::Vertex_handle pos = triangulation_->insert(point_cloud[index], hint); + if (pos != nullptr) { + // Save index value as data to retrieve it after insertion + pos->data() = index; + hint = pos->full_cell(); + } else { + std::cout << "NULLPTR" << std::endl; + } } // -------------------------------------------------------------------------------------------- // structure to retrieve CGAL points from vertex handle - one vertex handle per point. @@ -270,9 +279,7 @@ class Alpha_complex { v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) v.push_back(get_point_(vertex)); - Point_d c = kernel_.construct_circumcenter_d_object()(v.cbegin(), v.cend()); - FT r = kernel_.squared_distance_d_object()(c, v[0]); - cache_.emplace_back(std::move(c), std::move(r)); + cache_.emplace_back(kernel_.get_sphere(v.cbegin(), v.cend())); } return cache_[k]; } @@ -282,13 +289,13 @@ class Alpha_complex { auto radius(SimplicialComplexForAlpha& cplx, typename SimplicialComplexForAlpha::Simplex_handle s) { auto k = cplx.key(s); if(k!=cplx.null_key()) - return old_cache_[k].second; + return kernel_.get_squared_radius(old_cache_[k]); // Using a transform_range is slower, currently. thread_local std::vector v; v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) v.push_back(get_point_(vertex)); - return kernel_.compute_squared_radius_d_object()(v.cbegin(), v.cend()); + return kernel_.get_squared_radius(v.cbegin(), v.cend()); } public: @@ -322,9 +329,9 @@ class Alpha_complex { bool exact = false, bool default_filtration_value = false) { // From SimplicialComplexForAlpha type required to insert into a simplicial complex (with or without subfaces). - typedef typename SimplicialComplexForAlpha::Vertex_handle Vertex_handle; - typedef typename SimplicialComplexForAlpha::Simplex_handle Simplex_handle; - typedef std::vector Vector_vertex; + using Vertex_handle = typename SimplicialComplexForAlpha::Vertex_handle; + using Simplex_handle = typename SimplicialComplexForAlpha::Simplex_handle; + using Vector_vertex = std::vector; if (triangulation_ == nullptr) { std::cerr << "Alpha_complex cannot create_complex from a NULL triangulation\n"; @@ -416,8 +423,8 @@ class Alpha_complex { template void propagate_alpha_filtration(SimplicialComplexForAlpha& complex, Simplex_handle f_simplex) { // From SimplicialComplexForAlpha type required to assign filtration values. - typedef typename SimplicialComplexForAlpha::Filtration_value Filtration_value; - typedef typename SimplicialComplexForAlpha::Vertex_handle Vertex_handle; + using Filtration_value = typename SimplicialComplexForAlpha::Filtration_value; + using Vertex_handle = typename SimplicialComplexForAlpha::Vertex_handle; // ### Foreach Tau face of Sigma for (auto f_boundary : complex.boundary_simplex_range(f_simplex)) { @@ -450,7 +457,8 @@ class Alpha_complex { while(shortiter != enditer && *longiter == *shortiter) { ++longiter; ++shortiter; } Vertex_handle extra = *longiter; auto const& cache=get_cache(complex, f_boundary); - bool is_gab = kernel_.squared_distance_d_object()(cache.first, get_point_(extra)) >= cache.second; + bool is_gab = kernel_.get_squared_distance(kernel_.get_circumcenter(cache), get_point_(extra)) >= + kernel_.get_squared_radius(cache); #ifdef DEBUG_TRACES std::clog << " | Tau is_gabriel(Sigma)=" << is_gab << " - vertexForGabriel=" << extra << std::endl; #endif // DEBUG_TRACES diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h new file mode 100644 index 00000000..87604ec4 --- /dev/null +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -0,0 +1,137 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2020 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#ifndef ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ +#define ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ + +#include // For EXACT or SAFE version +#include // For FAST version +#include // for CGAL_VERSION_NR + +#include // for EIGEN_VERSION_AT_LEAST + +#include // for std::make_pair + +// Make compilation fail - required for external projects - https://github.com/GUDHI/gudhi-devel/issues/10 +#if CGAL_VERSION_NR < 1041101000 +# error Alpha_complex is only available for CGAL >= 4.11 +#endif + +#if !EIGEN_VERSION_AT_LEAST(3,1,0) +# error Alpha_complex is only available for Eigen3 >= 3.1.0 installed with CGAL +#endif + +namespace Gudhi { + +namespace alpha_complex { + +template < typename Kernel, bool Weighted = false > +class Alpha_kernel_d { +}; + +// Unweighted Kernel_d version +template < typename Kernel > +class Alpha_kernel_d { + private: + // Kernel for functions access. + Kernel kernel_; + public: + // Fake type for compilation to succeed (cf. std::conditional in Alpha_complex.h) + using Weighted_point_d = void; + using Point_d = typename Kernel::Point_d; + // Numeric type of coordinates in the kernel + using FT = typename Kernel::FT; + // Sphere is a pair of point and squared radius. + using Sphere = typename std::pair; + + int get_dimension(const Point_d& p0) const { + return kernel_.point_dimension_d_object()(p0); + } + + template + Sphere get_sphere(PointIterator begin, PointIterator end) const { + Point_d c = kernel_.construct_circumcenter_d_object()(begin, end); + FT r = kernel_.squared_distance_d_object()(c, *begin); + return std::make_pair(std::move(c), std::move(r)); + } + + template + FT get_squared_radius(PointIterator begin, PointIterator end) const { + return kernel_.compute_squared_radius_d_object()(begin, end); + } + + FT get_squared_radius(const Sphere& sph) const { + return sph.second; + } + + template + Point get_circumcenter(const Sphere& sph) const { + return sph.first; + } + + template + FT get_squared_distance(const Point& first, const Point& second) const { + return kernel_.squared_distance_d_object()(first, second); + } +}; + +// Weighted Kernel_d version +template < typename Kernel > +class Alpha_kernel_d { + private: + // Kernel for functions access. + Kernel kernel_; + public: + // Fake type for compilation to succeed (cf. std::conditional in Alpha_complex.h) + using Point_d = void; + using Weighted_point_d = typename Kernel::Weighted_point_d; + using Bare_point_d = typename Kernel::Point_d; + // Numeric type of coordinates in the kernel + using FT = typename Kernel::FT; + // Sphere is a weighted point (point + weight [= squared radius]). + using Sphere = Weighted_point_d; + + int get_dimension(const Weighted_point_d& p0) const { + return kernel_.point_dimension_d_object()(p0.point()); + } + + template + Sphere get_sphere(PointIterator begin, PointIterator end) const { + return kernel_.power_center_d_object()(begin, end); + } + + template + FT get_squared_radius(PointIterator begin, PointIterator end) const { + Sphere sph = get_sphere(begin, end); + return sph.weight(); + } + + FT get_squared_radius(const Sphere& sph) const { + return sph.weight(); + } + + template + Point get_circumcenter(const Sphere& sph) const { + return sph.point(); + } + + template + FT get_squared_distance(const Point& first, const Point& second) const { + return kernel_.power_distance_d_object()(first, second); + } +}; + +} // namespace alpha_complex + +namespace alphacomplex = alpha_complex; + +} // namespace Gudhi + +#endif // ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ \ No newline at end of file diff --git a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp new file mode 100644 index 00000000..70b65aad --- /dev/null +++ b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp @@ -0,0 +1,132 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2020 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "alpha_kernel_d" +#include +#include + +#include +#include +#include + +#include +#include +#include // for std::pair + +#include +#include + +// Use dynamic_dimension_tag for the user to be able to set dimension +typedef CGAL::Epeck_d< CGAL::Dynamic_dimension_tag > Exact_kernel_d; +// Use static dimension_tag for the user not to be able to set dimension +typedef CGAL::Epeck_d< CGAL::Dimension_tag<4> > Exact_kernel_s; +// Use dynamic_dimension_tag for the user to be able to set dimension +typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Inexact_kernel_d; +// Use static dimension_tag for the user not to be able to set dimension +typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Inexact_kernel_s; +// The triangulation uses the default instantiation of the TriangulationDataStructure template parameter + +typedef boost::mpl::list list_of_kernel_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_dimension, TestedKernel, list_of_kernel_variants) { + Gudhi::alpha_complex::Alpha_kernel_d kernel; + std::vector p0 {0., 1., 2., 3.}; + typename TestedKernel::Point_d p0_d(p0.begin(), p0.end()); + + std::clog << "Dimension is " << kernel.get_dimension(p0_d) << std::endl; + BOOST_CHECK(kernel.get_dimension(p0_d) == 4); + + Gudhi::alpha_complex::Alpha_kernel_d w_kernel; + typename TestedKernel::Weighted_point_d w_p0_d(p0_d, 10.); + + std::clog << "Dimension is " << w_kernel.get_dimension(w_p0_d) << std::endl; + BOOST_CHECK(w_kernel.get_dimension(w_p0_d) == 4); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_sphere, TestedKernel, list_of_kernel_variants) { + using Unweighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; + // Sphere: (x-1)² + (y-1)² + z² + t² = 1 + // At least 5 points for a 3-sphere + std::vector p0 {1., 0., 0., 0.}; + std::vector p1 {0., 1., 0., 0.}; + std::vector p2 {1., 1., 1., 0.}; + std::vector p3 {1., 1., 0., 1.}; + std::vector p4 {1., 1., -1., 0.}; + + using Point_d = typename Unweighted_kernel::Point_d; + std::vector unw_pts; + unw_pts.push_back(Point_d(p0.begin(), p0.end())); + unw_pts.push_back(Point_d(p1.begin(), p1.end())); + unw_pts.push_back(Point_d(p2.begin(), p2.end())); + unw_pts.push_back(Point_d(p3.begin(), p3.end())); + unw_pts.push_back(Point_d(p4.begin(), p4.end())); + + Unweighted_kernel kernel; + auto unw_sphere = kernel.get_sphere(unw_pts.cbegin(), unw_pts.cend()); + + std::clog << "Center is " << unw_sphere.first << " - squared radius is " << unw_sphere.second << std::endl; + + using Weighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; + + using Weighted_point_d = typename Weighted_kernel::Weighted_point_d; + using Bare_point_d = typename Weighted_kernel::Bare_point_d; + std::vector w_pts; + w_pts.push_back(Weighted_point_d(Bare_point_d(p0.begin(), p0.end()), 0.)); + w_pts.push_back(Weighted_point_d(Bare_point_d(p1.begin(), p1.end()), 0.)); + w_pts.push_back(Weighted_point_d(Bare_point_d(p2.begin(), p2.end()), 0.)); + w_pts.push_back(Weighted_point_d(Bare_point_d(p3.begin(), p3.end()), 0.)); + w_pts.push_back(Weighted_point_d(Bare_point_d(p4.begin(), p4.end()), 0.)); + + Weighted_kernel w_kernel; + auto w_sphere = w_kernel.get_sphere(w_pts.cbegin(), w_pts.cend()); + + std::clog << "Center is " << w_sphere.point() << " - squared radius is " << w_sphere.weight() << std::endl; + + CGAL::NT_converter cast_to_double; + // The results shall be the same with weights = 0. + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(unw_sphere.second), cast_to_double(w_sphere.weight())); + BOOST_CHECK(unw_sphere.first == w_sphere.point()); + + auto unw_sq_rd = kernel.get_squared_radius(unw_pts.cbegin(), unw_pts.cend()); + std::clog << "Squared radius is " << unw_sq_rd << std::endl; + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(unw_sphere.second), cast_to_double(unw_sq_rd)); + auto w_sq_rd = w_kernel.get_squared_radius(w_pts.cbegin(), w_pts.cend()); + std::clog << "Squared radius is " << w_sq_rd << std::endl; + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(w_sphere.weight()), cast_to_double(w_sq_rd)); +} + + +BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_distance, TestedKernel, list_of_kernel_variants) { + using Unweighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; + + std::vector p0 {1., 0., 0., 0.}; + std::vector p1 {0., 1., 0., 0.}; + + using Point_d = typename Unweighted_kernel::Point_d; + Unweighted_kernel kernel; + auto dist_01 = kernel.get_squared_distance(Point_d(p0.begin(), p0.end()), Point_d(p1.begin(), p1.end())); + std::clog << "Distance is " << dist_01 << std::endl; + + using Weighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; + + using Weighted_point_d = typename Weighted_kernel::Weighted_point_d; + using Bare_point_d = typename Weighted_kernel::Bare_point_d; + std::vector w_pts; + + Weighted_kernel w_kernel; + auto w_dist_01 = w_kernel.get_squared_distance(Weighted_point_d(Bare_point_d(p0.begin(), p0.end()), 0.), + Weighted_point_d(Bare_point_d(p1.begin(), p1.end()), 0.)); + std::clog << "Distance is " << w_dist_01 << std::endl; + + CGAL::NT_converter cast_to_double; + // The results shall be the same with weights = 0. + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(dist_01), cast_to_double(w_dist_01)); +} diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt index fe4b23e4..bd61c0d8 100644 --- a/src/Alpha_complex/test/CMakeLists.txt +++ b/src/Alpha_complex/test/CMakeLists.txt @@ -10,13 +10,17 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) target_link_libraries(Alpha_complex_test_unit ${CGAL_LIBRARY}) add_executable ( Delaunay_complex_test_unit Delaunay_complex_unit_test.cpp ) target_link_libraries(Delaunay_complex_test_unit ${CGAL_LIBRARY}) + add_executable ( Alpha_kernel_d_test_unit Alpha_kernel_d_unit_test.cpp ) + target_link_libraries(Alpha_kernel_d_test_unit ${CGAL_LIBRARY}) if (TBB_FOUND) target_link_libraries(Alpha_complex_test_unit ${TBB_LIBRARIES}) target_link_libraries(Delaunay_complex_test_unit ${TBB_LIBRARIES}) + target_link_libraries(Alpha_kernel_d_test_unit ${TBB_LIBRARIES}) endif() gudhi_add_boost_test(Alpha_complex_test_unit) gudhi_add_boost_test(Delaunay_complex_test_unit) + gudhi_add_boost_test(Alpha_kernel_d_test_unit) add_executable ( Alpha_complex_3d_test_unit Alpha_complex_3d_unit_test.cpp ) target_link_libraries(Alpha_complex_3d_test_unit ${CGAL_LIBRARY}) -- cgit v1.2.3 From 9922407fe6f5d8872522157555c3573e95930ac3 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 7 Sep 2020 10:31:11 +0200 Subject: Fix compilation error and test with 0. weights --- src/Alpha_complex/example/CMakeLists.txt | 4 +++- .../example/Weighted_alpha_complex_from_points.cpp | 14 +++++++------- .../include/gudhi/Alpha_complex/Alpha_kernel_d.h | 11 ++++------- 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt index 08eb979e..17dc896c 100644 --- a/src/Alpha_complex/example/CMakeLists.txt +++ b/src/Alpha_complex/example/CMakeLists.txt @@ -28,6 +28,8 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) add_test(NAME Alpha_complex_example_fast_from_off_32 COMMAND $ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "32.0" "${CMAKE_CURRENT_BINARY_DIR}/fastalphaoffreader_result_32.txt") + add_test(NAME Weighted_alpha_complex_example_from_points COMMAND $) + if (DIFF_PATH) # Do not forget to copy test results files in current binary dir file(COPY "alphaoffreader_for_doc_32.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) @@ -47,7 +49,7 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) ${CMAKE_CURRENT_BINARY_DIR}/fastalphaoffreader_result_32.txt ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_for_doc_32.txt) set_tests_properties(Alpha_complex_example_fast_from_off_32_diff_files PROPERTIES DEPENDS Alpha_complex_example_fast_from_off_32) endif() - endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) +endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) if (NOT CGAL_VERSION VERSION_LESS 4.11.0) add_executable ( Alpha_complex_example_weighted_3d_from_points Weighted_alpha_complex_3d_from_points.cpp ) diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp index 19a04282..05858084 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp @@ -18,13 +18,13 @@ int main() { // Init of a list of points // ---------------------------------------------------------------------------- Vector_of_points points; - points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 1.)); - points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 1.)); - points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 1.)); - points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 1.)); - points.push_back(Weighted_point(Bare_point(0.0, 14.0), 1.)); - points.push_back(Weighted_point(Bare_point(2.0, 19.0), 1.)); - points.push_back(Weighted_point(Bare_point(9.0, 17.0), 1.)); + points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 0.)); + points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 0.)); + points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 0.)); + points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 0.)); + points.push_back(Weighted_point(Bare_point(0.0, 14.0), 0.)); + points.push_back(Weighted_point(Bare_point(2.0, 19.0), 0.)); + points.push_back(Weighted_point(Bare_point(9.0, 17.0), 0.)); // ---------------------------------------------------------------------------- // Init of an alpha complex from the list of points diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index 87604ec4..a3e3845a 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -71,8 +71,7 @@ class Alpha_kernel_d { return sph.second; } - template - Point get_circumcenter(const Sphere& sph) const { + auto get_circumcenter(const Sphere& sph) const { return sph.first; } @@ -117,13 +116,11 @@ class Alpha_kernel_d { return sph.weight(); } - template - Point get_circumcenter(const Sphere& sph) const { - return sph.point(); + auto get_circumcenter(const Sphere& sph) const { + return sph; } - template - FT get_squared_distance(const Point& first, const Point& second) const { + FT get_squared_distance(const Weighted_point_d& first, const Weighted_point_d& second) const { return kernel_.power_distance_d_object()(first, second); } }; -- cgit v1.2.3 From 05c9c0060ec8ff4cbf8619ff74724c2eea426d84 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 8 Sep 2020 16:43:36 +0200 Subject: CMake > 3.5 to use Boost targets. Compile only what is available from boost targets --- CMakeLists.txt | 2 +- src/Alpha_complex/utilities/CMakeLists.txt | 128 +++++++++++---------- src/Bottleneck_distance/example/CMakeLists.txt | 20 ++-- src/CMakeLists.txt | 2 +- src/Cech_complex/benchmark/CMakeLists.txt | 15 +-- src/Cech_complex/example/CMakeLists.txt | 15 +-- src/Cech_complex/test/CMakeLists.txt | 3 - src/Cech_complex/utilities/CMakeLists.txt | 19 +-- src/Collapse/utilities/CMakeLists.txt | 62 +++++----- src/Persistent_cohomology/benchmark/CMakeLists.txt | 14 ++- src/Persistent_cohomology/example/CMakeLists.txt | 79 +++++++------ src/Rips_complex/utilities/CMakeLists.txt | 67 ++++++----- src/Simplex_tree/example/CMakeLists.txt | 14 ++- src/Witness_complex/utilities/CMakeLists.txt | 36 +++--- src/cmake/modules/GUDHI_modules.cmake | 7 +- .../modules/GUDHI_third_party_libraries.cmake | 39 +------ src/common/doc/installation.h | 8 +- src/python/doc/installation.rst | 2 +- 18 files changed, 267 insertions(+), 265 deletions(-) (limited to 'src/Alpha_complex') diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b82036b..4257a025 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.5) project(GUDHIdev) diff --git a/src/Alpha_complex/utilities/CMakeLists.txt b/src/Alpha_complex/utilities/CMakeLists.txt index f0ddfc2c..1e7dc1dd 100644 --- a/src/Alpha_complex/utilities/CMakeLists.txt +++ b/src/Alpha_complex/utilities/CMakeLists.txt @@ -1,80 +1,82 @@ project(Alpha_complex_utilities) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) - add_executable (alpha_complex_persistence alpha_complex_persistence.cpp) - target_link_libraries(alpha_complex_persistence ${CGAL_LIBRARY} Boost::program_options) + if (TARGET Boost::program_options) + add_executable (alpha_complex_persistence alpha_complex_persistence.cpp) + target_link_libraries(alpha_complex_persistence ${CGAL_LIBRARY} Boost::program_options) - if (TBB_FOUND) - target_link_libraries(alpha_complex_persistence ${TBB_LIBRARIES}) - endif(TBB_FOUND) - add_test(NAME Alpha_complex_utilities_safe_alpha_complex_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "safe.pers") - add_test(NAME Alpha_complex_utilities_fast_alpha_complex_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "fast.pers" "-f") - add_test(NAME Alpha_complex_utilities_exact_alpha_complex_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "exact.pers" "-e") - if (DIFF_PATH) - add_test(Alpha_complex_utilities_diff_exact_alpha_complex ${DIFF_PATH} - "exact.pers" "safe.pers") - set_tests_properties(Alpha_complex_utilities_diff_exact_alpha_complex PROPERTIES DEPENDS - "Alpha_complex_utilities_exact_alpha_complex_persistence;Alpha_complex_utilities_safe_alpha_complex_persistence") - - add_test(Alpha_complex_utilities_diff_fast_alpha_complex ${DIFF_PATH} - "fast.pers" "safe.pers") - set_tests_properties(Alpha_complex_utilities_diff_fast_alpha_complex PROPERTIES DEPENDS - "Alpha_complex_utilities_fast_alpha_complex_persistence;Alpha_complex_utilities_safe_alpha_complex_persistence") + if (TBB_FOUND) + target_link_libraries(alpha_complex_persistence ${TBB_LIBRARIES}) + endif(TBB_FOUND) + add_test(NAME Alpha_complex_utilities_safe_alpha_complex_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "safe.pers") + add_test(NAME Alpha_complex_utilities_fast_alpha_complex_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "fast.pers" "-f") + add_test(NAME Alpha_complex_utilities_exact_alpha_complex_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45" "-o" "exact.pers" "-e") + if (DIFF_PATH) + add_test(Alpha_complex_utilities_diff_exact_alpha_complex ${DIFF_PATH} + "exact.pers" "safe.pers") + set_tests_properties(Alpha_complex_utilities_diff_exact_alpha_complex PROPERTIES DEPENDS + "Alpha_complex_utilities_exact_alpha_complex_persistence;Alpha_complex_utilities_safe_alpha_complex_persistence") + add_test(Alpha_complex_utilities_diff_fast_alpha_complex ${DIFF_PATH} + "fast.pers" "safe.pers") + set_tests_properties(Alpha_complex_utilities_diff_fast_alpha_complex PROPERTIES DEPENDS + "Alpha_complex_utilities_fast_alpha_complex_persistence;Alpha_complex_utilities_safe_alpha_complex_persistence") + endif() + + install(TARGETS alpha_complex_persistence DESTINATION bin) endif() - - install(TARGETS alpha_complex_persistence DESTINATION bin) endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) if (NOT CGAL_VERSION VERSION_LESS 4.11.0) - add_executable(alpha_complex_3d_persistence alpha_complex_3d_persistence.cpp) - target_link_libraries(alpha_complex_3d_persistence ${CGAL_LIBRARY} Boost::program_options) - if (TBB_FOUND) - target_link_libraries(alpha_complex_3d_persistence ${TBB_LIBRARIES}) - endif(TBB_FOUND) + if (TARGET Boost::program_options) + add_executable(alpha_complex_3d_persistence alpha_complex_3d_persistence.cpp) + target_link_libraries(alpha_complex_3d_persistence ${CGAL_LIBRARY} Boost::program_options) + if (TBB_FOUND) + target_link_libraries(alpha_complex_3d_persistence ${TBB_LIBRARIES}) + endif(TBB_FOUND) - add_test(NAME Alpha_complex_utilities_alpha_complex_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" - "-p" "2" "-m" "0.45" "-o" "safe_3d.pers") + add_test(NAME Alpha_complex_utilities_alpha_complex_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" + "-p" "2" "-m" "0.45" "-o" "safe_3d.pers") - add_test(NAME Alpha_complex_utilities_exact_alpha_complex_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" - "-p" "2" "-m" "0.45" "-o" "exact_3d.pers" "-e") + add_test(NAME Alpha_complex_utilities_exact_alpha_complex_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" + "-p" "2" "-m" "0.45" "-o" "exact_3d.pers" "-e") - add_test(NAME Alpha_complex_utilities_fast_alpha_complex_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" - "-p" "2" "-m" "0.45" "-o" "fast_3d.pers" "-f") - - if (DIFF_PATH) - add_test(Alpha_complex_utilities_diff_exact_alpha_complex_3d ${DIFF_PATH} - "exact_3d.pers" "safe_3d.pers") - set_tests_properties(Alpha_complex_utilities_diff_exact_alpha_complex_3d PROPERTIES DEPENDS - "Alpha_complex_utilities_exact_alpha_complex_3d;Alpha_complex_utilities_alpha_complex_3d") - add_test(Alpha_complex_utilities_diff_fast_alpha_complex_3d ${DIFF_PATH} - "fast_3d.pers" "safe_3d.pers") - set_tests_properties(Alpha_complex_utilities_diff_fast_alpha_complex_3d PROPERTIES DEPENDS - "Alpha_complex_utilities_fast_alpha_complex_3d;Alpha_complex_utilities_alpha_complex_3d") - endif() + add_test(NAME Alpha_complex_utilities_fast_alpha_complex_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" + "-p" "2" "-m" "0.45" "-o" "fast_3d.pers" "-f") - add_test(NAME Alpha_complex_utilities_periodic_alpha_complex_3d_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" - "-c" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" - "-p" "2" "-m" "0") + if (DIFF_PATH) + add_test(Alpha_complex_utilities_diff_exact_alpha_complex_3d ${DIFF_PATH} + "exact_3d.pers" "safe_3d.pers") + set_tests_properties(Alpha_complex_utilities_diff_exact_alpha_complex_3d PROPERTIES DEPENDS + "Alpha_complex_utilities_exact_alpha_complex_3d;Alpha_complex_utilities_alpha_complex_3d") + add_test(Alpha_complex_utilities_diff_fast_alpha_complex_3d ${DIFF_PATH} + "fast_3d.pers" "safe_3d.pers") + set_tests_properties(Alpha_complex_utilities_diff_fast_alpha_complex_3d PROPERTIES DEPENDS + "Alpha_complex_utilities_fast_alpha_complex_3d;Alpha_complex_utilities_alpha_complex_3d") + endif() - add_test(NAME Alpha_complex_utilities_weighted_alpha_complex_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" - "-w" "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.weights" - "-p" "2" "-m" "0") + add_test(NAME Alpha_complex_utilities_periodic_alpha_complex_3d_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" + "-c" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" + "-p" "2" "-m" "0") - add_test(NAME Alpha_complex_utilities_weighted_periodic_alpha_complex_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" - "-w" "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.weights" - "-c" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" - "-p" "2" "-m" "0" "-e") - - install(TARGETS alpha_complex_3d_persistence DESTINATION bin) + add_test(NAME Alpha_complex_utilities_weighted_alpha_complex_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" + "-w" "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.weights" + "-p" "2" "-m" "0") + add_test(NAME Alpha_complex_utilities_weighted_periodic_alpha_complex_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" + "-w" "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.weights" + "-c" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" + "-p" "2" "-m" "0" "-e") + + install(TARGETS alpha_complex_3d_persistence DESTINATION bin) + endif() endif (NOT CGAL_VERSION VERSION_LESS 4.11.0) diff --git a/src/Bottleneck_distance/example/CMakeLists.txt b/src/Bottleneck_distance/example/CMakeLists.txt index 9839c59d..d16ea6e5 100644 --- a/src/Bottleneck_distance/example/CMakeLists.txt +++ b/src/Bottleneck_distance/example/CMakeLists.txt @@ -12,14 +12,16 @@ if (NOT CGAL_VERSION VERSION_LESS 4.11.0) endif (NOT CGAL_VERSION VERSION_LESS 4.11.0) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) - add_executable (alpha_rips_persistence_bottleneck_distance alpha_rips_persistence_bottleneck_distance.cpp) - target_link_libraries(alpha_rips_persistence_bottleneck_distance Boost::program_options) + if (TARGET Boost::program_options) + add_executable (alpha_rips_persistence_bottleneck_distance alpha_rips_persistence_bottleneck_distance.cpp) + target_link_libraries(alpha_rips_persistence_bottleneck_distance Boost::program_options) - if (TBB_FOUND) - target_link_libraries(alpha_rips_persistence_bottleneck_distance ${TBB_LIBRARIES}) - endif(TBB_FOUND) - - add_test(NAME Bottleneck_distance_example_alpha_rips_persistence_bottleneck - COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.15" "-m" "0.12" "-d" "3" "-p" "3") + if (TBB_FOUND) + target_link_libraries(alpha_rips_persistence_bottleneck_distance ${TBB_LIBRARIES}) + endif(TBB_FOUND) + + add_test(NAME Bottleneck_distance_example_alpha_rips_persistence_bottleneck + COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.15" "-m" "0.12" "-d" "3" "-p" "3") + endif() endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9e4d78ac..cc230531 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.5) project(GUDHI) diff --git a/src/Cech_complex/benchmark/CMakeLists.txt b/src/Cech_complex/benchmark/CMakeLists.txt index c04bca53..bc54c0f3 100644 --- a/src/Cech_complex/benchmark/CMakeLists.txt +++ b/src/Cech_complex/benchmark/CMakeLists.txt @@ -1,12 +1,13 @@ -cmake_minimum_required(VERSION 2.6) project(Cech_complex_benchmark) # Do not forget to copy test files in current binary dir file(COPY "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) -add_executable(cech_complex_benchmark cech_complex_benchmark.cpp) -target_link_libraries(cech_complex_benchmark Boost::filesystem) - -if (TBB_FOUND) - target_link_libraries(cech_complex_benchmark ${TBB_LIBRARIES}) -endif() +if(TARGET Boost::filesystem) + add_executable(cech_complex_benchmark cech_complex_benchmark.cpp) + target_link_libraries(cech_complex_benchmark Boost::filesystem) + + if (TBB_FOUND) + target_link_libraries(cech_complex_benchmark ${TBB_LIBRARIES}) + endif() +endif() \ No newline at end of file diff --git a/src/Cech_complex/example/CMakeLists.txt b/src/Cech_complex/example/CMakeLists.txt index 98757988..1b08c7cb 100644 --- a/src/Cech_complex/example/CMakeLists.txt +++ b/src/Cech_complex/example/CMakeLists.txt @@ -1,13 +1,14 @@ -cmake_minimum_required(VERSION 2.6) project(Cech_complex_examples) -add_executable ( Cech_complex_example_step_by_step cech_complex_step_by_step.cpp ) -target_link_libraries(Cech_complex_example_step_by_step Boost::program_options) -if (TBB_FOUND) - target_link_libraries(Cech_complex_example_step_by_step ${TBB_LIBRARIES}) +if (TARGET Boost::program_options) + add_executable ( Cech_complex_example_step_by_step cech_complex_step_by_step.cpp ) + target_link_libraries(Cech_complex_example_step_by_step Boost::program_options) + if (TBB_FOUND) + target_link_libraries(Cech_complex_example_step_by_step ${TBB_LIBRARIES}) + endif() + add_test(NAME Cech_complex_utility_from_rips_on_tore_3D COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-r" "0.25" "-d" "3") endif() -add_test(NAME Cech_complex_utility_from_rips_on_tore_3D COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-r" "0.25" "-d" "3") add_executable ( Cech_complex_example_from_points cech_complex_example_from_points.cpp) if (TBB_FOUND) diff --git a/src/Cech_complex/test/CMakeLists.txt b/src/Cech_complex/test/CMakeLists.txt index db510af3..e6a2a18f 100644 --- a/src/Cech_complex/test/CMakeLists.txt +++ b/src/Cech_complex/test/CMakeLists.txt @@ -1,6 +1,3 @@ -cmake_minimum_required(VERSION 2.6) -project(Cech_complex_tests) - include(GUDHI_boost_test) add_executable ( Cech_complex_test_unit test_cech_complex.cpp ) diff --git a/src/Cech_complex/utilities/CMakeLists.txt b/src/Cech_complex/utilities/CMakeLists.txt index 253d7304..b183c8d8 100644 --- a/src/Cech_complex/utilities/CMakeLists.txt +++ b/src/Cech_complex/utilities/CMakeLists.txt @@ -1,14 +1,15 @@ -cmake_minimum_required(VERSION 2.6) project(Cech_complex_utilities) -add_executable(cech_persistence cech_persistence.cpp) -target_link_libraries(cech_persistence Boost::program_options) +if (TARGET Boost::program_options) + add_executable(cech_persistence cech_persistence.cpp) + target_link_libraries(cech_persistence Boost::program_options) -if (TBB_FOUND) - target_link_libraries(cech_persistence ${TBB_LIBRARIES}) -endif() + if (TBB_FOUND) + target_link_libraries(cech_persistence ${TBB_LIBRARIES}) + endif() -add_test(NAME Cech_complex_utility_from_rips_on_tore_3D COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") + add_test(NAME Cech_complex_utility_from_rips_on_tore_3D COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") -install(TARGETS cech_persistence DESTINATION bin) + install(TARGETS cech_persistence DESTINATION bin) +endif() \ No newline at end of file diff --git a/src/Collapse/utilities/CMakeLists.txt b/src/Collapse/utilities/CMakeLists.txt index 97fef649..bce99e90 100644 --- a/src/Collapse/utilities/CMakeLists.txt +++ b/src/Collapse/utilities/CMakeLists.txt @@ -1,37 +1,37 @@ project(Collapse_utilities) if (NOT EIGEN3_VERSION VERSION_LESS 3.1.0) - - # From a point cloud - add_executable ( point_cloud_edge_collapse_rips_persistence point_cloud_edge_collapse_rips_persistence.cpp ) - target_link_libraries(point_cloud_edge_collapse_rips_persistence Boost::program_options) - - if (TBB_FOUND) - target_link_libraries(point_cloud_edge_collapse_rips_persistence ${TBB_LIBRARIES}) - endif() - add_test(NAME Edge_collapse_utilities_point_cloud_rips_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3" "-o" "off_results.pers") - - install(TARGETS point_cloud_edge_collapse_rips_persistence DESTINATION bin) - - # From a distance matrix - add_executable ( distance_matrix_edge_collapse_rips_persistence distance_matrix_edge_collapse_rips_persistence.cpp ) - target_link_libraries(distance_matrix_edge_collapse_rips_persistence Boost::program_options) - - if (TBB_FOUND) - target_link_libraries(distance_matrix_edge_collapse_rips_persistence ${TBB_LIBRARIES}) - endif() - add_test(NAME Edge_collapse_utilities_distance_matrix_rips_persistence COMMAND $ - "${CMAKE_SOURCE_DIR}/data/distance_matrix/tore3D_1307_distance_matrix.csv" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3" "-o" "csv_results.pers") - - install(TARGETS distance_matrix_edge_collapse_rips_persistence DESTINATION bin) - - if (DIFF_PATH) - add_test(Edge_collapse_utilities_diff_persistence ${DIFF_PATH} - "off_results.pers" "csv_results.pers") - set_tests_properties(Edge_collapse_utilities_diff_persistence PROPERTIES DEPENDS - "Edge_collapse_utilities_point_cloud_rips_persistence;Edge_collapse_utilities_distance_matrix_rips_persistence") - + if (TARGET Boost::program_options) + # From a point cloud + add_executable ( point_cloud_edge_collapse_rips_persistence point_cloud_edge_collapse_rips_persistence.cpp ) + target_link_libraries(point_cloud_edge_collapse_rips_persistence Boost::program_options) + + if (TBB_FOUND) + target_link_libraries(point_cloud_edge_collapse_rips_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Edge_collapse_utilities_point_cloud_rips_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3" "-o" "off_results.pers") + + install(TARGETS point_cloud_edge_collapse_rips_persistence DESTINATION bin) + + # From a distance matrix + add_executable ( distance_matrix_edge_collapse_rips_persistence distance_matrix_edge_collapse_rips_persistence.cpp ) + target_link_libraries(distance_matrix_edge_collapse_rips_persistence Boost::program_options) + + if (TBB_FOUND) + target_link_libraries(distance_matrix_edge_collapse_rips_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Edge_collapse_utilities_distance_matrix_rips_persistence COMMAND $ + "${CMAKE_SOURCE_DIR}/data/distance_matrix/tore3D_1307_distance_matrix.csv" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3" "-o" "csv_results.pers") + + install(TARGETS distance_matrix_edge_collapse_rips_persistence DESTINATION bin) + + if (DIFF_PATH) + add_test(Edge_collapse_utilities_diff_persistence ${DIFF_PATH} + "off_results.pers" "csv_results.pers") + set_tests_properties(Edge_collapse_utilities_diff_persistence PROPERTIES DEPENDS + "Edge_collapse_utilities_point_cloud_rips_persistence;Edge_collapse_utilities_distance_matrix_rips_persistence") + endif() endif() endif() \ No newline at end of file diff --git a/src/Persistent_cohomology/benchmark/CMakeLists.txt b/src/Persistent_cohomology/benchmark/CMakeLists.txt index f38cc543..ad8dc84b 100644 --- a/src/Persistent_cohomology/benchmark/CMakeLists.txt +++ b/src/Persistent_cohomology/benchmark/CMakeLists.txt @@ -2,11 +2,13 @@ project(Persistent_cohomology_benchmark) if(GMP_FOUND) if(GMPXX_FOUND) - add_executable ( performance_rips_persistence EXCLUDE_FROM_ALL performance_rips_persistence.cpp ) - target_link_libraries(performance_rips_persistence Boost::program_options ${GMPXX_LIBRARIES} ${GMP_LIBRARIES}) - if (TBB_FOUND) - target_link_libraries(performance_rips_persistence ${TBB_LIBRARIES}) - endif(TBB_FOUND) - file(COPY "${CMAKE_SOURCE_DIR}/data/points/Kl.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) + if (TARGET Boost::program_options) + add_executable ( performance_rips_persistence EXCLUDE_FROM_ALL performance_rips_persistence.cpp ) + target_link_libraries(performance_rips_persistence Boost::program_options ${GMPXX_LIBRARIES} ${GMP_LIBRARIES}) + if (TBB_FOUND) + target_link_libraries(performance_rips_persistence ${TBB_LIBRARIES}) + endif(TBB_FOUND) + file(COPY "${CMAKE_SOURCE_DIR}/data/points/Kl.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) + endif() endif(GMPXX_FOUND) endif(GMP_FOUND) diff --git a/src/Persistent_cohomology/example/CMakeLists.txt b/src/Persistent_cohomology/example/CMakeLists.txt index 4c08cd68..d6a92ed6 100644 --- a/src/Persistent_cohomology/example/CMakeLists.txt +++ b/src/Persistent_cohomology/example/CMakeLists.txt @@ -1,46 +1,58 @@ project(Persistent_cohomology_examples) add_executable(plain_homology plain_homology.cpp) +if (TBB_FOUND) + target_link_libraries(plain_homology ${TBB_LIBRARIES}) +endif() +add_test(NAME Persistent_cohomology_example_plain_homology COMMAND $) +install(TARGETS plain_homology DESTINATION bin) add_executable(persistence_from_simple_simplex_tree persistence_from_simple_simplex_tree.cpp) - -add_executable(rips_persistence_step_by_step rips_persistence_step_by_step.cpp) -target_link_libraries(rips_persistence_step_by_step Boost::program_options) - -add_executable(rips_persistence_via_boundary_matrix rips_persistence_via_boundary_matrix.cpp) -target_link_libraries(rips_persistence_via_boundary_matrix Boost::program_options) - -add_executable(persistence_from_file persistence_from_file.cpp) -target_link_libraries(persistence_from_file Boost::program_options) - if (TBB_FOUND) - target_link_libraries(plain_homology ${TBB_LIBRARIES}) target_link_libraries(persistence_from_simple_simplex_tree ${TBB_LIBRARIES}) - target_link_libraries(rips_persistence_step_by_step ${TBB_LIBRARIES}) - target_link_libraries(rips_persistence_via_boundary_matrix ${TBB_LIBRARIES}) - target_link_libraries(persistence_from_file ${TBB_LIBRARIES}) endif() - -add_test(NAME Persistent_cohomology_example_plain_homology COMMAND $) add_test(NAME Persistent_cohomology_example_from_simple_simplex_tree COMMAND $ "1" "0") -add_test(NAME Persistent_cohomology_example_from_rips_step_by_step_on_tore_3D COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") -add_test(NAME Persistent_cohomology_example_via_boundary_matrix COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/Kl.off" "-r" "0.16" "-d" "3" "-p" "3" "-m" "100") -add_test(NAME Persistent_cohomology_example_from_file_3_2_0 COMMAND $ - "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "2" "-m" "0") -add_test(NAME Persistent_cohomology_example_from_file_3_3_100 COMMAND $ - "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "3" "-m" "100") - -install(TARGETS plain_homology DESTINATION bin) install(TARGETS persistence_from_simple_simplex_tree DESTINATION bin) -install(TARGETS rips_persistence_step_by_step DESTINATION bin) -install(TARGETS rips_persistence_via_boundary_matrix DESTINATION bin) -install(TARGETS persistence_from_file DESTINATION bin) + +if(TARGET Boost::program_options) + add_executable(rips_persistence_step_by_step rips_persistence_step_by_step.cpp) + target_link_libraries(rips_persistence_step_by_step Boost::program_options) + if (TBB_FOUND) + target_link_libraries(rips_persistence_step_by_step ${TBB_LIBRARIES}) + endif() + add_test(NAME Persistent_cohomology_example_from_rips_step_by_step_on_tore_3D COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") + install(TARGETS rips_persistence_step_by_step DESTINATION bin) +endif() + +if(TARGET Boost::program_options) + add_executable(rips_persistence_via_boundary_matrix rips_persistence_via_boundary_matrix.cpp) + target_link_libraries(rips_persistence_via_boundary_matrix Boost::program_options) + if (TBB_FOUND) + target_link_libraries(rips_persistence_via_boundary_matrix ${TBB_LIBRARIES}) + endif() + add_test(NAME Persistent_cohomology_example_via_boundary_matrix COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/Kl.off" "-r" "0.16" "-d" "3" "-p" "3" "-m" "100") + install(TARGETS rips_persistence_via_boundary_matrix DESTINATION bin) +endif() + +if(TARGET Boost::program_options) + add_executable(persistence_from_file persistence_from_file.cpp) + target_link_libraries(persistence_from_file Boost::program_options) + if (TBB_FOUND) + target_link_libraries(persistence_from_file ${TBB_LIBRARIES}) + endif() + add_test(NAME Persistent_cohomology_example_from_file_3_2_0 COMMAND $ + "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "2" "-m" "0") + add_test(NAME Persistent_cohomology_example_from_file_3_3_100 COMMAND $ + "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "3" "-m" "100") + install(TARGETS persistence_from_file DESTINATION bin) +endif() if(GMP_FOUND) - if(GMPXX_FOUND) + if(GMPXX_FOUND) + if(TARGET Boost::program_options) add_executable(rips_multifield_persistence rips_multifield_persistence.cpp ) target_link_libraries(rips_multifield_persistence Boost::program_options ${GMPXX_LIBRARIES} ${GMP_LIBRARIES}) @@ -50,19 +62,16 @@ if(GMP_FOUND) add_test(NAME Persistent_cohomology_example_multifield_2_71 COMMAND $ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "2" "-q" "71") install(TARGETS rips_multifield_persistence DESTINATION bin) - endif(GMPXX_FOUND) + endif() + endif(GMPXX_FOUND) endif(GMP_FOUND) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) - add_executable(custom_persistence_sort custom_persistence_sort.cpp) target_link_libraries(custom_persistence_sort ${CGAL_LIBRARY}) - if (TBB_FOUND) target_link_libraries(custom_persistence_sort ${TBB_LIBRARIES}) endif(TBB_FOUND) add_test(NAME Persistent_cohomology_example_custom_persistence_sort COMMAND $) - install(TARGETS custom_persistence_sort DESTINATION bin) - endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) diff --git a/src/Rips_complex/utilities/CMakeLists.txt b/src/Rips_complex/utilities/CMakeLists.txt index d2448d7b..2081f142 100644 --- a/src/Rips_complex/utilities/CMakeLists.txt +++ b/src/Rips_complex/utilities/CMakeLists.txt @@ -1,34 +1,45 @@ project(Rips_complex_utilities) -add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp) -target_link_libraries(rips_distance_matrix_persistence Boost::program_options) - -add_executable(rips_persistence rips_persistence.cpp) -target_link_libraries(rips_persistence Boost::program_options) - -add_executable(rips_correlation_matrix_persistence rips_correlation_matrix_persistence.cpp) -target_link_libraries(rips_correlation_matrix_persistence Boost::system Boost::program_options) - -add_executable(sparse_rips_persistence sparse_rips_persistence.cpp) -target_link_libraries(sparse_rips_persistence Boost::program_options) +if(TARGET Boost::program_options) + add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp) + target_link_libraries(rips_distance_matrix_persistence Boost::program_options) + if (TBB_FOUND) + target_link_libraries(rips_distance_matrix_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Rips_complex_utility_from_rips_distance_matrix COMMAND $ + "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "-r" "1.0" "-d" "3" "-p" "3" "-m" "0") + install(TARGETS rips_distance_matrix_persistence DESTINATION bin) +endif() -if (TBB_FOUND) - target_link_libraries(rips_distance_matrix_persistence ${TBB_LIBRARIES}) - target_link_libraries(rips_persistence ${TBB_LIBRARIES}) - target_link_libraries(rips_correlation_matrix_persistence ${TBB_LIBRARIES}) - target_link_libraries(sparse_rips_persistence ${TBB_LIBRARIES}) +if(TARGET Boost::program_options) + add_executable(rips_persistence rips_persistence.cpp) + target_link_libraries(rips_persistence Boost::program_options) + if (TBB_FOUND) + target_link_libraries(rips_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Rips_complex_utility_from_rips_on_tore_3D COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") + install(TARGETS rips_persistence DESTINATION bin) endif() -add_test(NAME Rips_complex_utility_from_rips_distance_matrix COMMAND $ - "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "-r" "1.0" "-d" "3" "-p" "3" "-m" "0") -add_test(NAME Rips_complex_utility_from_rips_on_tore_3D COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") -add_test(NAME Rips_complex_utility_from_rips_correlation_matrix COMMAND $ - "${CMAKE_SOURCE_DIR}/data/correlation_matrix/lower_triangular_correlation_matrix.csv" "-c" "0.3" "-d" "3" "-p" "3" "-m" "0") -add_test(NAME Sparse_rips_complex_utility_on_tore_3D COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-e" "0.5" "-m" "0.2" "-d" "3" "-p" "2") +if(TARGET Boost::program_options) + add_executable(rips_correlation_matrix_persistence rips_correlation_matrix_persistence.cpp) + target_link_libraries(rips_correlation_matrix_persistence Boost::system Boost::program_options) + if (TBB_FOUND) + target_link_libraries(rips_correlation_matrix_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Rips_complex_utility_from_rips_correlation_matrix COMMAND $ + "${CMAKE_SOURCE_DIR}/data/correlation_matrix/lower_triangular_correlation_matrix.csv" "-c" "0.3" "-d" "3" "-p" "3" "-m" "0") + install(TARGETS rips_correlation_matrix_persistence DESTINATION bin) +endif() -install(TARGETS rips_distance_matrix_persistence DESTINATION bin) -install(TARGETS rips_persistence DESTINATION bin) -install(TARGETS rips_correlation_matrix_persistence DESTINATION bin) -install(TARGETS sparse_rips_persistence DESTINATION bin) +if(TARGET Boost::program_options) + add_executable(sparse_rips_persistence sparse_rips_persistence.cpp) + target_link_libraries(sparse_rips_persistence Boost::program_options) + if (TBB_FOUND) + target_link_libraries(sparse_rips_persistence ${TBB_LIBRARIES}) + endif() + add_test(NAME Sparse_rips_complex_utility_on_tore_3D COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-e" "0.5" "-m" "0.2" "-d" "3" "-p" "2") + install(TARGETS sparse_rips_persistence DESTINATION bin) +endif() diff --git a/src/Simplex_tree/example/CMakeLists.txt b/src/Simplex_tree/example/CMakeLists.txt index a0aabee2..73b2c6f9 100644 --- a/src/Simplex_tree/example/CMakeLists.txt +++ b/src/Simplex_tree/example/CMakeLists.txt @@ -34,13 +34,15 @@ if(GMP_FOUND AND NOT CGAL_VERSION VERSION_LESS 4.11.0) endif() if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) - add_executable ( Simplex_tree_example_cech_complex_cgal_mini_sphere_3d cech_complex_cgal_mini_sphere_3d.cpp ) - target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d Boost::program_options ${CGAL_LIBRARY}) - if (TBB_FOUND) - target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d ${TBB_LIBRARIES}) + if(TARGET Boost::program_options) + add_executable ( Simplex_tree_example_cech_complex_cgal_mini_sphere_3d cech_complex_cgal_mini_sphere_3d.cpp ) + target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d Boost::program_options ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d ${TBB_LIBRARIES}) + endif() + add_test(NAME Simplex_tree_example_cech_complex_cgal_mini_sphere_3d COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" -r 0.3 -d 3) endif() - add_test(NAME Simplex_tree_example_cech_complex_cgal_mini_sphere_3d COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" -r 0.3 -d 3) endif () add_executable ( Simplex_tree_example_graph_expansion_with_blocker graph_expansion_with_blocker.cpp ) diff --git a/src/Witness_complex/utilities/CMakeLists.txt b/src/Witness_complex/utilities/CMakeLists.txt index d986d2d1..60fea0b4 100644 --- a/src/Witness_complex/utilities/CMakeLists.txt +++ b/src/Witness_complex/utilities/CMakeLists.txt @@ -2,26 +2,26 @@ project(Witness_complex_utilities) # CGAL and Eigen3 are required for Euclidean version of Witness if(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) - - add_executable ( Witness_complex_strong_witness_persistence strong_witness_persistence.cpp ) - target_link_libraries(Witness_complex_strong_witness_persistence Boost::program_options) + if(TARGET Boost::program_options) + add_executable ( Witness_complex_strong_witness_persistence strong_witness_persistence.cpp ) + target_link_libraries(Witness_complex_strong_witness_persistence Boost::program_options) - add_executable ( Witness_complex_weak_witness_persistence weak_witness_persistence.cpp ) - target_link_libraries(Witness_complex_weak_witness_persistence Boost::program_options) + add_executable ( Witness_complex_weak_witness_persistence weak_witness_persistence.cpp ) + target_link_libraries(Witness_complex_weak_witness_persistence Boost::program_options) - if (TBB_FOUND) - target_link_libraries(Witness_complex_strong_witness_persistence ${TBB_LIBRARIES}) - target_link_libraries(Witness_complex_weak_witness_persistence ${TBB_LIBRARIES}) - endif() - - add_test(NAME Witness_complex_strong_test_torus_persistence - COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5") - add_test(NAME Witness_complex_weak_test_torus_persistence - COMMAND $ - "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5") + if (TBB_FOUND) + target_link_libraries(Witness_complex_strong_witness_persistence ${TBB_LIBRARIES}) + target_link_libraries(Witness_complex_weak_witness_persistence ${TBB_LIBRARIES}) + endif() - install(TARGETS Witness_complex_strong_witness_persistence DESTINATION bin) - install(TARGETS Witness_complex_weak_witness_persistence DESTINATION bin) + add_test(NAME Witness_complex_strong_test_torus_persistence + COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5") + add_test(NAME Witness_complex_weak_test_torus_persistence + COMMAND $ + "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5") + install(TARGETS Witness_complex_strong_witness_persistence DESTINATION bin) + install(TARGETS Witness_complex_weak_witness_persistence DESTINATION bin) + endif() endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) diff --git a/src/cmake/modules/GUDHI_modules.cmake b/src/cmake/modules/GUDHI_modules.cmake index aab1dd08..ccaf1ac5 100644 --- a/src/cmake/modules/GUDHI_modules.cmake +++ b/src/cmake/modules/GUDHI_modules.cmake @@ -30,7 +30,12 @@ if (WITH_GUDHI_EXAMPLE) set(GUDHI_SUB_DIRECTORIES "${GUDHI_SUB_DIRECTORIES};example") endif() if (WITH_GUDHI_TEST) - set(GUDHI_SUB_DIRECTORIES "${GUDHI_SUB_DIRECTORIES};test") + # All tests are using boost tests + if(TARGET Boost::unit_test_framework) + set(GUDHI_SUB_DIRECTORIES "${GUDHI_SUB_DIRECTORIES};test") + else() + message("++ WITH_GUDHI_TEST but no TARGET Boost::unit_test_framework") + endif() endif() if (WITH_GUDHI_UTILITIES) set(GUDHI_SUB_DIRECTORIES "${GUDHI_SUB_DIRECTORIES};utilities") diff --git a/src/cmake/modules/GUDHI_third_party_libraries.cmake b/src/cmake/modules/GUDHI_third_party_libraries.cmake index a56a2756..489f3de5 100644 --- a/src/cmake/modules/GUDHI_third_party_libraries.cmake +++ b/src/cmake/modules/GUDHI_third_party_libraries.cmake @@ -1,42 +1,11 @@ # This files manage third party libraries required by GUDHI -find_package(Boost 1.56.0 REQUIRED COMPONENTS system filesystem unit_test_framework program_options thread) +find_package(Boost 1.56.0 QUIET OPTIONAL_COMPONENTS system thread filesystem unit_test_framework program_options) -if(NOT Boost_FOUND) +# Boost_FOUND is not reliable +if(NOT Boost_VERSION) message(FATAL_ERROR "NOTICE: This program requires Boost and will not be compiled.") -endif(NOT Boost_FOUND) - -# cf. https://cliutils.gitlab.io/modern-cmake/chapters/packages/Boost.html -# This is needed if your Boost version is newer than your CMake version -# or if you have an old version of CMake (<3.5) -if(NOT TARGET Boost::program_options) - add_library(Boost::program_options IMPORTED INTERFACE) - set_property(TARGET Boost::program_options PROPERTY - INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR}) - set_property(TARGET Boost::program_options PROPERTY - INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES}) -endif() -if(NOT TARGET Boost::filesystem) - add_library(Boost::filesystem IMPORTED INTERFACE) - set_property(TARGET Boost::filesystem PROPERTY - INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR}) - set_property(TARGET Boost::filesystem PROPERTY - INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES}) -endif() -if(NOT TARGET Boost::unit_test_framework) - add_library(Boost::unit_test_framework IMPORTED INTERFACE) - set_property(TARGET Boost::unit_test_framework PROPERTY - INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR}) - set_property(TARGET Boost::unit_test_framework PROPERTY - INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES}) -endif() -if(NOT TARGET Boost::system) - add_library(Boost::system IMPORTED INTERFACE) - set_property(TARGET Boost::system PROPERTY - INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR}) - set_property(TARGET Boost::system PROPERTY - INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES}) -endif() +endif(NOT Boost_VERSION) find_package(GMP) if(GMP_FOUND) diff --git a/src/common/doc/installation.h b/src/common/doc/installation.h index 6af645e2..9df1c2f0 100644 --- a/src/common/doc/installation.h +++ b/src/common/doc/installation.h @@ -6,7 +6,7 @@ * * \section compiling Compiling * The library uses c++14 and requires Boost ≥ 1.56.0 - * and CMake ≥ 3.1. + * and CMake ≥ 3.5. * It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015. * * \subsection utilities Utilities and examples @@ -17,8 +17,8 @@ cd build/ cmake -DCMAKE_BUILD_TYPE=Release .. make \endverbatim * By default, examples are disabled. You can activate their compilation with - * ccmake (on Linux and Mac OSX), - * cmake-gui (on Windows) or by modifying the + * ccmake (on Linux and Mac OSX), + * cmake-gui (on Windows) or by modifying the * cmake command as follows : \verbatim cmake -DCMAKE_BUILD_TYPE=Release -DWITH_GUDHI_EXAMPLE=ON .. make \endverbatim @@ -28,7 +28,7 @@ make \endverbatim * To install the library (headers and activated utilities), run the following command in a terminal: * \verbatim make install \endverbatim * This action may require to be in the sudoer or administrator of the machine in function of the operating system and - * of CMAKE_INSTALL_PREFIX. + * of CMAKE_INSTALL_PREFIX. * * \subsection testsuites Test suites * To test your build, run the following command in a terminal: diff --git a/src/python/doc/installation.rst b/src/python/doc/installation.rst index 4cc31d5c..2f161d66 100644 --- a/src/python/doc/installation.rst +++ b/src/python/doc/installation.rst @@ -40,7 +40,7 @@ different, and in particular the `python/` subdirectory is actually `src/python/ there. The library uses c++14 and requires `Boost `_ :math:`\geq` 1.56.0, -`CMake `_ :math:`\geq` 3.1 to generate makefiles, +`CMake `_ :math:`\geq` 3.5 to generate makefiles, `NumPy `_, `Cython `_ and `pybind11 `_ to compile the GUDHI Python module. -- cgit v1.2.3 From 171ddab9b7a50f0303d7201fa547dbfb445f9698 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 11 Sep 2020 11:55:55 +0200 Subject: Requires CGAL >= 5.1. Fix is_gabriel computation --- src/Alpha_complex/example/CMakeLists.txt | 14 +++++++++----- .../example/Weighted_alpha_complex_from_points.cpp | 14 +++++++------- src/Alpha_complex/include/gudhi/Alpha_complex.h | 8 ++++++-- .../include/gudhi/Alpha_complex/Alpha_kernel_d.h | 17 ++++------------- src/Alpha_complex/test/CMakeLists.txt | 13 +++++++++---- 5 files changed, 35 insertions(+), 31 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt index 17dc896c..1fc2330a 100644 --- a/src/Alpha_complex/example/CMakeLists.txt +++ b/src/Alpha_complex/example/CMakeLists.txt @@ -7,13 +7,10 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) target_link_libraries(Alpha_complex_example_from_off ${CGAL_LIBRARY}) add_executable ( Alpha_complex_example_fast_from_off Fast_alpha_complex_from_off.cpp ) target_link_libraries(Alpha_complex_example_fast_from_off ${CGAL_LIBRARY}) - add_executable ( Weighted_alpha_complex_example_from_points Weighted_alpha_complex_from_points.cpp ) - target_link_libraries(Weighted_alpha_complex_example_from_points ${CGAL_LIBRARY}) if (TBB_FOUND) target_link_libraries(Alpha_complex_example_from_points ${TBB_LIBRARIES}) target_link_libraries(Alpha_complex_example_from_off ${TBB_LIBRARIES}) target_link_libraries(Alpha_complex_example_fast_from_off ${TBB_LIBRARIES}) - target_link_libraries(Weighted_alpha_complex_example_from_points ${TBB_LIBRARIES}) endif() add_test(NAME Alpha_complex_example_from_points COMMAND $) @@ -28,8 +25,6 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) add_test(NAME Alpha_complex_example_fast_from_off_32 COMMAND $ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "32.0" "${CMAKE_CURRENT_BINARY_DIR}/fastalphaoffreader_result_32.txt") - add_test(NAME Weighted_alpha_complex_example_from_points COMMAND $) - if (DIFF_PATH) # Do not forget to copy test results files in current binary dir file(COPY "alphaoffreader_for_doc_32.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) @@ -69,3 +64,12 @@ if (NOT CGAL_VERSION VERSION_LESS 4.11.0) COMMAND $) endif(NOT CGAL_VERSION VERSION_LESS 4.11.0) + +if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) + add_executable ( Weighted_alpha_complex_example_from_points Weighted_alpha_complex_from_points.cpp ) + target_link_libraries(Weighted_alpha_complex_example_from_points ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Weighted_alpha_complex_example_from_points ${TBB_LIBRARIES}) + endif() + add_test(NAME Weighted_alpha_complex_example_from_points COMMAND $) +endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp index 05858084..19a04282 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp @@ -18,13 +18,13 @@ int main() { // Init of a list of points // ---------------------------------------------------------------------------- Vector_of_points points; - points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 0.)); - points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 0.)); - points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 0.)); - points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 0.)); - points.push_back(Weighted_point(Bare_point(0.0, 14.0), 0.)); - points.push_back(Weighted_point(Bare_point(2.0, 19.0), 0.)); - points.push_back(Weighted_point(Bare_point(9.0, 17.0), 0.)); + points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 1.)); + points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 1.)); + points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 1.)); + points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 1.)); + points.push_back(Weighted_point(Bare_point(0.0, 14.0), 1.)); + points.push_back(Weighted_point(Bare_point(2.0, 19.0), 1.)); + points.push_back(Weighted_point(Bare_point(9.0, 17.0), 1.)); // ---------------------------------------------------------------------------- // Init of an alpha complex from the list of points diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 8e9fe773..4316d9bc 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -210,6 +210,11 @@ class Alpha_complex { << std::endl; #endif +#if CGAL_VERSION_NR < 1050101000 + // Make compilation fail if weighted and CGAL < 5.1 + static_assert(!Weighted, "Weighted Alpha_complex is only available for CGAL >= 5.1"); +#endif + auto first = std::begin(points); auto last = std::end(points); @@ -457,8 +462,7 @@ class Alpha_complex { while(shortiter != enditer && *longiter == *shortiter) { ++longiter; ++shortiter; } Vertex_handle extra = *longiter; auto const& cache=get_cache(complex, f_boundary); - bool is_gab = kernel_.get_squared_distance(kernel_.get_circumcenter(cache), get_point_(extra)) >= - kernel_.get_squared_radius(cache); + bool is_gab = kernel_.is_gabriel(cache, get_point_(extra)); #ifdef DEBUG_TRACES std::clog << " | Tau is_gabriel(Sigma)=" << is_gab << " - vertexForGabriel=" << extra << std::endl; #endif // DEBUG_TRACES diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index a3e3845a..b64e4f59 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -71,13 +71,8 @@ class Alpha_kernel_d { return sph.second; } - auto get_circumcenter(const Sphere& sph) const { - return sph.first; - } - - template - FT get_squared_distance(const Point& first, const Point& second) const { - return kernel_.squared_distance_d_object()(first, second); + bool is_gabriel(const Sphere& circumcenter, const Point_d& point) { + return kernel_.squared_distance_d_object()(circumcenter.first, point) >= circumcenter.second; } }; @@ -116,12 +111,8 @@ class Alpha_kernel_d { return sph.weight(); } - auto get_circumcenter(const Sphere& sph) const { - return sph; - } - - FT get_squared_distance(const Weighted_point_d& first, const Weighted_point_d& second) const { - return kernel_.power_distance_d_object()(first, second); + bool is_gabriel(const Sphere& circumcenter, const Weighted_point_d& point) { + return kernel_.power_distance_d_object()(circumcenter, point) >= 0; } }; diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt index 71e4ea7c..837d2948 100644 --- a/src/Alpha_complex/test/CMakeLists.txt +++ b/src/Alpha_complex/test/CMakeLists.txt @@ -10,17 +10,13 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) target_link_libraries(Alpha_complex_test_unit ${CGAL_LIBRARY}) add_executable ( Delaunay_complex_test_unit Delaunay_complex_unit_test.cpp ) target_link_libraries(Delaunay_complex_test_unit ${CGAL_LIBRARY}) - add_executable ( Alpha_kernel_d_test_unit Alpha_kernel_d_unit_test.cpp ) - target_link_libraries(Alpha_kernel_d_test_unit ${CGAL_LIBRARY}) if (TBB_FOUND) target_link_libraries(Alpha_complex_test_unit ${TBB_LIBRARIES}) target_link_libraries(Delaunay_complex_test_unit ${TBB_LIBRARIES}) - target_link_libraries(Alpha_kernel_d_test_unit ${TBB_LIBRARIES}) endif() gudhi_add_boost_test(Alpha_complex_test_unit) gudhi_add_boost_test(Delaunay_complex_test_unit) - gudhi_add_boost_test(Alpha_kernel_d_test_unit) endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) @@ -47,3 +43,12 @@ if (NOT CGAL_VERSION VERSION_LESS 4.11.0) gudhi_add_boost_test(Weighted_periodic_alpha_complex_3d_test_unit) endif (NOT CGAL_VERSION VERSION_LESS 4.11.0) + +if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) + add_executable ( Alpha_kernel_d_test_unit Alpha_kernel_d_unit_test.cpp ) + target_link_libraries(Alpha_kernel_d_test_unit ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Alpha_kernel_d_test_unit ${TBB_LIBRARIES}) + endif() + gudhi_add_boost_test(Alpha_kernel_d_test_unit) +endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) \ No newline at end of file -- cgit v1.2.3 From d299e943d6fd07a58a270fe685dac7b5d5d23964 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 11 Sep 2020 14:35:39 +0200 Subject: fonction was renamed between 5.1 and 5.2 --- .../include/gudhi/Alpha_complex/Alpha_kernel_d.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index b64e4f59..a4824207 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -82,6 +82,7 @@ class Alpha_kernel_d { private: // Kernel for functions access. Kernel kernel_; + public: // Fake type for compilation to succeed (cf. std::conditional in Alpha_complex.h) using Point_d = void; @@ -98,7 +99,13 @@ class Alpha_kernel_d { template Sphere get_sphere(PointIterator begin, PointIterator end) const { + // power_center_d_object has been renamed between CGAL 5.1 and 5.2 +#if defined CGAL_VERSION_NR >= 1050101000 && defined CGAL_VERSION_NR < 1050201000 return kernel_.power_center_d_object()(begin, end); +#endif +#if CGAL_VERSION_NR >= 1050201000 + return kernel_.construct_power_sphere_d_object()(begin, end); +#endif } template @@ -112,7 +119,13 @@ class Alpha_kernel_d { } bool is_gabriel(const Sphere& circumcenter, const Weighted_point_d& point) { + // power_center_d_object has been renamed between CGAL 5.1 and 5.2 +#if defined CGAL_VERSION_NR >= 1050101000 && defined CGAL_VERSION_NR < 1050201000 return kernel_.power_distance_d_object()(circumcenter, point) >= 0; +#endif +#if CGAL_VERSION_NR >= 1050201000 + return kernel_.compute_power_product_d_object()(circumcenter, point) >= 0; +#endif } }; -- cgit v1.2.3 From 54e0cec31e556c88d9f8107394ad972883fdbbdf Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 11 Sep 2020 17:41:39 +0200 Subject: Add weighted ctor and its test --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 26 +++++++ src/Alpha_complex/test/CMakeLists.txt | 8 +++ .../test/Weighted_alpha_complex_unit_test.cpp | 82 ++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 4316d9bc..00231e1c 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -31,6 +31,10 @@ #include // for EIGEN_VERSION_AT_LEAST +#include +#include +#include + #include #include #include @@ -179,6 +183,28 @@ class Alpha_complex { init_from_range(points); } + /** \brief Alpha_complex constructor from a list of points and weights. + * + * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous. + * + * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. + * + * @param[in] weights Range of points weights. Weights must be in Kernel::FT. + * + * The type InputPointRange must be a range for which std::begin and + * std::end return input iterators on a Kernel::Point_d. + */ + template + Alpha_complex(const InputPointRange& points, WeightRange weights) { + static_assert(Weighted, "This constructor is not available for non-weighted versions of Alpha_complex_3d"); + // FIXME: this test is only valid if we have a forward range + GUDHI_CHECK(boost::size(weights) == boost::size(points), + std::invalid_argument("Points number in range different from weights range number")); + auto weighted_points = boost::range::combine(points, weights) + | boost::adaptors::transformed([](auto const&t){return Point_d(boost::get<0>(t), boost::get<1>(t));}); + init_from_range(weighted_points); + } + /** \brief Alpha_complex destructor deletes the Delaunay triangulation. */ ~Alpha_complex() { diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt index 837d2948..db5d840f 100644 --- a/src/Alpha_complex/test/CMakeLists.txt +++ b/src/Alpha_complex/test/CMakeLists.txt @@ -51,4 +51,12 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) target_link_libraries(Alpha_kernel_d_test_unit ${TBB_LIBRARIES}) endif() gudhi_add_boost_test(Alpha_kernel_d_test_unit) + + add_executable ( Weighted_alpha_complex_test_unit Weighted_alpha_complex_unit_test.cpp ) + target_link_libraries(Weighted_alpha_complex_test_unit ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Weighted_alpha_complex_test_unit ${TBB_LIBRARIES}) + endif() + gudhi_add_boost_test(Weighted_alpha_complex_test_unit) + endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) \ No newline at end of file diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp new file mode 100644 index 00000000..b4fc76de --- /dev/null +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -0,0 +1,82 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2020 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "weighted_alpha_complex" +#include +#include + +#include +#include + +#include // float comparison +#include +#include + +#include +#include +#include + +// Use dynamic_dimension_tag for the user to be able to set dimension +typedef CGAL::Epeck_d< CGAL::Dynamic_dimension_tag > Exact_kernel_d; +// Use static dimension_tag for the user not to be able to set dimension +typedef CGAL::Epeck_d< CGAL::Dimension_tag<4> > Exact_kernel_s; +// Use dynamic_dimension_tag for the user to be able to set dimension +typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Inexact_kernel_d; +// Use static dimension_tag for the user not to be able to set dimension +typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Inexact_kernel_s; +// The triangulation uses the default instantiation of the TriangulationDataStructure template parameter + +typedef boost::mpl::list list_of_kernel_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kernel_variants) { + // Random points construction + using Point_d = typename Kernel::Point_d; + std::vector points; + std::uniform_real_distribution rd_pts(-10., 10.); + std::random_device rand_dev; + std::mt19937 rand_engine(rand_dev()); + for (int idx = 0; idx < 20; idx++) { + std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; + points.emplace_back(Point_d(point.begin(), point.end())); + } + + // Alpha complex from points + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); + Gudhi::Simplex_tree<> simplex; + BOOST_CHECK(alpha_complex_from_points.create_complex(simplex)); + std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : simplex.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + + // Alpha complex from zero weighted points + std::vector weights(20, 0.); + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_zero_weighted_points(points, weights); + Gudhi::Simplex_tree<> zw_simplex; + BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex)); + + std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : zw_simplex.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : zw_simplex.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << zw_simplex.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + + BOOST_CHECK(zw_simplex == simplex); +} \ No newline at end of file -- cgit v1.2.3 From 5e3871c2d99249bd7560faa4e1229d3b3751b0ff Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 14 Sep 2020 11:17:40 +0200 Subject: alpha_complex_persistence utils can use weighted points. Update Alpha_kernel_d_unit_test to work --- .../test/Alpha_kernel_d_unit_test.cpp | 28 ------ .../test/Weighted_alpha_complex_unit_test.cpp | 2 +- .../utilities/alpha_complex_persistence.cpp | 101 ++++++++++++++++----- src/Alpha_complex/utilities/alphacomplex.md | 7 ++ 4 files changed, 84 insertions(+), 54 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp index 70b65aad..192834b3 100644 --- a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp +++ b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp @@ -102,31 +102,3 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_sphere, TestedKernel, list_of_kerne std::clog << "Squared radius is " << w_sq_rd << std::endl; GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(w_sphere.weight()), cast_to_double(w_sq_rd)); } - - -BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_distance, TestedKernel, list_of_kernel_variants) { - using Unweighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; - - std::vector p0 {1., 0., 0., 0.}; - std::vector p1 {0., 1., 0., 0.}; - - using Point_d = typename Unweighted_kernel::Point_d; - Unweighted_kernel kernel; - auto dist_01 = kernel.get_squared_distance(Point_d(p0.begin(), p0.end()), Point_d(p1.begin(), p1.end())); - std::clog << "Distance is " << dist_01 << std::endl; - - using Weighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; - - using Weighted_point_d = typename Weighted_kernel::Weighted_point_d; - using Bare_point_d = typename Weighted_kernel::Bare_point_d; - std::vector w_pts; - - Weighted_kernel w_kernel; - auto w_dist_01 = w_kernel.get_squared_distance(Weighted_point_d(Bare_point_d(p0.begin(), p0.end()), 0.), - Weighted_point_d(Bare_point_d(p1.begin(), p1.end()), 0.)); - std::clog << "Distance is " << w_dist_01 << std::endl; - - CGAL::NT_converter cast_to_double; - // The results shall be the same with weights = 0. - GUDHI_TEST_FLOAT_EQUALITY_CHECK(cast_to_double(dist_01), cast_to_double(w_dist_01)); -} diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index b4fc76de..57a57058 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -32,7 +33,6 @@ typedef CGAL::Epeck_d< CGAL::Dimension_tag<4> > Exact_kernel_s; typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Inexact_kernel_d; // Use static dimension_tag for the user not to be able to set dimension typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Inexact_kernel_s; -// The triangulation uses the default instantiation of the TriangulationDataStructure template parameter typedef boost::mpl::list list_of_kernel_variants; diff --git a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp index e17831d9..e86b34e2 100644 --- a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp +++ b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp @@ -17,19 +17,82 @@ #include // to construct a simplex_tree from alpha complex #include +#include #include #include #include // for numeric_limits +#include +#include using Simplex_tree = Gudhi::Simplex_tree<>; using Filtration_value = Simplex_tree::Filtration_value; void program_options(int argc, char *argv[], std::string &off_file_points, bool &exact, bool &fast, - std::string &output_file_diag, Filtration_value &alpha_square_max_value, + std::string &weight_file, std::string &output_file_diag, Filtration_value &alpha_square_max_value, int &coeff_field_characteristic, Filtration_value &min_persistence); +template +std::vector read_off(const std::string &off_file_points) { + Gudhi::Points_off_reader off_reader(off_file_points); + if (!off_reader.is_valid()) { + std::cerr << "Alpha_complex - Unable to read file " << off_file_points << "\n"; + exit(-1); // ----- >> + } + return off_reader.get_point_cloud(); +} + +std::vector read_weight_file(const std::string &weight_file) { + std::vector weights; + // Read weights information from file + std::ifstream weights_ifstr(weight_file); + if (weights_ifstr.good()) { + double weight = 0.0; + // Attempt read the weight in a double format, return false if it fails + while (weights_ifstr >> weight) { + weights.push_back(weight); + } + } else { + std::cerr << "Unable to read weights file " << weight_file << std::endl; + exit(-1); + } + return weights; +} + +template +Simplex_tree create_simplex_tree(const std::string &off_file_points, const std::string &weight_file, + bool exact_version, Filtration_value alpha_square_max_value) { + Simplex_tree stree; + auto points = read_off(off_file_points); + + if (weight_file != std::string()) { + std::vector weights = read_weight_file(weight_file); + if (points.size() != weights.size()) { + std::cerr << "Alpha_complex - Inconsistency between number of points (" << points.size() + << ") and number of weights (" << weights.size() << ")" << "\n"; + exit(-1); // ----- >> + } + // Init of an alpha complex from an OFF file + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_file(points, weights); + + if (!alpha_complex_from_file.create_complex(stree, alpha_square_max_value, exact_version)) { + std::cerr << "Alpha complex simplicial complex creation failed." << std::endl; + exit(-1); + } + } else { + // Init of an alpha complex from an OFF file + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_file(points); + + if (!alpha_complex_from_file.create_complex(stree, alpha_square_max_value, exact_version)) { + std::cerr << "Alpha complex simplicial complex creation failed." << std::endl; + exit(-1); + } + } + return stree; +} + int main(int argc, char **argv) { + std::string weight_file; std::string off_file_points; std::string output_file_diag; bool exact_version = false; @@ -38,48 +101,34 @@ int main(int argc, char **argv) { int coeff_field_characteristic; Filtration_value min_persistence; - program_options(argc, argv, off_file_points, exact_version, fast_version, output_file_diag, alpha_square_max_value, - coeff_field_characteristic, min_persistence); + program_options(argc, argv, off_file_points, exact_version, fast_version, weight_file, output_file_diag, + alpha_square_max_value, coeff_field_characteristic, min_persistence); if ((exact_version) && (fast_version)) { std::cerr << "You cannot set the exact and the fast version." << std::endl; exit(-1); } - Simplex_tree simplex; + Simplex_tree stree; if (fast_version) { // WARNING : CGAL::Epick_d is fast but not safe (unlike CGAL::Epeck_d) // (i.e. when the points are on a grid) using Fast_kernel = CGAL::Epick_d; - - // Init of an alpha complex from an OFF file - Gudhi::alpha_complex::Alpha_complex alpha_complex_from_file(off_file_points); - - if (!alpha_complex_from_file.create_complex(simplex, alpha_square_max_value)) { - std::cerr << "Fast Alpha complex simplicial complex creation failed." << std::endl; - exit(-1); - } + stree = create_simplex_tree(off_file_points, weight_file, exact_version, alpha_square_max_value); } else { using Kernel = CGAL::Epeck_d; - - // Init of an alpha complex from an OFF file - Gudhi::alpha_complex::Alpha_complex alpha_complex_from_file(off_file_points); - - if (!alpha_complex_from_file.create_complex(simplex, alpha_square_max_value, exact_version)) { - std::cerr << "Alpha complex simplicial complex creation failed." << std::endl; - exit(-1); - } + stree = create_simplex_tree(off_file_points, weight_file, exact_version, alpha_square_max_value); } // ---------------------------------------------------------------------------- // Display information about the alpha complex // ---------------------------------------------------------------------------- - std::clog << "Simplicial complex is of dimension " << simplex.dimension() << " - " << simplex.num_simplices() - << " simplices - " << simplex.num_vertices() << " vertices." << std::endl; + std::clog << "Simplicial complex is of dimension " << stree.dimension() << " - " << stree.num_simplices() + << " simplices - " << stree.num_vertices() << " vertices." << std::endl; - std::clog << "Simplex_tree dim: " << simplex.dimension() << std::endl; + std::clog << "Simplex_tree dim: " << stree.dimension() << std::endl; // Compute the persistence diagram of the complex Gudhi::persistent_cohomology::Persistent_cohomology pcoh( - simplex); + stree); // initializes the coefficient field for homology pcoh.init_coefficients(coeff_field_characteristic); @@ -98,7 +147,7 @@ int main(int argc, char **argv) { } void program_options(int argc, char *argv[], std::string &off_file_points, bool &exact, bool &fast, - std::string &output_file_diag, Filtration_value &alpha_square_max_value, + std::string &weight_file, std::string &output_file_diag, Filtration_value &alpha_square_max_value, int &coeff_field_characteristic, Filtration_value &min_persistence) { namespace po = boost::program_options; po::options_description hidden("Hidden options"); @@ -111,6 +160,8 @@ void program_options(int argc, char *argv[], std::string &off_file_points, bool "To activate exact version of Alpha complex (default is false, not available if fast is set)")( "fast,f", po::bool_switch(&fast), "To activate fast version of Alpha complex (default is false, not available if exact is set)")( + "weight-file,w", po::value(&weight_file)->default_value(std::string()), + "Name of file containing a point weights. Format is one weight per line:\n W1\n ...\n Wn ")( "output-file,o", po::value(&output_file_diag)->default_value(std::string()), "Name of file in which the persistence diagram is written. Default print in std::clog")( "max-alpha-square-value,r", po::value(&alpha_square_max_value) diff --git a/src/Alpha_complex/utilities/alphacomplex.md b/src/Alpha_complex/utilities/alphacomplex.md index 527598a9..0d3c6027 100644 --- a/src/Alpha_complex/utilities/alphacomplex.md +++ b/src/Alpha_complex/utilities/alphacomplex.md @@ -46,6 +46,9 @@ for the Alpha complex construction. coefficient field Z/pZ for computing homology. * `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals. +* `-w [ --weight-file ]` is the path to the file containing the weights of the +points (one value per line). +Default version is not weighted. * `-e [ --exact ]` for the exact computation version. * `-f [ --fast ]` for the fast computation version. @@ -58,6 +61,10 @@ to be recorded. Enter a negative value to see zero length intervals. N.B.: * Filtration values are alpha square values. +* Weights values are explained on CGAL +[dD Triangulations](https://doc.cgal.org/latest/Triangulation/index.html) +and +[Regular triangulation](https://doc.cgal.org/latest/Triangulation/index.html#title20) documentation. ## alpha_complex_3d_persistence ## -- cgit v1.2.3 From de39546182c20a69e45aa07830351f6e9d2e4b84 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 14 Sep 2020 17:27:40 +0200 Subject: Add but comment a test to compare dD and 3D alpha complex --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 2 - .../test/Weighted_alpha_complex_unit_test.cpp | 79 +++++++++++++++++++++- 2 files changed, 78 insertions(+), 3 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 00231e1c..e1aae2d4 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -267,8 +267,6 @@ class Alpha_complex { // Save index value as data to retrieve it after insertion pos->data() = index; hint = pos->full_cell(); - } else { - std::cout << "NULLPTR" << std::endl; } } // -------------------------------------------------------------------------------------------- diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index 57a57058..bf659ef7 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -79,4 +79,81 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kerne } BOOST_CHECK(zw_simplex == simplex); -} \ No newline at end of file +} + +template +bool cgal_3d_point_sort (Point_d a,Point_d b) { + if (a[0] != b[0]) + return a[0] < b[0]; + if (a[1] != b[1]) + return a[1] < b[1]; + return a[2] < b[2]; +} + +/*BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { + // Random points construction + using Kernel_dD = CGAL::Epeck_d< CGAL::Dimension_tag<3> >; + using Bare_point_d = typename Kernel_dD::Point_d; + using Weighted_point_d = typename Kernel_dD::Weighted_point_d; + std::vector w_points_d; + + using Exact_weighted_alpha_complex_3d = + Gudhi::alpha_complex::Alpha_complex_3d; + using Bare_point_3 = typename Exact_weighted_alpha_complex_3d::Bare_point_3; + using Weighted_point_3 = typename Exact_weighted_alpha_complex_3d::Weighted_point_3; + std::vector w_points_3; + + std::uniform_real_distribution rd_pts(-10., 10.); + std::uniform_real_distribution rd_wghts(-0.5, 0.5); + std::random_device rand_dev; + std::mt19937 rand_engine(rand_dev()); + for (int idx = 0; idx < 20; idx++) { + std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; + double weight = rd_wghts(rand_engine); + w_points_d.emplace_back(Weighted_point_d(Bare_point_d(point.begin(), point.end()), weight)); + w_points_3.emplace_back(Weighted_point_3(Bare_point_3(point[0], point[1], point[2]), weight)); + } + + // Weighted alpha complex for dD version + Gudhi::alpha_complex::Alpha_complex alpha_complex_dD_from_weighted_points(w_points_d); + Gudhi::Simplex_tree<> w_simplex_d; + BOOST_CHECK(alpha_complex_dD_from_weighted_points.create_complex(w_simplex_d)); + + std::clog << "Iterator on weighted alpha complex dD simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : w_simplex_d.filtration_simplex_range()) { + std::clog << " ( "; + std::vector points; + for (auto vertex : w_simplex_d.simplex_vertex_range(f_simplex)) { + points.emplace_back(alpha_complex_dD_from_weighted_points.get_point(vertex).point()); + } + std::sort (points.begin(), points.end(), cgal_3d_point_sort); + for (auto point : points) { + std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; + } + std::clog << ") -> " << "[" << w_simplex_d.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + + // Weighted alpha complex for 3D version + Exact_weighted_alpha_complex_3d alpha_complex_3D_from_weighted_points(w_points_3); + Gudhi::Simplex_tree<> w_simplex_3; + BOOST_CHECK(alpha_complex_3D_from_weighted_points.create_complex(w_simplex_3)); + + std::clog << "Iterator on weighted alpha complex 3D simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : w_simplex_3.filtration_simplex_range()) { + std::clog << " ( "; + std::vector points; + for (auto vertex : w_simplex_3.simplex_vertex_range(f_simplex)) { + points.emplace_back(alpha_complex_3D_from_weighted_points.get_point(vertex).point()); + } + std::sort (points.begin(), points.end()); + for (auto point : points) { + std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; + } + std::clog << ") -> " << "[" << w_simplex_3.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + + BOOST_CHECK(w_simplex_d == w_simplex_3); + +}*/ \ No newline at end of file -- cgit v1.2.3 From 53d09e2f7770f7e95d765d527712ef3c0758cf08 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 14 Sep 2020 21:35:23 +0200 Subject: Fix Alpha complex to have the same results than Alpha complex 3d --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 31 +++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index e1aae2d4..f43cd071 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -60,6 +60,27 @@ namespace alpha_complex { template struct Is_Epeck_D { static const bool value = false; }; template struct Is_Epeck_D> { static const bool value = true; }; +template +struct Weight; + +template +struct Weight +{ + typename Kernel::FT operator()(const typename Kernel::Weighted_point_d& p) const + { + return p.weight(); + } +}; + +template +struct Weight +{ + typename Kernel::FT operator()(const typename Kernel::Point_d& p) const + { + return 0.; + } +}; + /** * \class Alpha_complex Alpha_complex.h gudhi/Alpha_complex.h * \brief Alpha complex data structure. @@ -404,6 +425,7 @@ class Alpha_complex { // -------------------------------------------------------------------------------------------- if (!default_filtration_value) { + CGAL::NT_converter cgal_converter; // -------------------------------------------------------------------------------------------- // ### For i : d -> 0 for (int decr_dim = triangulation_->maximal_dimension(); decr_dim >= 0; decr_dim--) { @@ -420,8 +442,7 @@ class Alpha_complex { #if CGAL_VERSION_NR >= 1050000000 if(exact) CGAL::exact(sqrad); #endif - CGAL::NT_converter cv; - alpha_complex_filtration = cv(sqrad); + alpha_complex_filtration = cgal_converter(sqrad); } complex.assign_filtration(f_simplex, alpha_complex_filtration); #ifdef DEBUG_TRACES @@ -431,6 +452,12 @@ class Alpha_complex { // No need to propagate further, unweighted points all have value 0 if (decr_dim > 1) propagate_alpha_filtration(complex, f_simplex); + // For weighted points, assign point weight as filtration value + if (Weighted && decr_dim == 0) { + Vertex_handle vertex = *(complex.simplex_vertex_range(f_simplex).begin()); + FT wght = Weight()(get_point(vertex)); + complex.assign_filtration(f_simplex, cgal_converter(wght)*(-1.)); + } } } old_cache_ = std::move(cache_); -- cgit v1.2.3 From 6db3b5db0f8b6dfae2b9b6eadb8bccdfdc613fb5 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 15 Sep 2020 13:45:37 +0200 Subject: This should be correct and efficient for 0-dimension weighted alpha --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index f43cd071..b66ec20d 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -436,8 +436,8 @@ class Alpha_complex { // ### If filt(Sigma) is NaN : filt(Sigma) = alpha(Sigma) if (std::isnan(complex.filtration(f_simplex))) { Filtration_value alpha_complex_filtration = 0.0; - // No need to compute squared_radius on a single point - alpha is 0.0 - if (f_simplex_dim > 0) { + // No need to compute squared_radius on a non-weighted single point - alpha is 0.0 + if (Weighted || f_simplex_dim > 0) { auto const& sqrad = radius(complex, f_simplex); #if CGAL_VERSION_NR >= 1050000000 if(exact) CGAL::exact(sqrad); @@ -450,14 +450,8 @@ class Alpha_complex { #endif // DEBUG_TRACES } // No need to propagate further, unweighted points all have value 0 - if (decr_dim > 1) + if (decr_dim > !Weighted) propagate_alpha_filtration(complex, f_simplex); - // For weighted points, assign point weight as filtration value - if (Weighted && decr_dim == 0) { - Vertex_handle vertex = *(complex.simplex_vertex_range(f_simplex).begin()); - FT wght = Weight()(get_point(vertex)); - complex.assign_filtration(f_simplex, cgal_converter(wght)*(-1.)); - } } } old_cache_ = std::move(cache_); -- cgit v1.2.3 From 4dacc3d99bfc4a4d31088fe126090038156ab7a0 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 15 Sep 2020 16:56:17 +0200 Subject: Make Kernel available publicly for tests purpose --- src/Alpha_complex/include/gudhi/Alpha_complex_3d.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h index 622b10ee..4e5fc933 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h @@ -154,8 +154,10 @@ class Alpha_complex_3d { using Kernel = CGAL::Periodic_3_regular_triangulation_traits_3; }; + public: using Kernel = typename Kernel_3::Kernel; + private: using TdsVb = typename std::conditional, CGAL::Triangulation_ds_vertex_base_3<>>::type; -- cgit v1.2.3 From 019bc2dc28dd6db3b21a24354051fe3a4d2e1f77 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 15 Sep 2020 16:56:54 +0200 Subject: alpha complex persistence now requires cgal 5.1 --- src/Alpha_complex/utilities/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/utilities/CMakeLists.txt b/src/Alpha_complex/utilities/CMakeLists.txt index f0ddfc2c..90e5734e 100644 --- a/src/Alpha_complex/utilities/CMakeLists.txt +++ b/src/Alpha_complex/utilities/CMakeLists.txt @@ -1,6 +1,6 @@ project(Alpha_complex_utilities) -if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) +if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) add_executable (alpha_complex_persistence alpha_complex_persistence.cpp) target_link_libraries(alpha_complex_persistence ${CGAL_LIBRARY} Boost::program_options) @@ -27,7 +27,7 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) endif() install(TARGETS alpha_complex_persistence DESTINATION bin) -endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.11.0) +endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) if (NOT CGAL_VERSION VERSION_LESS 4.11.0) add_executable(alpha_complex_3d_persistence alpha_complex_3d_persistence.cpp) -- cgit v1.2.3 From d6f68d20e975e0cd530cd15ca5f7f782550e6af4 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 15 Sep 2020 16:57:15 +0200 Subject: Test alpha complex dD versus 3d --- .../test/Weighted_alpha_complex_unit_test.cpp | 54 +++++++++++++++++----- 1 file changed, 43 insertions(+), 11 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index bf659ef7..e8372656 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -19,6 +19,8 @@ #include // float comparison #include #include +#include +#include // for std::fabs #include #include @@ -90,7 +92,7 @@ bool cgal_3d_point_sort (Point_d a,Point_d b) { return a[2] < b[2]; } -/*BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { +BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { // Random points construction using Kernel_dD = CGAL::Epeck_d< CGAL::Dimension_tag<3> >; using Bare_point_d = typename Kernel_dD::Point_d; @@ -114,6 +116,12 @@ bool cgal_3d_point_sort (Point_d a,Point_d b) { w_points_3.emplace_back(Weighted_point_3(Bare_point_3(point[0], point[1], point[2]), weight)); } + // Structures necessary for comparison + using Points = std::vector>; + using Points_and_filtrations = std::map; + Points_and_filtrations pts_fltr_dD; + Points_and_filtrations pts_fltr_3d; + // Weighted alpha complex for dD version Gudhi::alpha_complex::Alpha_complex alpha_complex_dD_from_weighted_points(w_points_d); Gudhi::Simplex_tree<> w_simplex_d; @@ -121,17 +129,20 @@ bool cgal_3d_point_sort (Point_d a,Point_d b) { std::clog << "Iterator on weighted alpha complex dD simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : w_simplex_d.filtration_simplex_range()) { - std::clog << " ( "; - std::vector points; + Points points; for (auto vertex : w_simplex_d.simplex_vertex_range(f_simplex)) { - points.emplace_back(alpha_complex_dD_from_weighted_points.get_point(vertex).point()); + CGAL::NT_converter cgal_converter; + Bare_point_d pt = alpha_complex_dD_from_weighted_points.get_point(vertex).point(); + points.push_back({cgal_converter(pt[0]), cgal_converter(pt[1]), cgal_converter(pt[2])}); } - std::sort (points.begin(), points.end(), cgal_3d_point_sort); + std::clog << " ( "; + std::sort (points.begin(), points.end()); for (auto point : points) { std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; } std::clog << ") -> " << "[" << w_simplex_d.filtration(f_simplex) << "] "; std::clog << std::endl; + pts_fltr_dD[points] = w_simplex_d.filtration(f_simplex); } // Weighted alpha complex for 3D version @@ -141,19 +152,40 @@ bool cgal_3d_point_sort (Point_d a,Point_d b) { std::clog << "Iterator on weighted alpha complex 3D simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : w_simplex_3.filtration_simplex_range()) { - std::clog << " ( "; - std::vector points; + Points points; for (auto vertex : w_simplex_3.simplex_vertex_range(f_simplex)) { - points.emplace_back(alpha_complex_3D_from_weighted_points.get_point(vertex).point()); + Bare_point_3 pt = alpha_complex_3D_from_weighted_points.get_point(vertex).point(); + CGAL::NT_converter cgal_converter; + points.push_back({cgal_converter(pt[0]), cgal_converter(pt[1]), cgal_converter(pt[2])}); } + std::clog << " ( "; std::sort (points.begin(), points.end()); for (auto point : points) { std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; } std::clog << ") -> " << "[" << w_simplex_3.filtration(f_simplex) << "] "; std::clog << std::endl; + pts_fltr_3d[points] = w_simplex_d.filtration(f_simplex); } - BOOST_CHECK(w_simplex_d == w_simplex_3); - -}*/ \ No newline at end of file + // Compares structures + auto d3_itr = pts_fltr_3d.begin(); + auto dD_itr = pts_fltr_dD.begin(); + for (; d3_itr != pts_fltr_3d.end() && dD_itr != pts_fltr_dD.end(); ++d3_itr) { + if (d3_itr->first != dD_itr->first) { + for(auto point : d3_itr->first) + std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; + std::clog << " versus "; + for(auto point : dD_itr->first) + std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; + std::clog << std::endl; + BOOST_CHECK(false); + } + // I had to make a hard limit as it is converted from Kernel::FT + if (std::fabs(d3_itr->second - dD_itr->second) > 1e-5) { + std::clog << d3_itr->second << " versus " << dD_itr->second << " diff " << std::fabs(d3_itr->second - dD_itr->second) << std::endl; + BOOST_CHECK(false); + } + ++dD_itr; + } +} -- cgit v1.2.3 From cb68f3e4c8ce7724ccb693e5c67dd9928d12d84b Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Wed, 16 Sep 2020 12:39:00 +0200 Subject: Some documentation about weighted dD Alpha complex. Make examples 3d/dD consistents --- src/Alpha_complex/doc/Intro_alpha_complex.h | 35 +++++++++++++++++++++- .../Weighted_alpha_complex_3d_from_points.cpp | 4 +-- .../example/Weighted_alpha_complex_from_points.cpp | 16 +++++----- .../example/weightedalpha3dfrompoints_for_doc.txt | 4 +-- 4 files changed, 45 insertions(+), 14 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index 60da7169..f14adee6 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -22,6 +22,17 @@ namespace alpha_complex { * * @{ * + + * \section definition Definition * * Alpha_complex is a simplicial complex @@ -146,6 +157,28 @@ namespace alpha_complex { * `SimplicialComplexForAlpha::prune_above_filtration()`). * In the following example, the value is given by the user as argument of the program. * + * \section weightedversion Weighted specific version + * Requires: \ref eigen ≥ 3.1.0 and \ref cgal ≥ 5.1.0. + * For performances reasons, it is advised to use \ref eigen ≥ 3.5.8 and \ref cgal ≥ 5.2.0 + * A weighted version for Alpha complex is available (cf. Alpha_complex). + * + * This example builds the CGAL weighted alpha shapes from a small molecule, and initializes the alpha complex with + * it. This example is taken from CGAL 3d + * weighted alpha shapes. + * + * Then, it is asked to display information about the alpha complex. + * + * \include Alpha_complex/Weighted_alpha_complex_from_points.cpp + * + * When launching: + * + * \code $> ./Weighted_alpha_complex_example_from_points + * \endcode + * + * the program output is: + * + * \include Alpha_complex/weightedalpha3dfrompoints_for_doc.txt + * * * \section offexample Example from OFF file * @@ -166,7 +199,7 @@ namespace alpha_complex { * \include Alpha_complex/alphaoffreader_for_doc_32.txt * * - * \section weighted3dexample 3d specific example + * \section weighted3dexample 3d specific version * * A specific module for Alpha complex is available in 3d (cf. Alpha_complex_3d) and allows to construct standard, * weighted, periodic or weighted and periodic versions of alpha complexes. Alpha values computation can be diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp index c044194e..74f0cf30 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp @@ -34,10 +34,10 @@ int main(int argc, char **argv) { // ---------------------------------------------------------------------------- // Display information about the alpha complex // ---------------------------------------------------------------------------- - std::clog << "Alpha complex is of dimension " << simplex.dimension() << " - " << simplex.num_simplices() + std::clog << "Weighted alpha complex is of dimension " << simplex.dimension() << " - " << simplex.num_simplices() << " simplices - " << simplex.num_vertices() << " vertices." << std::endl; - std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : simplex.filtration_simplex_range()) { std::clog << " ( "; for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp index 19a04282..d49d3e93 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp @@ -8,23 +8,21 @@ #include // Explicit dimension 2 Epeck_d kernel -using Kernel = CGAL::Epeck_d< CGAL::Dimension_tag<2> >; +using Kernel = CGAL::Epeck_d< CGAL::Dimension_tag<3> >; using Bare_point = Kernel::Point_d; using Weighted_point = Kernel::Weighted_point_d; using Vector_of_points = std::vector; int main() { // ---------------------------------------------------------------------------- - // Init of a list of points + // Init of a list of points and weights from a small molecule // ---------------------------------------------------------------------------- Vector_of_points points; - points.push_back(Weighted_point(Bare_point(1.0, 1.0) , 1.)); - points.push_back(Weighted_point(Bare_point(7.0, 0.0) , 1.)); - points.push_back(Weighted_point(Bare_point(4.0, 6.0) , 1.)); - points.push_back(Weighted_point(Bare_point(9.0, 6.0) , 1.)); - points.push_back(Weighted_point(Bare_point(0.0, 14.0), 1.)); - points.push_back(Weighted_point(Bare_point(2.0, 19.0), 1.)); - points.push_back(Weighted_point(Bare_point(9.0, 17.0), 1.)); + points.push_back(Weighted_point(Bare_point(1, -1, -1), 4.)); + points.push_back(Weighted_point(Bare_point(-1, 1, -1), 4.)); + points.push_back(Weighted_point(Bare_point(-1, -1, 1), 4.)); + points.push_back(Weighted_point(Bare_point(1, 1, 1), 4.)); + points.push_back(Weighted_point(Bare_point(2, 2, 2), 1.)); // ---------------------------------------------------------------------------- // Init of an alpha complex from the list of points diff --git a/src/Alpha_complex/example/weightedalpha3dfrompoints_for_doc.txt b/src/Alpha_complex/example/weightedalpha3dfrompoints_for_doc.txt index 7a09998d..f0695f1a 100644 --- a/src/Alpha_complex/example/weightedalpha3dfrompoints_for_doc.txt +++ b/src/Alpha_complex/example/weightedalpha3dfrompoints_for_doc.txt @@ -1,5 +1,5 @@ -Alpha complex is of dimension 3 - 29 simplices - 5 vertices. -Iterator on alpha complex simplices in the filtration order, with [filtration value]: +Weighted alpha complex is of dimension 3 - 29 simplices - 5 vertices. +Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]: ( 0 ) -> [-4] ( 1 ) -> [-4] ( 2 ) -> [-4] -- cgit v1.2.3 From 282934d4f51acac046c04f752534a6a900880df9 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Wed, 16 Sep 2020 12:43:35 +0200 Subject: Add weighted in toc --- src/Alpha_complex/doc/Intro_alpha_complex.h | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index f14adee6..b04562e1 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -28,6 +28,7 @@ Table of Contents
  • Definition
  • Example from points
  • Create complex algorithm
  • +
  • Weighted specific version
  • Example from OFF file
  • 3d specific version
  • @@ -214,14 +215,7 @@ Table of Contents * * \include Alpha_complex/Weighted_alpha_complex_3d_from_points.cpp * - * When launching: - * - * \code $> ./Alpha_complex_example_weighted_3d_from_points - * \endcode - * - * the program output is: - * - * \include Alpha_complex/weightedalpha3dfrompoints_for_doc.txt + * The results will be the same as in \ref weightedversion . * */ /** @} */ // end defgroup alpha_complex -- cgit v1.2.3 From 837ffddda60d3f389184fe167710f74ad8adf36b Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 17 Sep 2020 09:37:25 +0200 Subject: Some documentation for weighted version --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 7 ++++--- src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index b66ec20d..1d395bd8 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -132,17 +132,18 @@ class Alpha_complex { using Triangulation = typename std::conditional, CGAL::Delaunay_triangulation>::type; + /** \brief CGAL kernel container for computations in function of the weighted or not characteristics.*/ using A_kernel_d = Alpha_kernel_d; // Numeric type of coordinates in the kernel using FT = typename A_kernel_d::FT; - /** \brief If Weighted, the weighted point is cached (point + weight [= squared radius]), - * else a pair of point and squared radius is cached. + /** \brief Sphere is a std::pair (aka. circurmcenter and squared radius). + * If Weighted, Sphere is a Kernel::Weighted_point_d (aka. circurmcenter and the weight value is the squared radius). */ using Sphere = typename A_kernel_d::Sphere; - /** \brief A point in Euclidean space.*/ + /** \brief A point, or a weighted point in Euclidean space.*/ using Point_d = typename std::conditional::type; diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index a4824207..e3567a6d 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -32,6 +32,14 @@ namespace Gudhi { namespace alpha_complex { +/** + * \class Alpha_kernel_d + * \brief Alpha complex kernel container. + * + * \details + * The Alpha complex kernel container stores CGAL Kernel and dispatch basics computations in function of the weighted + * or not version of the Alpha complex. + */ template < typename Kernel, bool Weighted = false > class Alpha_kernel_d { }; -- cgit v1.2.3 From 77c0275031f47bb94f94d02d63182178e46f6570 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 17 Sep 2020 10:24:30 +0200 Subject: Remove useless code --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 21 --------------------- 1 file changed, 21 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 1d395bd8..be0a5b95 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -60,27 +60,6 @@ namespace alpha_complex { template struct Is_Epeck_D { static const bool value = false; }; template struct Is_Epeck_D> { static const bool value = true; }; -template -struct Weight; - -template -struct Weight -{ - typename Kernel::FT operator()(const typename Kernel::Weighted_point_d& p) const - { - return p.weight(); - } -}; - -template -struct Weight -{ - typename Kernel::FT operator()(const typename Kernel::Point_d& p) const - { - return 0.; - } -}; - /** * \class Alpha_complex Alpha_complex.h gudhi/Alpha_complex.h * \brief Alpha complex data structure. -- cgit v1.2.3 From 8afdbebe27effb0a9c184a153b645dd85aa0415b Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 18 Sep 2020 13:08:37 +0200 Subject: Fix #if cgal_version --- .../include/gudhi/Alpha_complex/Alpha_kernel_d.h | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index e3567a6d..a6760645 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -108,18 +108,16 @@ class Alpha_kernel_d { template Sphere get_sphere(PointIterator begin, PointIterator end) const { // power_center_d_object has been renamed between CGAL 5.1 and 5.2 -#if defined CGAL_VERSION_NR >= 1050101000 && defined CGAL_VERSION_NR < 1050201000 +#if CGAL_VERSION_NR < 1050201000 return kernel_.power_center_d_object()(begin, end); -#endif -#if CGAL_VERSION_NR >= 1050201000 +#else return kernel_.construct_power_sphere_d_object()(begin, end); #endif } template FT get_squared_radius(PointIterator begin, PointIterator end) const { - Sphere sph = get_sphere(begin, end); - return sph.weight(); + return get_sphere(begin, end).weight(); } FT get_squared_radius(const Sphere& sph) const { @@ -128,10 +126,9 @@ class Alpha_kernel_d { bool is_gabriel(const Sphere& circumcenter, const Weighted_point_d& point) { // power_center_d_object has been renamed between CGAL 5.1 and 5.2 -#if defined CGAL_VERSION_NR >= 1050101000 && defined CGAL_VERSION_NR < 1050201000 +#if CGAL_VERSION_NR < 1050201000 return kernel_.power_distance_d_object()(circumcenter, point) >= 0; -#endif -#if CGAL_VERSION_NR >= 1050201000 +#else return kernel_.compute_power_product_d_object()(circumcenter, point) >= 0; #endif } -- cgit v1.2.3 From b1b0e9afcaf0e282115dddad7b958b6ec7a94a41 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 29 Sep 2020 14:33:28 +0200 Subject: code review: inconsistency between code and comment --- src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp index 74f0cf30..a8d00272 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp @@ -9,7 +9,7 @@ // Complexity = FAST, weighted = true, periodic = false using Weighted_alpha_complex_3d = - Gudhi::alpha_complex::Alpha_complex_3d; + Gudhi::alpha_complex::Alpha_complex_3d; using Bare_point = Weighted_alpha_complex_3d::Bare_point_3; using Weighted_point = Weighted_alpha_complex_3d::Weighted_point_3; -- cgit v1.2.3 From 6f2ec5ee6572351d3aee5f559ef4cf7ad03bf914 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 29 Sep 2020 15:00:53 +0200 Subject: doc review: fix eigen version and period --- src/Alpha_complex/doc/Intro_alpha_complex.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index b04562e1..78486ad6 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -160,7 +160,8 @@ Table of Contents * * \section weightedversion Weighted specific version * Requires: \ref eigen ≥ 3.1.0 and \ref cgal ≥ 5.1.0. - * For performances reasons, it is advised to use \ref eigen ≥ 3.5.8 and \ref cgal ≥ 5.2.0 + * For performances reasons, it is advised to use \ref eigen ≥ 3.3.5 and \ref cgal ≥ 5.2.0. + * * A weighted version for Alpha complex is available (cf. Alpha_complex). * * This example builds the CGAL weighted alpha shapes from a small molecule, and initializes the alpha complex with -- cgit v1.2.3 From b08a52c3b625e70d1c69834df7253e115da7946e Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 29 Sep 2020 15:35:11 +0200 Subject: code review: use of std::conditional_t c++14 helper --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index be0a5b95..e8bf1f74 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -101,15 +101,16 @@ template, bool Weighte class Alpha_complex { public: /** \brief Geometric traits class that provides the geometric types and predicates needed by the triangulations.*/ - using Geom_traits = typename std::conditional, - Kernel>::type; + using Geom_traits = std::conditional_t, Kernel>; + // Add an int in TDS to save point index in the structure using TDS = CGAL::Triangulation_data_structure, CGAL::Triangulation_full_cell >; + /** \brief A (Weighted or not) Delaunay triangulation of a set of points in \f$ \mathbb{R}^D\f$.*/ - using Triangulation = typename std::conditional, - CGAL::Delaunay_triangulation>::type; + using Triangulation = std::conditional_t, + CGAL::Delaunay_triangulation>; /** \brief CGAL kernel container for computations in function of the weighted or not characteristics.*/ using A_kernel_d = Alpha_kernel_d; @@ -123,8 +124,7 @@ class Alpha_complex { using Sphere = typename A_kernel_d::Sphere; /** \brief A point, or a weighted point in Euclidean space.*/ - using Point_d = typename std::conditional::type; + using Point_d = std::conditional_t; private: // Vertex_iterator type from CGAL. -- cgit v1.2.3 From 44473bcd93892c7034fa21599509d4271f2d8bb2 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 29 Sep 2020 17:16:02 +0200 Subject: doc review: rephrase non contiguous vertices --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index e8bf1f74..38201027 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -171,7 +171,8 @@ class Alpha_complex { /** \brief Alpha_complex constructor from a list of points. * - * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous. + * The vertices may be not contiguous as some points may be discarded in the triangulation (duplicate points, + * weighted hidden point, ...). * * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. * @@ -186,7 +187,8 @@ class Alpha_complex { /** \brief Alpha_complex constructor from a list of points and weights. * - * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous. + * The vertices may be not contiguous as some points may be discarded in the triangulation (duplicate points, + * weighted hidden point, ...). * * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. * -- cgit v1.2.3 From dab93ead76f1435f6b74937ef0377aafb0517439 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 29 Sep 2020 17:53:34 +0200 Subject: doc review: Modify ctor with points and weights documentation --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 38201027..a692dbc6 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -176,8 +176,8 @@ class Alpha_complex { * * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. * - * The type InputPointRange must be a range for which std::begin and - * std::end return input iterators on a Kernel::Point_d or Kernel::Weighted_point_d. + * The type InputPointRange must be a range for which std::begin and std::end return input iterators on a + * Kernel::Point_d or Kernel::Weighted_point_d. */ template Alpha_complex(const InputPointRange& points) @@ -190,12 +190,12 @@ class Alpha_complex { * The vertices may be not contiguous as some points may be discarded in the triangulation (duplicate points, * weighted hidden point, ...). * - * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d or Kernel::Weighted_point_d. + * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d. * * @param[in] weights Range of points weights. Weights must be in Kernel::FT. * - * The type InputPointRange must be a range for which std::begin and - * std::end return input iterators on a Kernel::Point_d. + * The type InputPointRange must be a range for which std::begin and std::end return input iterators on a + * Kernel::Point_d. */ template Alpha_complex(const InputPointRange& points, WeightRange weights) { -- cgit v1.2.3 From c1b317640f81fefff7f7a774b239957fb632fa43 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Wed, 30 Sep 2020 09:18:36 +0200 Subject: code review: emplace_back versus push_back --- .../Weighted_alpha_complex_3d_from_points.cpp | 10 +++++----- .../example/Weighted_alpha_complex_from_points.cpp | 10 +++++----- src/Alpha_complex/include/gudhi/Alpha_complex.h | 6 +++--- src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp | 20 ++++++++++---------- .../utilities/alpha_complex_persistence.cpp | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp index a8d00272..09431d6e 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp @@ -18,11 +18,11 @@ int main(int argc, char **argv) { // Init of a list of points and weights from a small molecule // ---------------------------------------------------------------------------- std::vector weighted_points; - weighted_points.push_back(Weighted_point(Bare_point(1, -1, -1), 4.)); - weighted_points.push_back(Weighted_point(Bare_point(-1, 1, -1), 4.)); - weighted_points.push_back(Weighted_point(Bare_point(-1, -1, 1), 4.)); - weighted_points.push_back(Weighted_point(Bare_point(1, 1, 1), 4.)); - weighted_points.push_back(Weighted_point(Bare_point(2, 2, 2), 1.)); + weighted_points.emplace_back(Bare_point(1, -1, -1), 4.); + weighted_points.emplace_back(Bare_point(-1, 1, -1), 4.); + weighted_points.emplace_back(Bare_point(-1, -1, 1), 4.); + weighted_points.emplace_back(Bare_point(1, 1, 1), 4.); + weighted_points.emplace_back(Bare_point(2, 2, 2), 1.); // ---------------------------------------------------------------------------- // Init of an alpha complex from the list of points diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp index d49d3e93..d1f3e436 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_from_points.cpp @@ -18,11 +18,11 @@ int main() { // Init of a list of points and weights from a small molecule // ---------------------------------------------------------------------------- Vector_of_points points; - points.push_back(Weighted_point(Bare_point(1, -1, -1), 4.)); - points.push_back(Weighted_point(Bare_point(-1, 1, -1), 4.)); - points.push_back(Weighted_point(Bare_point(-1, -1, 1), 4.)); - points.push_back(Weighted_point(Bare_point(1, 1, 1), 4.)); - points.push_back(Weighted_point(Bare_point(2, 2, 2), 1.)); + points.emplace_back(Bare_point(1, -1, -1), 4.); + points.emplace_back(Bare_point(-1, 1, -1), 4.); + points.emplace_back(Bare_point(-1, -1, 1), 4.); + points.emplace_back(Bare_point(1, 1, 1), 4.); + points.emplace_back(Bare_point(2, 2, 2), 1.); // ---------------------------------------------------------------------------- // Init of an alpha complex from the list of points diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index a692dbc6..4f8e3d54 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -310,7 +310,7 @@ class Alpha_complex { thread_local std::vector v; v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) - v.push_back(get_point_(vertex)); + v.emplace_back(get_point_(vertex)); cache_.emplace_back(kernel_.get_sphere(v.cbegin(), v.cend())); } return cache_[k]; @@ -326,7 +326,7 @@ class Alpha_complex { thread_local std::vector v; v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) - v.push_back(get_point_(vertex)); + v.emplace_back(get_point_(vertex)); return kernel_.get_squared_radius(v.cbegin(), v.cend()); } @@ -394,7 +394,7 @@ class Alpha_complex { std::clog << " " << (*vit)->data(); #endif // DEBUG_TRACES // Vector of vertex construction for simplex_tree structure - vertexVector.push_back((*vit)->data()); + vertexVector.emplace_back((*vit)->data()); } } #ifdef DEBUG_TRACES diff --git a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp index 192834b3..6eae103d 100644 --- a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp +++ b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp @@ -63,11 +63,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_sphere, TestedKernel, list_of_kerne using Point_d = typename Unweighted_kernel::Point_d; std::vector unw_pts; - unw_pts.push_back(Point_d(p0.begin(), p0.end())); - unw_pts.push_back(Point_d(p1.begin(), p1.end())); - unw_pts.push_back(Point_d(p2.begin(), p2.end())); - unw_pts.push_back(Point_d(p3.begin(), p3.end())); - unw_pts.push_back(Point_d(p4.begin(), p4.end())); + unw_pts.emplace_back(p0.begin(), p0.end()); + unw_pts.emplace_back(p1.begin(), p1.end()); + unw_pts.emplace_back(p2.begin(), p2.end()); + unw_pts.emplace_back(p3.begin(), p3.end()); + unw_pts.emplace_back(p4.begin(), p4.end()); Unweighted_kernel kernel; auto unw_sphere = kernel.get_sphere(unw_pts.cbegin(), unw_pts.cend()); @@ -79,11 +79,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_sphere, TestedKernel, list_of_kerne using Weighted_point_d = typename Weighted_kernel::Weighted_point_d; using Bare_point_d = typename Weighted_kernel::Bare_point_d; std::vector w_pts; - w_pts.push_back(Weighted_point_d(Bare_point_d(p0.begin(), p0.end()), 0.)); - w_pts.push_back(Weighted_point_d(Bare_point_d(p1.begin(), p1.end()), 0.)); - w_pts.push_back(Weighted_point_d(Bare_point_d(p2.begin(), p2.end()), 0.)); - w_pts.push_back(Weighted_point_d(Bare_point_d(p3.begin(), p3.end()), 0.)); - w_pts.push_back(Weighted_point_d(Bare_point_d(p4.begin(), p4.end()), 0.)); + w_pts.emplace_back(Bare_point_d(p0.begin(), p0.end()), 0.); + w_pts.emplace_back(Bare_point_d(p1.begin(), p1.end()), 0.); + w_pts.emplace_back(Bare_point_d(p2.begin(), p2.end()), 0.); + w_pts.emplace_back(Bare_point_d(p3.begin(), p3.end()), 0.); + w_pts.emplace_back(Bare_point_d(p4.begin(), p4.end()), 0.); Weighted_kernel w_kernel; auto w_sphere = w_kernel.get_sphere(w_pts.cbegin(), w_pts.cend()); diff --git a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp index e86b34e2..3ce7b440 100644 --- a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp +++ b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp @@ -50,7 +50,7 @@ std::vector read_weight_file(const std::string &weight_file) { double weight = 0.0; // Attempt read the weight in a double format, return false if it fails while (weights_ifstr >> weight) { - weights.push_back(weight); + weights.emplace_back(weight); } } else { std::cerr << "Unable to read weights file " << weight_file << std::endl; -- cgit v1.2.3 From 74143b372d3d93fc2139974fa85906047acee8a7 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 10:33:23 +0200 Subject: code review: push_back versus emplace_back --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 6 +++--- src/Alpha_complex/utilities/alpha_complex_persistence.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 4f8e3d54..a692dbc6 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -310,7 +310,7 @@ class Alpha_complex { thread_local std::vector v; v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) - v.emplace_back(get_point_(vertex)); + v.push_back(get_point_(vertex)); cache_.emplace_back(kernel_.get_sphere(v.cbegin(), v.cend())); } return cache_[k]; @@ -326,7 +326,7 @@ class Alpha_complex { thread_local std::vector v; v.clear(); for (auto vertex : cplx.simplex_vertex_range(s)) - v.emplace_back(get_point_(vertex)); + v.push_back(get_point_(vertex)); return kernel_.get_squared_radius(v.cbegin(), v.cend()); } @@ -394,7 +394,7 @@ class Alpha_complex { std::clog << " " << (*vit)->data(); #endif // DEBUG_TRACES // Vector of vertex construction for simplex_tree structure - vertexVector.emplace_back((*vit)->data()); + vertexVector.push_back((*vit)->data()); } } #ifdef DEBUG_TRACES diff --git a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp index 3ce7b440..e86b34e2 100644 --- a/src/Alpha_complex/utilities/alpha_complex_persistence.cpp +++ b/src/Alpha_complex/utilities/alpha_complex_persistence.cpp @@ -50,7 +50,7 @@ std::vector read_weight_file(const std::string &weight_file) { double weight = 0.0; // Attempt read the weight in a double format, return false if it fails while (weights_ifstr >> weight) { - weights.emplace_back(weight); + weights.push_back(weight); } } else { std::cerr << "Unable to read weights file " << weight_file << std::endl; -- cgit v1.2.3 From 7b477e78f38324bf1473966d59aab0360bae8066 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 10:38:31 +0200 Subject: code review: promote SAFE mode --- src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp index 09431d6e..ee12d418 100644 --- a/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp +++ b/src/Alpha_complex/example/Weighted_alpha_complex_3d_from_points.cpp @@ -7,9 +7,9 @@ #include #include // for numeric limits -// Complexity = FAST, weighted = true, periodic = false +// Complexity = SAFE, weighted = true, periodic = false using Weighted_alpha_complex_3d = - Gudhi::alpha_complex::Alpha_complex_3d; + Gudhi::alpha_complex::Alpha_complex_3d; using Bare_point = Weighted_alpha_complex_3d::Bare_point_3; using Weighted_point = Weighted_alpha_complex_3d::Weighted_point_3; -- cgit v1.2.3 From 3b839cae75a7e58b87216ee92356267bbe873e46 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 11:26:24 +0200 Subject: doc review: eigen 3.3.5 and cgal 5.2.0 is advised for perf reasons not only on weighted version --- src/Alpha_complex/doc/Intro_alpha_complex.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index 78486ad6..fb051760 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -74,7 +74,7 @@ Table of Contents * [10^12,10^12+10^6]. Using `CGAL::Epick_d` makes the computations slightly faster, and the combinatorics are still * exact, but the computation of filtration values can exceptionally be arbitrarily bad. In all cases, we still * guarantee that the output is a valid filtration (faces have a filtration value no larger than their cofaces). - * - For performances reasons, it is advised to use `Alpha_complex` with \ref cgal ≥ 5.0.0. + * - For performances reasons, it is advised to use \ref eigen ≥ 3.3.5 and \ref cgal ≥ 5.2.0. * * \section pointsexample Example from points * @@ -160,7 +160,6 @@ Table of Contents * * \section weightedversion Weighted specific version * Requires: \ref eigen ≥ 3.1.0 and \ref cgal ≥ 5.1.0. - * For performances reasons, it is advised to use \ref eigen ≥ 3.3.5 and \ref cgal ≥ 5.2.0. * * A weighted version for Alpha complex is available (cf. Alpha_complex). * -- cgit v1.2.3 From 9bba01c0afb2c931553d2c47af0104f407d22c01 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 13:18:59 +0200 Subject: code review: typename is useless here --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index a692dbc6..ae04e6e8 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -134,7 +134,7 @@ class Alpha_complex { using size_type = typename Triangulation::size_type; // Structure to switch from simplex tree vertex handle to CGAL vertex iterator. - using Vector_vertex_iterator = typename std::vector< CGAL_vertex_iterator >; + using Vector_vertex_iterator = std::vector< CGAL_vertex_iterator >; private: /** \brief Vertex iterator vector to switch from simplex tree vertex handle to CGAL vertex iterator. -- cgit v1.2.3 From f7faba86fced9c75c530c86665ca3c73429d8f12 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 13:19:52 +0200 Subject: code review: include what you use --- src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index a6760645..7c49bb14 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -11,8 +11,6 @@ #ifndef ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ #define ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ -#include // For EXACT or SAFE version -#include // For FAST version #include // for CGAL_VERSION_NR #include // for EIGEN_VERSION_AT_LEAST -- cgit v1.2.3 From 2d80f0e7f3e09167760338c15596b052050ddb55 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 14:00:51 +0200 Subject: code review: roll back include epick --- src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index 7c49bb14..d4dbd68b 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -12,6 +12,8 @@ #define ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ #include // for CGAL_VERSION_NR +#include // For EXACT or SAFE version +#include // For FAST version #include // for EIGEN_VERSION_AT_LEAST -- cgit v1.2.3 From d6ca67fee4f9c2a97b64710a5b70ed66dd307372 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 14:50:57 +0200 Subject: code review: fix include what you use and compute_squared_radius_smallest_orthogonal_sphere_d_object use --- src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index d4dbd68b..fbb931d4 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -12,10 +12,8 @@ #define ALPHA_COMPLEX_ALPHA_KERNEL_D_H_ #include // for CGAL_VERSION_NR -#include // For EXACT or SAFE version -#include // For FAST version -#include // for EIGEN_VERSION_AT_LEAST +#include // for EIGEN_VERSION_AT_LEAST #include // for std::make_pair @@ -117,7 +115,7 @@ class Alpha_kernel_d { template FT get_squared_radius(PointIterator begin, PointIterator end) const { - return get_sphere(begin, end).weight(); + return kernel_.compute_squared_radius_smallest_orthogonal_sphere_d_object()(begin, end); } FT get_squared_radius(const Sphere& sph) const { -- cgit v1.2.3 From 298925b9c2dc3629f2d20ad9b85f5a410dee6fab Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 15:29:25 +0200 Subject: code review: use geom_trait for Point_d type --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index ae04e6e8..1963f02b 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -124,7 +124,7 @@ class Alpha_complex { using Sphere = typename A_kernel_d::Sphere; /** \brief A point, or a weighted point in Euclidean space.*/ - using Point_d = std::conditional_t; + using Point_d = typename Geom_traits::Point_d; private: // Vertex_iterator type from CGAL. -- cgit v1.2.3 From 51f4de9a42cbdf7686a0f36106b31c0d3296ccfa Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 5 Oct 2020 16:11:46 +0200 Subject: doc review: Add some precision about regular triangulations --- src/Alpha_complex/doc/Intro_alpha_complex.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index fb051760..c068b268 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -161,7 +161,9 @@ Table of Contents * \section weightedversion Weighted specific version * Requires: \ref eigen ≥ 3.1.0 and \ref cgal ≥ 5.1.0. * - * A weighted version for Alpha complex is available (cf. Alpha_complex). + * A weighted version for Alpha complex is available (cf. Alpha_complex). It is like a usual Alpha complex, but based + * on a CGAL regular triangulation instead + * of Delaunay. * * This example builds the CGAL weighted alpha shapes from a small molecule, and initializes the alpha complex with * it. This example is taken from CGAL 3d -- cgit v1.2.3 From 30efe05d095051e14cbaf26d12fc2a67134e5a60 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 15 Oct 2020 16:43:54 +0200 Subject: Use unique_ptr for triangulation_ --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 1963f02b..4f7a7bd2 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -19,6 +19,7 @@ #include #include // isnan, fmax +#include // for std::unique_ptr #include #include // aka. Weighted Delaunay triangulation @@ -141,7 +142,7 @@ class Alpha_complex { * Vertex handles are inserted sequentially, starting at 0.*/ Vector_vertex_iterator vertex_handle_to_iterator_; /** \brief Pointer on the CGAL Delaunay triangulation.*/ - Triangulation* triangulation_; + std::unique_ptr triangulation_; /** \brief Kernel for triangulation_ functions access.*/ A_kernel_d kernel_; @@ -158,8 +159,7 @@ class Alpha_complex { * * @param[in] off_file_name OFF file [path and] name. */ - Alpha_complex(const std::string& off_file_name) - : triangulation_(nullptr) { + Alpha_complex(const std::string& off_file_name) { Gudhi::Points_off_reader off_reader(off_file_name); if (!off_reader.is_valid()) { std::cerr << "Alpha_complex - Unable to read file " << off_file_name << "\n"; @@ -180,8 +180,7 @@ class Alpha_complex { * Kernel::Point_d or Kernel::Weighted_point_d. */ template - Alpha_complex(const InputPointRange& points) - : triangulation_(nullptr) { + Alpha_complex(const InputPointRange& points) { init_from_range(points); } @@ -208,12 +207,6 @@ class Alpha_complex { init_from_range(weighted_points); } - /** \brief Alpha_complex destructor deletes the Delaunay triangulation. - */ - ~Alpha_complex() { - delete triangulation_; - } - // Forbid copy/move constructor/assignment operator Alpha_complex(const Alpha_complex& other) = delete; Alpha_complex& operator= (const Alpha_complex& other) = delete; @@ -249,7 +242,7 @@ class Alpha_complex { if (first != last) { // Delaunay triangulation init with point dimension. - triangulation_ = new Triangulation(kernel_.get_dimension(*first)); + triangulation_ = std::make_unique(kernel_.get_dimension(*first)); std::vector point_cloud(first, last); -- cgit v1.2.3 From afafd56fdb4a53b66ca3354fc20f787f12340fa4 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 26 Oct 2020 10:56:25 +0100 Subject: for CGAL 5.2 pre-release to work --- src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h index fbb931d4..28d6d7a9 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex/Alpha_kernel_d.h @@ -106,7 +106,7 @@ class Alpha_kernel_d { template Sphere get_sphere(PointIterator begin, PointIterator end) const { // power_center_d_object has been renamed between CGAL 5.1 and 5.2 -#if CGAL_VERSION_NR < 1050201000 +#if CGAL_VERSION_NR < 1050200000 return kernel_.power_center_d_object()(begin, end); #else return kernel_.construct_power_sphere_d_object()(begin, end); @@ -124,7 +124,7 @@ class Alpha_kernel_d { bool is_gabriel(const Sphere& circumcenter, const Weighted_point_d& point) { // power_center_d_object has been renamed between CGAL 5.1 and 5.2 -#if CGAL_VERSION_NR < 1050201000 +#if CGAL_VERSION_NR < 1050200000 return kernel_.power_distance_d_object()(circumcenter, point) >= 0; #else return kernel_.compute_power_product_d_object()(circumcenter, point) >= 0; -- cgit v1.2.3 From 699a89819da922222cedcd81b4a1553ee161a633 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 26 Oct 2020 10:58:19 +0100 Subject: code review: bad copy/paste that needs rephrase --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index 4f7a7bd2..b315fa99 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -198,7 +198,7 @@ class Alpha_complex { */ template Alpha_complex(const InputPointRange& points, WeightRange weights) { - static_assert(Weighted, "This constructor is not available for non-weighted versions of Alpha_complex_3d"); + static_assert(Weighted, "This constructor is not available for non-weighted versions of Alpha_complex"); // FIXME: this test is only valid if we have a forward range GUDHI_CHECK(boost::size(weights) == boost::size(points), std::invalid_argument("Points number in range different from weights range number")); -- cgit v1.2.3 From 4d8c5c315b79260fbae05d359987c8d39a863d2d Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 27 Oct 2020 11:15:36 +0100 Subject: zero weighted test is guaranteed only for exact version --- src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index e8372656..cae9dbb5 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -29,14 +29,10 @@ // Use dynamic_dimension_tag for the user to be able to set dimension typedef CGAL::Epeck_d< CGAL::Dynamic_dimension_tag > Exact_kernel_d; -// Use static dimension_tag for the user not to be able to set dimension +// Use static dimension_tag to set dimension at 4 typedef CGAL::Epeck_d< CGAL::Dimension_tag<4> > Exact_kernel_s; -// Use dynamic_dimension_tag for the user to be able to set dimension -typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Inexact_kernel_d; -// Use static dimension_tag for the user not to be able to set dimension -typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Inexact_kernel_s; -typedef boost::mpl::list list_of_kernel_variants; +typedef boost::mpl::list list_of_kernel_variants; BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kernel_variants) { // Random points construction @@ -53,7 +49,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kerne // Alpha complex from points Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); Gudhi::Simplex_tree<> simplex; - BOOST_CHECK(alpha_complex_from_points.create_complex(simplex)); + BOOST_CHECK(alpha_complex_from_points.create_complex(simplex, std::numeric_limits::Filtration_value>::infinity(), true)); std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : simplex.filtration_simplex_range()) { std::clog << " ( "; @@ -68,7 +64,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kerne std::vector weights(20, 0.); Gudhi::alpha_complex::Alpha_complex alpha_complex_from_zero_weighted_points(points, weights); Gudhi::Simplex_tree<> zw_simplex; - BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex)); + BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex, std::numeric_limits::Filtration_value>::infinity(), true)); std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : zw_simplex.filtration_simplex_range()) { -- cgit v1.2.3 From beaa5c2fa89ed92c84328383ac58f1e71cf510ff Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 27 Oct 2020 12:16:34 +0100 Subject: Add a test for non visible points (hidden by weights) --- .../test/Weighted_alpha_complex_unit_test.cpp | 35 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index cae9dbb5..cc63ac1f 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -43,7 +43,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kerne std::mt19937 rand_engine(rand_dev()); for (int idx = 0; idx < 20; idx++) { std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; - points.emplace_back(Point_d(point.begin(), point.end())); + points.emplace_back(point.begin(), point.end()); } // Alpha complex from points @@ -108,8 +108,8 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { for (int idx = 0; idx < 20; idx++) { std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; double weight = rd_wghts(rand_engine); - w_points_d.emplace_back(Weighted_point_d(Bare_point_d(point.begin(), point.end()), weight)); - w_points_3.emplace_back(Weighted_point_3(Bare_point_3(point[0], point[1], point[2]), weight)); + w_points_d.emplace_back(Bare_point_d(point.begin(), point.end()), weight); + w_points_3.emplace_back(Bare_point_3(point[0], point[1], point[2]), weight); } // Structures necessary for comparison @@ -185,3 +185,32 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { ++dD_itr; } } + +BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_non_visible_points) { + using Point_d = typename Exact_kernel_d::Point_d; + std::vector points; + std::vector p1 {0.}; + points.emplace_back(p1.begin(), p1.end()); + // closed enough points + std::vector p2 {0.1}; + points.emplace_back(p2.begin(), p2.end()); + std::vector weights {100., 0.01}; + + Gudhi::alpha_complex::Alpha_complex alpha_complex(points, weights); + Gudhi::Simplex_tree<> stree; + BOOST_CHECK(alpha_complex.create_complex(stree)); + + std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + for (auto f_simplex : stree.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : stree.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << stree.filtration(f_simplex) << "] "; + std::clog << std::endl; + } + + BOOST_CHECK(stree.filtration(stree.find({0})) == -100.); + BOOST_CHECK(stree.filtration(stree.find({1})) == stree.filtration(stree.find({0, 1}))); + +} \ No newline at end of file -- cgit v1.2.3 From 901fbd0ccdee2d9bb7794de8896d35aae8ede989 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 27 Oct 2020 14:45:25 +0100 Subject: Add a test about the filtration --- src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index cc63ac1f..b84ab3de 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -212,5 +212,6 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_non_visible_points) { BOOST_CHECK(stree.filtration(stree.find({0})) == -100.); BOOST_CHECK(stree.filtration(stree.find({1})) == stree.filtration(stree.find({0, 1}))); + BOOST_CHECK(stree.filtration(stree.find({1})) > 100000); } \ No newline at end of file -- cgit v1.2.3 From 69c70afd0442774582b7e930bdab603600a3e750 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 3 Nov 2020 11:33:39 +0100 Subject: doc review: explain briefly test aims --- .../test/Alpha_kernel_d_unit_test.cpp | 5 ++++ .../test/Weighted_alpha_complex_unit_test.cpp | 30 ++++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp index 6eae103d..6da4c084 100644 --- a/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp +++ b/src/Alpha_complex/test/Alpha_kernel_d_unit_test.cpp @@ -37,6 +37,8 @@ typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Inexact_kernel_s; typedef boost::mpl::list list_of_kernel_variants; BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_dimension, TestedKernel, list_of_kernel_variants) { + // Test for a point (weighted or not) in 4d, that the dimension is 4. + Gudhi::alpha_complex::Alpha_kernel_d kernel; std::vector p0 {0., 1., 2., 3.}; typename TestedKernel::Point_d p0_d(p0.begin(), p0.end()); @@ -52,6 +54,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_dimension, TestedKernel, list_of_ke } BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_kernel_d_sphere, TestedKernel, list_of_kernel_variants) { + // Test with 5 points on a 3-sphere, that get_sphere returns the same center and squared radius + // for dD unweighted and for dD weighted with all weights at 0. + using Unweighted_kernel = Gudhi::alpha_complex::Alpha_kernel_d; // Sphere: (x-1)² + (y-1)² + z² + t² = 1 // At least 5 points for a 3-sphere diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index b84ab3de..2cd66963 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -27,14 +27,14 @@ #include #include -// Use dynamic_dimension_tag for the user to be able to set dimension -typedef CGAL::Epeck_d< CGAL::Dynamic_dimension_tag > Exact_kernel_d; -// Use static dimension_tag to set dimension at 4 -typedef CGAL::Epeck_d< CGAL::Dimension_tag<4> > Exact_kernel_s; +using list_of_exact_kernel_variants = boost::mpl::list, + CGAL::Epeck_d< CGAL::Dimension_tag<4> > + > ; -typedef boost::mpl::list list_of_kernel_variants; +BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_exact_kernel_variants) { + // Check that in exact mode for static dimension 4 the code for dD unweighted and for dD weighted with all weights + // 0 give exactly the same simplex tree (simplices and filtration values). -BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_kernel_variants) { // Random points construction using Point_d = typename Kernel::Point_d; std::vector points; @@ -89,6 +89,8 @@ bool cgal_3d_point_sort (Point_d a,Point_d b) { } BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { + // check that for random weighted 3d points in safe mode the 3D and dD codes give the same result with some tolerance + // Random points construction using Kernel_dD = CGAL::Epeck_d< CGAL::Dimension_tag<3> >; using Bare_point_d = typename Kernel_dD::Point_d; @@ -186,17 +188,25 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { } } -BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_non_visible_points) { - using Point_d = typename Exact_kernel_d::Point_d; +using list_of_1d_kernel_variants = boost::mpl::list, + CGAL::Epeck_d< CGAL::Dimension_tag<1>>, + CGAL::Epick_d< CGAL::Dynamic_dimension_tag >, + CGAL::Epick_d< CGAL::Dimension_tag<1>> + >; + +BOOST_AUTO_TEST_CASE_TEMPLATE(Weighted_alpha_complex_non_visible_points, Kernel, list_of_1d_kernel_variants) { + // check that for 2 closed weighted 1-d points, one with a high weight to hide the second one with a small weight, + // that the point with a small weight has the same high filtration value than the edge formed by the 2 points + using Point_d = typename Kernel::Point_d; std::vector points; std::vector p1 {0.}; points.emplace_back(p1.begin(), p1.end()); // closed enough points std::vector p2 {0.1}; points.emplace_back(p2.begin(), p2.end()); - std::vector weights {100., 0.01}; + std::vector weights {100., 0.01}; - Gudhi::alpha_complex::Alpha_complex alpha_complex(points, weights); + Gudhi::alpha_complex::Alpha_complex alpha_complex(points, weights); Gudhi::Simplex_tree<> stree; BOOST_CHECK(alpha_complex.create_complex(stree)); -- cgit v1.2.3 From baaf350869dbd5ff78e22cc4c3de9b8ab35b75ba Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 3 Nov 2020 11:56:52 +0100 Subject: code review: use relative error --- src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index 2cd66963..3df76dbf 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -179,8 +179,8 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { std::clog << std::endl; BOOST_CHECK(false); } - // I had to make a hard limit as it is converted from Kernel::FT - if (std::fabs(d3_itr->second - dD_itr->second) > 1e-5) { + // In safe mode, relative error is less than 1e-5 (can be changed with set_relative_precision_of_to_double) + if (std::fabs(d3_itr->second - dD_itr->second) / std::fabs(d3_itr->second) > 1e-5) { std::clog << d3_itr->second << " versus " << dD_itr->second << " diff " << std::fabs(d3_itr->second - dD_itr->second) << std::endl; BOOST_CHECK(false); } -- cgit v1.2.3 From 05e28e39717c4ca5871b13a350c4b142ec9a173b Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 3 Nov 2020 14:09:05 +0100 Subject: code review: use Marc's trick to test relative error --- .../test/Weighted_alpha_complex_unit_test.cpp | 38 ++++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index 3df76dbf..d267276c 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -49,31 +49,32 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_exact // Alpha complex from points Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); Gudhi::Simplex_tree<> simplex; - BOOST_CHECK(alpha_complex_from_points.create_complex(simplex, std::numeric_limits::Filtration_value>::infinity(), true)); - std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + Gudhi::Simplex_tree<>::Filtration_value infty = std::numeric_limits::Filtration_value>::infinity(); + BOOST_CHECK(alpha_complex_from_points.create_complex(simplex, infty, true)); + std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; for (auto f_simplex : simplex.filtration_simplex_range()) { std::clog << " ( "; for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { std::clog << vertex << " "; } - std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] "; - std::clog << std::endl; + std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] " << std::endl; } // Alpha complex from zero weighted points std::vector weights(20, 0.); Gudhi::alpha_complex::Alpha_complex alpha_complex_from_zero_weighted_points(points, weights); Gudhi::Simplex_tree<> zw_simplex; - BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex, std::numeric_limits::Filtration_value>::infinity(), true)); + BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex, infty, true)); - std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; for (auto f_simplex : zw_simplex.filtration_simplex_range()) { std::clog << " ( "; for (auto vertex : zw_simplex.simplex_vertex_range(f_simplex)) { std::clog << vertex << " "; } - std::clog << ") -> " << "[" << zw_simplex.filtration(f_simplex) << "] "; - std::clog << std::endl; + std::clog << ") -> " << "[" << zw_simplex.filtration(f_simplex) << "] " << std::endl; } BOOST_CHECK(zw_simplex == simplex); @@ -125,7 +126,8 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { Gudhi::Simplex_tree<> w_simplex_d; BOOST_CHECK(alpha_complex_dD_from_weighted_points.create_complex(w_simplex_d)); - std::clog << "Iterator on weighted alpha complex dD simplices in the filtration order, with [filtration value]:" << std::endl; + std::clog << "Iterator on weighted alpha complex dD simplices in the filtration order, with [filtration value]:" + << std::endl; for (auto f_simplex : w_simplex_d.filtration_simplex_range()) { Points points; for (auto vertex : w_simplex_d.simplex_vertex_range(f_simplex)) { @@ -148,7 +150,8 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { Gudhi::Simplex_tree<> w_simplex_3; BOOST_CHECK(alpha_complex_3D_from_weighted_points.create_complex(w_simplex_3)); - std::clog << "Iterator on weighted alpha complex 3D simplices in the filtration order, with [filtration value]:" << std::endl; + std::clog << "Iterator on weighted alpha complex 3D simplices in the filtration order, with [filtration value]:" + << std::endl; for (auto f_simplex : w_simplex_3.filtration_simplex_range()) { Points points; for (auto vertex : w_simplex_3.simplex_vertex_range(f_simplex)) { @@ -161,8 +164,7 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { for (auto point : points) { std::clog << point[0] << " " << point[1] << " " << point[2] << " | "; } - std::clog << ") -> " << "[" << w_simplex_3.filtration(f_simplex) << "] "; - std::clog << std::endl; + std::clog << ") -> " << "[" << w_simplex_3.filtration(f_simplex) << "] " << std::endl; pts_fltr_3d[points] = w_simplex_d.filtration(f_simplex); } @@ -180,8 +182,9 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { BOOST_CHECK(false); } // In safe mode, relative error is less than 1e-5 (can be changed with set_relative_precision_of_to_double) - if (std::fabs(d3_itr->second - dD_itr->second) / std::fabs(d3_itr->second) > 1e-5) { - std::clog << d3_itr->second << " versus " << dD_itr->second << " diff " << std::fabs(d3_itr->second - dD_itr->second) << std::endl; + if (std::fabs(d3_itr->second - dD_itr->second) > 1e-5 * (std::fabs(d3_itr->second) + std::fabs(dD_itr->second))) { + std::clog << d3_itr->second << " versus " << dD_itr->second << " diff " + << std::fabs(d3_itr->second - dD_itr->second) << std::endl; BOOST_CHECK(false); } ++dD_itr; @@ -210,18 +213,17 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Weighted_alpha_complex_non_visible_points, Kernel, Gudhi::Simplex_tree<> stree; BOOST_CHECK(alpha_complex.create_complex(stree)); - std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; + std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; for (auto f_simplex : stree.filtration_simplex_range()) { std::clog << " ( "; for (auto vertex : stree.simplex_vertex_range(f_simplex)) { std::clog << vertex << " "; } - std::clog << ") -> " << "[" << stree.filtration(f_simplex) << "] "; - std::clog << std::endl; + std::clog << ") -> " << "[" << stree.filtration(f_simplex) << "] " << std::endl; } BOOST_CHECK(stree.filtration(stree.find({0})) == -100.); BOOST_CHECK(stree.filtration(stree.find({1})) == stree.filtration(stree.find({0, 1}))); BOOST_CHECK(stree.filtration(stree.find({1})) > 100000); - } \ No newline at end of file -- cgit v1.2.3 From a506e8cee390b46076c21955f5b725193c628bc0 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 11 Jan 2021 09:22:52 +0100 Subject: Split weighted alpha complex unit tests as it uses a lot of memory and make the CI crash --- src/Alpha_complex/test/CMakeLists.txt | 14 +++ ..._alpha_complex_non_visible_points_unit_test.cpp | 60 ++++++++++++ .../test/Weighted_alpha_complex_unit_test.cpp | 102 --------------------- .../test/Zero_weighted_alpha_complex_unit_test.cpp | 77 ++++++++++++++++ 4 files changed, 151 insertions(+), 102 deletions(-) create mode 100644 src/Alpha_complex/test/Weighted_alpha_complex_non_visible_points_unit_test.cpp create mode 100644 src/Alpha_complex/test/Zero_weighted_alpha_complex_unit_test.cpp (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt index db5d840f..0595ca92 100644 --- a/src/Alpha_complex/test/CMakeLists.txt +++ b/src/Alpha_complex/test/CMakeLists.txt @@ -59,4 +59,18 @@ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) endif() gudhi_add_boost_test(Weighted_alpha_complex_test_unit) + add_executable ( Weighted_alpha_complex_non_visible_points_test_unit Weighted_alpha_complex_non_visible_points_unit_test.cpp ) + target_link_libraries(Weighted_alpha_complex_non_visible_points_test_unit ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Weighted_alpha_complex_non_visible_points_test_unit ${TBB_LIBRARIES}) + endif() + gudhi_add_boost_test(Weighted_alpha_complex_non_visible_points_test_unit) + + add_executable ( Zero_weighted_alpha_complex_test_unit Zero_weighted_alpha_complex_unit_test.cpp ) + target_link_libraries(Zero_weighted_alpha_complex_test_unit ${CGAL_LIBRARY}) + if (TBB_FOUND) + target_link_libraries(Zero_weighted_alpha_complex_test_unit ${TBB_LIBRARIES}) + endif() + gudhi_add_boost_test(Zero_weighted_alpha_complex_test_unit) + endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0) \ No newline at end of file diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_non_visible_points_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_non_visible_points_unit_test.cpp new file mode 100644 index 00000000..dd83c1da --- /dev/null +++ b/src/Alpha_complex/test/Weighted_alpha_complex_non_visible_points_unit_test.cpp @@ -0,0 +1,60 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2020 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "weighted_alpha_complex_non_visible_points" +#include +#include + +#include +#include + +#include + +#include +#include + + +using list_of_1d_kernel_variants = boost::mpl::list, + CGAL::Epeck_d< CGAL::Dimension_tag<1>>, + CGAL::Epick_d< CGAL::Dynamic_dimension_tag >, + CGAL::Epick_d< CGAL::Dimension_tag<1>> + >; + +BOOST_AUTO_TEST_CASE_TEMPLATE(Weighted_alpha_complex_non_visible_points, Kernel, list_of_1d_kernel_variants) { + // check that for 2 closed weighted 1-d points, one with a high weight to hide the second one with a small weight, + // that the point with a small weight has the same high filtration value than the edge formed by the 2 points + using Point_d = typename Kernel::Point_d; + std::vector points; + std::vector p1 {0.}; + points.emplace_back(p1.begin(), p1.end()); + // closed enough points + std::vector p2 {0.1}; + points.emplace_back(p2.begin(), p2.end()); + std::vector weights {100., 0.01}; + + Gudhi::alpha_complex::Alpha_complex alpha_complex(points, weights); + Gudhi::Simplex_tree<> stree; + BOOST_CHECK(alpha_complex.create_complex(stree)); + + std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; + for (auto f_simplex : stree.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : stree.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << stree.filtration(f_simplex) << "] " << std::endl; + } + + BOOST_CHECK(stree.filtration(stree.find({0})) == -100.); + BOOST_CHECK(stree.filtration(stree.find({1})) == stree.filtration(stree.find({0, 1}))); + BOOST_CHECK(stree.filtration(stree.find({1})) > 100000); +} \ No newline at end of file diff --git a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp index d267276c..875704ee 100644 --- a/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp @@ -13,10 +13,8 @@ #include #include -#include #include -#include // float comparison #include #include #include @@ -25,69 +23,6 @@ #include #include #include -#include - -using list_of_exact_kernel_variants = boost::mpl::list, - CGAL::Epeck_d< CGAL::Dimension_tag<4> > - > ; - -BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_exact_kernel_variants) { - // Check that in exact mode for static dimension 4 the code for dD unweighted and for dD weighted with all weights - // 0 give exactly the same simplex tree (simplices and filtration values). - - // Random points construction - using Point_d = typename Kernel::Point_d; - std::vector points; - std::uniform_real_distribution rd_pts(-10., 10.); - std::random_device rand_dev; - std::mt19937 rand_engine(rand_dev()); - for (int idx = 0; idx < 20; idx++) { - std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; - points.emplace_back(point.begin(), point.end()); - } - - // Alpha complex from points - Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); - Gudhi::Simplex_tree<> simplex; - Gudhi::Simplex_tree<>::Filtration_value infty = std::numeric_limits::Filtration_value>::infinity(); - BOOST_CHECK(alpha_complex_from_points.create_complex(simplex, infty, true)); - std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" - << std::endl; - for (auto f_simplex : simplex.filtration_simplex_range()) { - std::clog << " ( "; - for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { - std::clog << vertex << " "; - } - std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] " << std::endl; - } - - // Alpha complex from zero weighted points - std::vector weights(20, 0.); - Gudhi::alpha_complex::Alpha_complex alpha_complex_from_zero_weighted_points(points, weights); - Gudhi::Simplex_tree<> zw_simplex; - BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex, infty, true)); - - std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" - << std::endl; - for (auto f_simplex : zw_simplex.filtration_simplex_range()) { - std::clog << " ( "; - for (auto vertex : zw_simplex.simplex_vertex_range(f_simplex)) { - std::clog << vertex << " "; - } - std::clog << ") -> " << "[" << zw_simplex.filtration(f_simplex) << "] " << std::endl; - } - - BOOST_CHECK(zw_simplex == simplex); -} - -template -bool cgal_3d_point_sort (Point_d a,Point_d b) { - if (a[0] != b[0]) - return a[0] < b[0]; - if (a[1] != b[1]) - return a[1] < b[1]; - return a[2] < b[2]; -} BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { // check that for random weighted 3d points in safe mode the 3D and dD codes give the same result with some tolerance @@ -189,41 +124,4 @@ BOOST_AUTO_TEST_CASE(Weighted_alpha_complex_3d_comparison) { } ++dD_itr; } -} - -using list_of_1d_kernel_variants = boost::mpl::list, - CGAL::Epeck_d< CGAL::Dimension_tag<1>>, - CGAL::Epick_d< CGAL::Dynamic_dimension_tag >, - CGAL::Epick_d< CGAL::Dimension_tag<1>> - >; - -BOOST_AUTO_TEST_CASE_TEMPLATE(Weighted_alpha_complex_non_visible_points, Kernel, list_of_1d_kernel_variants) { - // check that for 2 closed weighted 1-d points, one with a high weight to hide the second one with a small weight, - // that the point with a small weight has the same high filtration value than the edge formed by the 2 points - using Point_d = typename Kernel::Point_d; - std::vector points; - std::vector p1 {0.}; - points.emplace_back(p1.begin(), p1.end()); - // closed enough points - std::vector p2 {0.1}; - points.emplace_back(p2.begin(), p2.end()); - std::vector weights {100., 0.01}; - - Gudhi::alpha_complex::Alpha_complex alpha_complex(points, weights); - Gudhi::Simplex_tree<> stree; - BOOST_CHECK(alpha_complex.create_complex(stree)); - - std::clog << "Iterator on weighted alpha complex simplices in the filtration order, with [filtration value]:" - << std::endl; - for (auto f_simplex : stree.filtration_simplex_range()) { - std::clog << " ( "; - for (auto vertex : stree.simplex_vertex_range(f_simplex)) { - std::clog << vertex << " "; - } - std::clog << ") -> " << "[" << stree.filtration(f_simplex) << "] " << std::endl; - } - - BOOST_CHECK(stree.filtration(stree.find({0})) == -100.); - BOOST_CHECK(stree.filtration(stree.find({1})) == stree.filtration(stree.find({0, 1}))); - BOOST_CHECK(stree.filtration(stree.find({1})) > 100000); } \ No newline at end of file diff --git a/src/Alpha_complex/test/Zero_weighted_alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Zero_weighted_alpha_complex_unit_test.cpp new file mode 100644 index 00000000..b7df07c7 --- /dev/null +++ b/src/Alpha_complex/test/Zero_weighted_alpha_complex_unit_test.cpp @@ -0,0 +1,77 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2020 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "zero_weighted_alpha_complex" +#include +#include + +#include + +#include +#include +#include // for std::fabs + +#include +#include +#include + +using list_of_exact_kernel_variants = boost::mpl::list, + CGAL::Epeck_d< CGAL::Dimension_tag<4> > + > ; + +BOOST_AUTO_TEST_CASE_TEMPLATE(Zero_weighted_alpha_complex, Kernel, list_of_exact_kernel_variants) { + // Check that in exact mode for static dimension 4 the code for dD unweighted and for dD weighted with all weights + // 0 give exactly the same simplex tree (simplices and filtration values). + + // Random points construction + using Point_d = typename Kernel::Point_d; + std::vector points; + std::uniform_real_distribution rd_pts(-10., 10.); + std::random_device rand_dev; + std::mt19937 rand_engine(rand_dev()); + for (int idx = 0; idx < 20; idx++) { + std::vector point {rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine), rd_pts(rand_engine)}; + points.emplace_back(point.begin(), point.end()); + } + + // Alpha complex from points + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); + Gudhi::Simplex_tree<> simplex; + Gudhi::Simplex_tree<>::Filtration_value infty = std::numeric_limits::Filtration_value>::infinity(); + BOOST_CHECK(alpha_complex_from_points.create_complex(simplex, infty, true)); + std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; + for (auto f_simplex : simplex.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : simplex.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << simplex.filtration(f_simplex) << "] " << std::endl; + } + + // Alpha complex from zero weighted points + std::vector weights(20, 0.); + Gudhi::alpha_complex::Alpha_complex alpha_complex_from_zero_weighted_points(points, weights); + Gudhi::Simplex_tree<> zw_simplex; + BOOST_CHECK(alpha_complex_from_zero_weighted_points.create_complex(zw_simplex, infty, true)); + + std::clog << "Iterator on zero weighted alpha complex simplices in the filtration order, with [filtration value]:" + << std::endl; + for (auto f_simplex : zw_simplex.filtration_simplex_range()) { + std::clog << " ( "; + for (auto vertex : zw_simplex.simplex_vertex_range(f_simplex)) { + std::clog << vertex << " "; + } + std::clog << ") -> " << "[" << zw_simplex.filtration(f_simplex) << "] " << std::endl; + } + + BOOST_CHECK(zw_simplex == simplex); +} \ No newline at end of file -- cgit v1.2.3 From ce73a29d4fee67b7d20c213df81edf57b0de8770 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Tue, 27 Apr 2021 17:41:15 +0200 Subject: Doxygen documentation improvement --- .circleci/config.yml | 9 +- .../for_maintainers/new_gudhi_version_creation.md | 9 +- src/Alpha_complex/doc/Intro_alpha_complex.h | 14 +- .../doc/Intro_bottleneck_distance.h | 2 +- src/Cech_complex/doc/Intro_cech_complex.h | 6 +- src/Collapse/doc/intro_edge_collapse.h | 4 +- src/Doxyfile.in | 44 ++--- src/Nerve_GIC/doc/Intro_graph_induced_complex.h | 10 +- .../doc/Intro_persistent_cohomology.h | 14 +- src/Rips_complex/doc/Intro_rips_complex.h | 24 +-- src/Simplex_tree/doc/Intro_simplex_tree.h | 8 +- .../doc/Intro_spatial_searching.h | 2 +- src/Subsampling/doc/Intro_subsampling.h | 6 +- .../doc/Intro_tangential_complex.h | 4 +- src/Witness_complex/doc/Witness_complex_doc.h | 4 +- src/cmake/modules/GUDHI_doxygen_target.cmake | 47 +++++- src/cmake/modules/GUDHI_user_version_target.cmake | 11 +- src/common/doc/examples.h | 184 +++++++++++---------- src/common/doc/installation.h | 157 +++++++++--------- src/common/include/gudhi/Points_3D_off_io.h | 4 +- src/common/include/gudhi/Points_off_io.h | 4 +- 21 files changed, 302 insertions(+), 265 deletions(-) (limited to 'src/Alpha_complex') diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fa9ae05..f6a875dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,10 +90,15 @@ jobs: mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DWITH_GUDHI_EXAMPLE=OFF -DWITH_GUDHI_TEST=OFF -DWITH_GUDHI_UTILITIES=OFF -DWITH_GUDHI_PYTHON=OFF -DUSER_VERSION_DIR=version .. + make user_version + cd version + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_GUDHI_EXAMPLE=OFF -DWITH_GUDHI_TEST=OFF -DWITH_GUDHI_UTILITIES=OFF -DWITH_GUDHI_PYTHON=OFF .. make doxygen 2>&1 | tee dox.log grep warning dox.log - cp dox.log version/doc/html/ - cp -R version/doc/html /tmp/doxygen + cp dox.log html/ + cp -R html /tmp/doxygen - store_artifacts: path: /tmp/doxygen diff --git a/.github/for_maintainers/new_gudhi_version_creation.md b/.github/for_maintainers/new_gudhi_version_creation.md index aadfae7d..d6c4cdd3 100644 --- a/.github/for_maintainers/new_gudhi_version_creation.md +++ b/.github/for_maintainers/new_gudhi_version_creation.md @@ -34,16 +34,21 @@ make -j 4 all && ctest -j 4 --output-on-failure ## Create the documentation ```bash mkdir gudhi.doc.@GUDHI_VERSION@ -make doxygen 2>&1 | tee dox.log && grep warning dox.log ``` ***[Check there are no error and the warnings]*** ```bash -cp -R gudhi.@GUDHI_VERSION@/doc/html gudhi.doc.@GUDHI_VERSION@/cpp cd gudhi.@GUDHI_VERSION@ rm -rf build; mkdir build; cd build cmake -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=/your/path/to/CGAL -DWITH_GUDHI_EXAMPLE=ON -DPython_ADDITIONAL_VERSIONS=3 .. +make doxygen 2>&1 | tee dox.log && grep warning dox.log +``` + +***[Check there are no error and the warnings]*** + +```bash +cp -R html ../../gudhi.doc.@GUDHI_VERSION@/cpp export LC_ALL=en_US.UTF-8 # cf. bug https://github.com/GUDHI/gudhi-devel/issues/111 make sphinx ``` diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index c068b268..f417ebb2 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -83,7 +83,7 @@ Table of Contents * * Then, it is asked to display information about the simplicial complex. * - * \include Alpha_complex/Alpha_complex_from_points.cpp + * \include Alpha_complex_from_points.cpp * * When launching: * @@ -92,7 +92,7 @@ Table of Contents * * the program output is: * - * \include Alpha_complex/alphaoffreader_for_doc_60.txt + * \include alphaoffreader_for_doc_60.txt * * \section createcomplexalgorithm Create complex algorithm * @@ -171,7 +171,7 @@ Table of Contents * * Then, it is asked to display information about the alpha complex. * - * \include Alpha_complex/Weighted_alpha_complex_from_points.cpp + * \include Weighted_alpha_complex_from_points.cpp * * When launching: * @@ -180,7 +180,7 @@ Table of Contents * * the program output is: * - * \include Alpha_complex/weightedalpha3dfrompoints_for_doc.txt + * \include weightedalpha3dfrompoints_for_doc.txt * * * \section offexample Example from OFF file @@ -190,7 +190,7 @@ Table of Contents * * Then, it is asked to display information about the alpha complex. * - * \include Alpha_complex/Alpha_complex_from_off.cpp + * \include Alpha_complex_from_off.cpp * * When launching: * @@ -199,7 +199,7 @@ Table of Contents * * the program output is: * - * \include Alpha_complex/alphaoffreader_for_doc_32.txt + * \include alphaoffreader_for_doc_32.txt * * * \section weighted3dexample 3d specific version @@ -215,7 +215,7 @@ Table of Contents * * Then, it is asked to display information about the alpha complex. * - * \include Alpha_complex/Weighted_alpha_complex_3d_from_points.cpp + * \include Weighted_alpha_complex_3d_from_points.cpp * * The results will be the same as in \ref weightedversion . * diff --git a/src/Bottleneck_distance/doc/Intro_bottleneck_distance.h b/src/Bottleneck_distance/doc/Intro_bottleneck_distance.h index 2a988b4b..4f5a956c 100644 --- a/src/Bottleneck_distance/doc/Intro_bottleneck_distance.h +++ b/src/Bottleneck_distance/doc/Intro_bottleneck_distance.h @@ -64,7 +64,7 @@ int main() { * \section bottleneckbasicexample Basic example * * This other example computes the bottleneck distance from 2 persistence diagrams: - * \include Bottleneck_distance/bottleneck_basic_example.cpp + * \include bottleneck_basic_example.cpp * * \code Bottleneck distance = 0.75 diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index 80c88dc6..698f9749 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -71,7 +71,7 @@ namespace cech_complex { * \ref rips_complex but it offers more topological guarantees. * * If the Cech_complex interfaces are not detailed enough for your need, please refer to - * + * * cech_complex_step_by_step.cpp example, where the graph construction over the Simplex_tree is more detailed. * * \subsection cechpointscloudexample Example from a point cloud @@ -81,7 +81,7 @@ namespace cech_complex { * * Then, it is asked to display information about the simplicial complex. * - * \include Cech_complex/cech_complex_example_from_points.cpp + * \include cech_complex_example_from_points.cpp * * When launching (maximal enclosing ball radius is 1., is expanded until dimension 2): * @@ -90,7 +90,7 @@ namespace cech_complex { * * the program output is: * - * \include Cech_complex/cech_complex_example_from_points_for_doc.txt + * \include cech_complex_example_from_points_for_doc.txt * */ /** @} */ // end defgroup cech_complex diff --git a/src/Collapse/doc/intro_edge_collapse.h b/src/Collapse/doc/intro_edge_collapse.h index 81edd79f..fde39707 100644 --- a/src/Collapse/doc/intro_edge_collapse.h +++ b/src/Collapse/doc/intro_edge_collapse.h @@ -81,7 +81,7 @@ namespace collapse { * Then it collapses edges and displays a new list of `Filtered_edge` (with less edges) * that will preserve the persistence homology computation. * - * \include Collapse/edge_collapse_basic_example.cpp + * \include edge_collapse_basic_example.cpp * * When launching the example: * @@ -90,7 +90,7 @@ namespace collapse { * * the program output is: * - * \include Collapse/edge_collapse_example_basic.txt + * \include edge_collapse_example_basic.txt */ /** @} */ // end defgroup strong_collapse diff --git a/src/Doxyfile.in b/src/Doxyfile.in index 49e781bd..4784b915 100644 --- a/src/Doxyfile.in +++ b/src/Doxyfile.in @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "GUDHI" +PROJECT_NAME = "@CMAKE_PROJECT_NAME@" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = "doc/" +OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -672,9 +672,9 @@ LAYOUT_FILE = # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. -CITE_BIB_FILES = biblio/bibliography.bib \ - biblio/how_to_cite_cgal.bib \ - biblio/how_to_cite_gudhi.bib +CITE_BIB_FILES = @CMAKE_SOURCE_DIR@/biblio/bibliography.bib \ + @CMAKE_SOURCE_DIR@/biblio/how_to_cite_cgal.bib \ + @CMAKE_SOURCE_DIR@/biblio/how_to_cite_gudhi.bib #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -745,7 +745,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = +INPUT = @CMAKE_SOURCE_DIR@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -780,13 +780,14 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = data/ \ - example/ \ - GudhUI/ \ - cmake/ \ - python/ \ - ext/ \ - README.md +EXCLUDE = @CMAKE_SOURCE_DIR@/data/ \ + @CMAKE_SOURCE_DIR@/ext/ \ + @CMAKE_SOURCE_DIR@/README.md \ + @CMAKE_SOURCE_DIR@/.github \ + @CMAKE_CURRENT_BINARY_DIR@/new_gudhi_version_creation.md \ + @GUDHI_DOXYGEN_SOURCE_PREFIX@/GudhUI/ \ + @GUDHI_DOXYGEN_SOURCE_PREFIX@/cmake/ \ + @GUDHI_DOXYGEN_SOURCE_PREFIX@/python/ \ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -802,7 +803,7 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = */utilities/*/*.md +EXCLUDE_PATTERNS = @GUDHI_DOXYGEN_SOURCE_PREFIX@/@GUDHI_DOXYGEN_UTILS_PATH@/*.md # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -819,10 +820,9 @@ EXCLUDE_SYMBOLS = # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = biblio/ \ - example/ \ - utilities/ \ - data/ +EXAMPLE_PATH = @CMAKE_SOURCE_DIR@/biblio/ \ + @CMAKE_SOURCE_DIR@/data/ \ + @GUDHI_DOXYGEN_EXAMPLE_PATH@ # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -890,7 +890,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = doc/common/main_page.md +USE_MDFILE_AS_MAINPAGE = @GUDHI_DOXYGEN_COMMON_DOC_PATH@/main_page.md #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1046,7 +1046,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = doc/common/header.html +HTML_HEADER = @GUDHI_DOXYGEN_COMMON_DOC_PATH@/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1056,7 +1056,7 @@ HTML_HEADER = doc/common/header.html # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = doc/common/footer.html +HTML_FOOTER = @GUDHI_DOXYGEN_COMMON_DOC_PATH@/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1068,7 +1068,7 @@ HTML_FOOTER = doc/common/footer.html # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = doc/common/stylesheet.css +HTML_STYLESHEET = @GUDHI_DOXYGEN_COMMON_DOC_PATH@/stylesheet.css # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets diff --git a/src/Nerve_GIC/doc/Intro_graph_induced_complex.h b/src/Nerve_GIC/doc/Intro_graph_induced_complex.h index f9441b24..a6098860 100644 --- a/src/Nerve_GIC/doc/Intro_graph_induced_complex.h +++ b/src/Nerve_GIC/doc/Intro_graph_induced_complex.h @@ -53,7 +53,7 @@ namespace cover_complex { * covering the height function (coordinate 2), * which are then refined into their connected components using the triangulation of the .OFF file. * - * \include Nerve_GIC/Nerve.cpp + * \include Nerve.cpp * * When launching: * @@ -62,7 +62,7 @@ namespace cover_complex { * * the program output is: * - * \include Nerve_GIC/Nerve.txt + * \include Nerve.txt * * The program also writes a file ../../data/points/human_sc.txt. The first three lines in this file are the location * of the input point cloud and the function used to compute the cover. @@ -96,7 +96,7 @@ namespace cover_complex { * comes from the triangulation of the human shape. Note that the resulting simplicial complex is in dimension 3 * in this example. * - * \include Nerve_GIC/VoronoiGIC.cpp + * \include VoronoiGIC.cpp * * When launching: * @@ -129,7 +129,7 @@ namespace cover_complex { * with automatic resolution and gain. Note that automatic threshold, resolution and gain * can be computed as well for the Nerve. * - * \include Nerve_GIC/CoordGIC.cpp + * \include CoordGIC.cpp * * When launching: * @@ -152,7 +152,7 @@ namespace cover_complex { * The function is now the first eigenfunction given by PCA, whose values * are written in a file (lucky_cat_PCA1). Threshold, resolution and gain are automatically selected as before. * - * \include Nerve_GIC/FuncGIC.cpp + * \include FuncGIC.cpp * * When launching: * diff --git a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h index b4f9fd2c..a3613d0d 100644 --- a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h +++ b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h @@ -131,7 +131,7 @@ namespace persistent_cohomology { We provide several example files: run these examples with -h for details on their use, and read the README file. -\li +\li Rips_complex/rips_persistence.cpp computes the Rips complex of a point cloud and outputs its persistence diagram. \code $> ./rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 3 \endcode @@ -144,11 +144,11 @@ diagram. More details on the Rips complex utilities dedicated page. -\li +\li Persistent_cohomology/rips_multifield_persistence.cpp computes the Rips complex of a point cloud and outputs its persistence diagram with a family of field coefficients. -\li +\li Rips_complex/rips_distance_matrix_persistence.cpp computes the Rips complex of a distance matrix and outputs its persistence diagram. @@ -158,7 +158,7 @@ Please refer to data/distance_matrix/lower_triangular_distance_matrix.csv for an More details on the Rips complex utilities dedicated page. -\li +\li Rips_complex/rips_correlation_matrix_persistence.cpp computes the Rips complex of a correlation matrix and outputs its persistence diagram. @@ -169,7 +169,7 @@ Please refer to data/correlation_matrix/lower_triangular_correlation_matrix.csv More details on the Rips complex utilities dedicated page. -\li +\li Alpha_complex/alpha_complex_3d_persistence.cpp computes the persistent homology with \f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file. \code $> ./alpha_complex_3d_persistence ../../data/points/tore3D_300.off -p 2 -m 0.45 \endcode @@ -235,7 +235,7 @@ Note that the lengths of the sides of the periodic cuboid have to be the same. +\li Alpha_complex/alpha_complex_persistence.cpp computes the persistent homology with \f$\mathbb{Z}/p\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file. \code $> ./alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off \endcode @@ -248,7 +248,7 @@ Simplex_tree dim: 3 More details on the Alpha complex utilities dedicated page. -\li +\li Persistent_cohomology/plain_homology.cpp computes the plain homology of a simple simplicial complex without filtration values. diff --git a/src/Rips_complex/doc/Intro_rips_complex.h b/src/Rips_complex/doc/Intro_rips_complex.h index b2840686..3888ec8f 100644 --- a/src/Rips_complex/doc/Intro_rips_complex.h +++ b/src/Rips_complex/doc/Intro_rips_complex.h @@ -64,7 +64,7 @@ namespace rips_complex { * And so on for simplex (0,1,2,3). * * If the Rips_complex interfaces are not detailed enough for your need, please refer to - * + * * rips_persistence_step_by_step.cpp example, where the constructions of the graph and * the Simplex_tree are more detailed. * @@ -111,7 +111,7 @@ namespace rips_complex { * * Then, it is asked to display information about the simplicial complex. * - * \include Rips_complex/example_one_skeleton_rips_from_points.cpp + * \include example_one_skeleton_rips_from_points.cpp * * When launching (Rips maximal distance between 2 points is 12.0, is expanded * until dimension 1 - one skeleton graph in other words): @@ -121,7 +121,7 @@ namespace rips_complex { * * the program output is: * - * \include Rips_complex/one_skeleton_rips_for_doc.txt + * \include one_skeleton_rips_for_doc.txt * * \subsection ripsoffexample Example from OFF file * @@ -132,7 +132,7 @@ namespace rips_complex { * * Then, it is asked to display information about the Rips complex. * - * \include Rips_complex/example_rips_complex_from_off_file.cpp + * \include example_rips_complex_from_off_file.cpp * * When launching: * @@ -141,7 +141,7 @@ namespace rips_complex { * * the program output is: * - * \include Rips_complex/full_skeleton_rips_for_doc.txt + * \include full_skeleton_rips_for_doc.txt * * * \subsection sparseripspointscloudexample Example of a sparse Rips from a point cloud @@ -149,7 +149,7 @@ namespace rips_complex { * This example builds the full sparse Rips of a set of 2D Euclidean points, then prints some minimal * information about the complex. * - * \include Rips_complex/example_sparse_rips.cpp + * \include example_sparse_rips.cpp * * When launching: * @@ -172,7 +172,7 @@ namespace rips_complex { * * Then, it is asked to display information about the simplicial complex. * - * \include Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp + * \include example_one_skeleton_rips_from_distance_matrix.cpp * * When launching (Rips maximal distance between 2 points is 1.0, is expanded until dimension 1 - one skeleton graph * with other words): @@ -182,7 +182,7 @@ namespace rips_complex { * * the program output is: * - * \include Rips_complex/one_skeleton_rips_for_doc.txt + * \include one_skeleton_rips_for_doc.txt * * \subsection ripscsvdistanceexample Example from a distance matrix read in a csv file * @@ -192,7 +192,7 @@ namespace rips_complex { * * Then, it is asked to display information about the Rips complex. * - * \include Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp + * \include example_rips_complex_from_csv_distance_matrix_file.cpp * * When launching: * @@ -201,7 +201,7 @@ namespace rips_complex { * * the program output is: * - * \include Rips_complex/full_skeleton_rips_for_doc.txt + * \include full_skeleton_rips_for_doc.txt * * * \section ripscorrelationematrix Correlation matrix @@ -213,7 +213,7 @@ namespace rips_complex { * * Then, it is asked to display information about the simplicial complex. * - * \include Rips_complex/example_one_skeleton_rips_from_correlation_matrix.cpp + * \include example_one_skeleton_rips_from_correlation_matrix.cpp * * When launching: * @@ -222,7 +222,7 @@ namespace rips_complex { * * the program output is: * - * \include Rips_complex/one_skeleton_rips_from_correlation_matrix_for_doc.txt + * \include one_skeleton_rips_from_correlation_matrix_for_doc.txt * * All the other constructions discussed for Rips complex for distance matrix can be also performed for Rips complexes * construction from correlation matrices. diff --git a/src/Simplex_tree/doc/Intro_simplex_tree.h b/src/Simplex_tree/doc/Intro_simplex_tree.h index 800879fe..ef8dec91 100644 --- a/src/Simplex_tree/doc/Intro_simplex_tree.h +++ b/src/Simplex_tree/doc/Intro_simplex_tree.h @@ -39,10 +39,10 @@ namespace Gudhi { * \subsubsection filteredcomplexessimplextreeexamples Examples * * Here is a list of simplex tree examples : - * \li + * \li * Simplex_tree/simple_simplex_tree.cpp - Simple simplex tree construction and basic function use. * - * \li + * \li * Simplex_tree/simplex_tree_from_cliques_of_graph.cpp - Simplex tree construction from cliques of graph read in * a file. * @@ -54,11 +54,11 @@ Expand the simplex tree in 3.8e-05 s. Information of the Simplex Tree: Number of vertices = 10 Number of simplices = 98 \endcode * - * \li + * \li * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp - Simplex tree is computed and displayed * from a 3D alpha complex (Requires CGAL, GMP and GMPXX to be installed). * - * \li + * \li * Simplex_tree/graph_expansion_with_blocker.cpp - Simple simplex tree construction from a one-skeleton graph with * a simple blocker expansion method. * diff --git a/src/Spatial_searching/doc/Intro_spatial_searching.h b/src/Spatial_searching/doc/Intro_spatial_searching.h index 30805570..81c5a3aa 100644 --- a/src/Spatial_searching/doc/Intro_spatial_searching.h +++ b/src/Spatial_searching/doc/Intro_spatial_searching.h @@ -36,7 +36,7 @@ namespace spatial_searching { * * This example generates 500 random points, then performs all-near-neighbors searches, and queries for nearest and furthest neighbors using different methods. * - * \include Spatial_searching/example_spatial_searching.cpp + * \include example_spatial_searching.cpp * */ /** @} */ // end defgroup spatial_searching diff --git a/src/Subsampling/doc/Intro_subsampling.h b/src/Subsampling/doc/Intro_subsampling.h index 1c84fb2e..1c366fe6 100644 --- a/src/Subsampling/doc/Intro_subsampling.h +++ b/src/Subsampling/doc/Intro_subsampling.h @@ -32,20 +32,20 @@ namespace subsampling { * squared distance between any two points * is greater than or equal to 0.4. * - * \include Subsampling/example_sparsify_point_set.cpp + * \include example_sparsify_point_set.cpp * * \section farthestpointexamples Example: choose_n_farthest_points * * This example outputs a subset of 100 points obtained by González algorithm, * starting with a random point. * - * \include Subsampling/example_choose_n_farthest_points.cpp + * \include example_choose_n_farthest_points.cpp * * \section randompointexamples Example: pick_n_random_points * * This example outputs a subset of 100 points picked randomly. * - * \include Subsampling/example_pick_n_random_points.cpp + * \include example_pick_n_random_points.cpp */ /** @} */ // end defgroup subsampling diff --git a/src/Tangential_complex/doc/Intro_tangential_complex.h b/src/Tangential_complex/doc/Intro_tangential_complex.h index ce277185..cb8c6122 100644 --- a/src/Tangential_complex/doc/Intro_tangential_complex.h +++ b/src/Tangential_complex/doc/Intro_tangential_complex.h @@ -88,7 +88,7 @@ This example builds the Tangential complex of point set. Note that the dimension of the kernel here is dynamic, which is slower, but more flexible: the intrinsic and ambient dimensions does not have to be known at compile-time. -\include Tangential_complex/example_basic.cpp +\include example_basic.cpp \section example_with_perturb Example with perturbation @@ -97,7 +97,7 @@ by perturbing the positions of points involved in inconsistent simplices. Note that the dimension of the kernel here is static, which is the best choice when the dimensions are known at compile-time. -\include Tangential_complex/example_with_perturb.cpp +\include example_with_perturb.cpp */ /** @} */ // end defgroup tangential_complex diff --git a/src/Witness_complex/doc/Witness_complex_doc.h b/src/Witness_complex/doc/Witness_complex_doc.h index 202f4539..c66b106e 100644 --- a/src/Witness_complex/doc/Witness_complex_doc.h +++ b/src/Witness_complex/doc/Witness_complex_doc.h @@ -108,14 +108,14 @@ int main(int argc, char * const argv[]) { Here is an example of constructing a strong witness complex filtration and computing persistence on it: - \include Witness_complex/strong_witness_persistence.cpp + \include strong_witness_persistence.cpp \section witnessexample3 Example3: Computing relaxed witness complex persistence from a distance matrix In this example we compute the relaxed witness complex persistence from a given matrix of closest landmarks to each witness. Each landmark is given as the couple (index, distance). - \include Witness_complex/example_nearest_landmark_table.cpp + \include example_nearest_landmark_table.cpp */ diff --git a/src/cmake/modules/GUDHI_doxygen_target.cmake b/src/cmake/modules/GUDHI_doxygen_target.cmake index 7a84c4e0..0f80b187 100644 --- a/src/cmake/modules/GUDHI_doxygen_target.cmake +++ b/src/cmake/modules/GUDHI_doxygen_target.cmake @@ -8,14 +8,47 @@ if(DOXYGEN_FOUND) get_property(DOXYGEN_EXECUTABLE TARGET Doxygen::doxygen PROPERTY IMPORTED_LOCATION) endif() - add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${GUDHI_USER_VERSION_DIR}/Doxyfile - WORKING_DIRECTORY ${GUDHI_USER_VERSION_DIR} - COMMENT "Generating API documentation with Doxygen in ${GUDHI_USER_VERSION_DIR}/doc/html/" VERBATIM) - - if(TARGET user_version) - # In dev version, doxygen target depends on user_version target. Not existing in user version - add_dependencies(doxygen user_version) + message("++ Project = ${CMAKE_PROJECT_NAME}") + if (CMAKE_PROJECT_NAME STREQUAL "GUDHIdev") + # Set Doxyfile.in variables for the developer version + set(GUDHI_DOXYGEN_SOURCE_PREFIX "${CMAKE_SOURCE_DIR}/src") + foreach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/doc/") + set(GUDHI_DOXYGEN_IMAGE_PATH "${GUDHI_DOXYGEN_IMAGE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/doc/ \\ \n") + endif() + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/example/") + set(GUDHI_DOXYGEN_EXAMPLE_PATH "${GUDHI_DOXYGEN_EXAMPLE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/example/ \\ \n") + endif() + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/utilities/") + set(GUDHI_DOXYGEN_EXAMPLE_PATH "${GUDHI_DOXYGEN_EXAMPLE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/${GUDHI_MODULE}/utilities/ \\ \n") + endif() + endforeach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) + set(GUDHI_DOXYGEN_COMMON_DOC_PATH "${GUDHI_DOXYGEN_SOURCE_PREFIX}/common/doc") + set(GUDHI_DOXYGEN_UTILS_PATH "*/utilities") + endif() + if (CMAKE_PROJECT_NAME STREQUAL "GUDHI") + # Set Doxyfile.in variables for the user version + set(GUDHI_DOXYGEN_SOURCE_PREFIX "${CMAKE_SOURCE_DIR}") + foreach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/doc/${GUDHI_MODULE}") + set(GUDHI_DOXYGEN_IMAGE_PATH "${GUDHI_DOXYGEN_IMAGE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/doc/${GUDHI_MODULE}/ \\ \n") + endif() + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/example/${GUDHI_MODULE}") + set(GUDHI_DOXYGEN_EXAMPLE_PATH "${GUDHI_DOXYGEN_EXAMPLE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/example/${GUDHI_MODULE}/ \\ \n") + endif() + if(EXISTS "${GUDHI_DOXYGEN_SOURCE_PREFIX}/utilities/${GUDHI_MODULE}") + set(GUDHI_DOXYGEN_EXAMPLE_PATH "${GUDHI_DOXYGEN_EXAMPLE_PATH} ${GUDHI_DOXYGEN_SOURCE_PREFIX}/utilities/${GUDHI_MODULE}/ \\ \n") + endif() + endforeach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) + set(GUDHI_DOXYGEN_COMMON_DOC_PATH "${GUDHI_DOXYGEN_SOURCE_PREFIX}/doc/common") + set(GUDHI_DOXYGEN_UTILS_PATH "utilities/*") endif() + + configure_file(${GUDHI_DOXYGEN_SOURCE_PREFIX}/Doxyfile.in "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile" @ONLY) + + add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating API documentation with Doxygen in 'html' directory" VERBATIM) else() set(GUDHI_MISSING_MODULES ${GUDHI_MISSING_MODULES} "cpp-documentation" CACHE INTERNAL "GUDHI_MISSING_MODULES") endif() diff --git a/src/cmake/modules/GUDHI_user_version_target.cmake b/src/cmake/modules/GUDHI_user_version_target.cmake index e4f39aae..9e76c3d9 100644 --- a/src/cmake/modules/GUDHI_user_version_target.cmake +++ b/src/cmake/modules/GUDHI_user_version_target.cmake @@ -14,14 +14,7 @@ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${GUDHI_USER_VERSION_DIR} COMMENT "user_version creation in ${GUDHI_USER_VERSION_DIR}") -foreach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) - set(GUDHI_DOXYGEN_IMAGE_PATH "${GUDHI_DOXYGEN_IMAGE_PATH} doc/${GUDHI_MODULE}/ \\ \n") -endforeach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) - -# Generate Doxyfile for Doxygen - cf. root CMakeLists.txt for explanation -configure_file(${CMAKE_SOURCE_DIR}/src/Doxyfile.in "${CMAKE_CURRENT_BINARY_DIR}/src/Doxyfile" @ONLY) -add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E - copy ${CMAKE_CURRENT_BINARY_DIR}/src/Doxyfile ${GUDHI_USER_VERSION_DIR}/Doxyfile) +file(COPY "${CMAKE_SOURCE_DIR}/src/Doxyfile.in" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/") # Generate bib files for Doxygen - cf. root CMakeLists.txt for explanation string(TIMESTAMP GUDHI_VERSION_YEAR "%Y") @@ -48,6 +41,8 @@ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/src/GUDHIConfig.cmake.in ${GUDHI_USER_VERSION_DIR}/GUDHIConfig.cmake.in) add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/CMakeGUDHIVersion.txt ${GUDHI_USER_VERSION_DIR}/CMakeGUDHIVersion.txt) +add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/src/Doxyfile.in ${GUDHI_USER_VERSION_DIR}/Doxyfile.in) # As cython generates .cpp files in source, we have to copy all except cpp files from python directory file(GLOB_RECURSE PYTHON_FILES ${CMAKE_SOURCE_DIR}/${GUDHI_PYTHON_PATH}/*) diff --git a/src/common/doc/examples.h b/src/common/doc/examples.h index 474f8699..b557727b 100644 --- a/src/common/doc/examples.h +++ b/src/common/doc/examples.h @@ -1,96 +1,98 @@ // List of GUDHI examples - Doxygen needs at least a file tag to analyse comments // In user_version, `find . -name "*.cpp"` in example and utilities folders /*! @file Examples - * @example Alpha_complex/Alpha_complex_from_off.cpp - * @example Alpha_complex/Alpha_complex_from_points.cpp - * @example Bottleneck_distance/bottleneck_basic_example.cpp - * @example Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp - * @example Witness_complex/example_nearest_landmark_table.cpp - * @example Witness_complex/example_witness_complex_off.cpp - * @example Witness_complex/example_witness_complex_sphere.cpp - * @example Witness_complex/example_strong_witness_complex_off.cpp - * @example Simplex_tree/mini_simplex_tree.cpp - * @example Simplex_tree/graph_expansion_with_blocker.cpp - * @example Simplex_tree/simple_simplex_tree.cpp - * @example Simplex_tree/simplex_tree_from_cliques_of_graph.cpp - * @example Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp - * @example Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp - * @example Persistent_cohomology/plain_homology.cpp - * @example Persistent_cohomology/persistence_from_file.cpp - * @example Persistent_cohomology/rips_persistence_step_by_step.cpp - * @example Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp - * @example Persistent_cohomology/custom_persistence_sort.cpp - * @example Persistent_cohomology/persistence_from_simple_simplex_tree.cpp - * @example Persistent_cohomology/rips_multifield_persistence.cpp - * @example Skeleton_blocker/Skeleton_blocker_from_simplices.cpp - * @example Skeleton_blocker/Skeleton_blocker_iteration.cpp - * @example Skeleton_blocker/Skeleton_blocker_link.cpp - * @example Contraction/Garland_heckbert.cpp - * @example Contraction/Rips_contraction.cpp - * @example Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp - * @example common/example_CGAL_3D_points_off_reader.cpp - * @example common/example_vector_double_points_off_reader.cpp - * @example common/example_CGAL_points_off_reader.cpp - * @example Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp - * @example Rips_complex/example_one_skeleton_rips_from_points.cpp - * @example Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp - * @example Rips_complex/example_rips_complex_from_off_file.cpp - * @example Persistence_representations/persistence_intervals.cpp - * @example Persistence_representations/persistence_vectors.cpp - * @example Persistence_representations/persistence_heat_maps.cpp - * @example Persistence_representations/persistence_landscape_on_grid.cpp - * @example Persistence_representations/persistence_landscape.cpp - * @example Tangential_complex/example_basic.cpp - * @example Tangential_complex/example_with_perturb.cpp - * @example Subsampling/example_custom_distance.cpp - * @example Subsampling/example_choose_n_farthest_points.cpp - * @example Subsampling/example_sparsify_point_set.cpp - * @example Subsampling/example_pick_n_random_points.cpp - * @example Nerve_GIC/CoordGIC.cpp - * @example Nerve_GIC/Nerve.cpp - * @example Nerve_GIC/FuncGIC.cpp - * @example Nerve_GIC/VoronoiGIC.cpp - * @example Spatial_searching/example_spatial_searching.cpp - * @example Alpha_complex/alpha_complex_3d_persistence.cpp - * @example Alpha_complex/alpha_complex_persistence.cpp - * @example Alpha_complex/Weighted_alpha_complex_3d_from_points.cpp - * @example Bottleneck_distance/bottleneck_distance.cpp - * @example Witness_complex/weak_witness_persistence.cpp - * @example Witness_complex/strong_witness_persistence.cpp - * @example Bitmap_cubical_complex/cubical_complex_persistence.cpp - * @example Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp - * @example common/off_file_from_shape_generator.cpp - * @example Rips_complex/rips_distance_matrix_persistence.cpp - * @example Rips_complex/rips_persistence.cpp - * @example Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp - * @example Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp - * @example Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp - * @example Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp - * @example Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp - * @example Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp - * @example Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp - * @example Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp - * @example Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp - * @example Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp - * @example Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp - * @example Persistence_representations/persistence_heat_maps/create_pssk.cpp - * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp - * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp - * @example Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp - * @example Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp - * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp - * @example Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp - * @example Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp - * @example Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp - * @example Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp - * @example Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp - * @example Persistence_representations/persistence_vectors/average_persistence_vectors.cpp - * @example Persistence_representations/persistence_vectors/create_persistence_vectors.cpp - * @example Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp - * @example Persistence_representations/persistence_landscapes/average_landscapes.cpp - * @example Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp - * @example Persistence_representations/persistence_landscapes/create_landscapes.cpp - * @example Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp - * @example Persistence_representations/persistence_landscapes/plot_landscapes.cpp + * \section Alpha_complex_examples Alpha complex + * @example Alpha_complex_from_off.cpp + * @example Alpha_complex_from_points.cpp + * \section bottleneck_examples bottleneck + * @example bottleneck_basic_example.cpp + * @example alpha_rips_persistence_bottleneck_distance.cpp + * @example example_nearest_landmark_table.cpp + * @example example_witness_complex_off.cpp + * @example example_witness_complex_sphere.cpp + * @example example_strong_witness_complex_off.cpp + * @example mini_simplex_tree.cpp + * @example graph_expansion_with_blocker.cpp + * @example simple_simplex_tree.cpp + * @example simplex_tree_from_cliques_of_graph.cpp + * @example example_alpha_shapes_3_simplex_tree_from_off_file.cpp + * @example cech_complex_cgal_mini_sphere_3d.cpp + * @example plain_homology.cpp + * @example persistence_from_file.cpp + * @example rips_persistence_step_by_step.cpp + * @example rips_persistence_via_boundary_matrix.cpp + * @example custom_persistence_sort.cpp + * @example persistence_from_simple_simplex_tree.cpp + * @example rips_multifield_persistence.cpp + * @example Skeleton_blocker_from_simplices.cpp + * @example Skeleton_blocker_iteration.cpp + * @example Skeleton_blocker_link.cpp + * @example Garland_heckbert.cpp + * @example Rips_contraction.cpp + * @example Random_bitmap_cubical_complex.cpp + * @example example_CGAL_3D_points_off_reader.cpp + * @example example_vector_double_points_off_reader.cpp + * @example example_CGAL_points_off_reader.cpp + * @example example_one_skeleton_rips_from_distance_matrix.cpp + * @example example_one_skeleton_rips_from_points.cpp + * @example example_rips_complex_from_csv_distance_matrix_file.cpp + * @example example_rips_complex_from_off_file.cpp + * @example persistence_intervals.cpp + * @example persistence_vectors.cpp + * @example persistence_heat_maps.cpp + * @example persistence_landscape_on_grid.cpp + * @example persistence_landscape.cpp + * @example example_basic.cpp + * @example example_with_perturb.cpp + * @example example_custom_distance.cpp + * @example example_choose_n_farthest_points.cpp + * @example example_sparsify_point_set.cpp + * @example example_pick_n_random_points.cpp + * @example CoordGIC.cpp + * @example Nerve.cpp + * @example FuncGIC.cpp + * @example VoronoiGIC.cpp + * @example example_spatial_searching.cpp + * @example alpha_complex_3d_persistence.cpp + * @example alpha_complex_persistence.cpp + * @example Weighted_alpha_complex_3d_from_points.cpp + * @example bottleneck_distance.cpp + * @example weak_witness_persistence.cpp + * @example strong_witness_persistence.cpp + * @example cubical_complex_persistence.cpp + * @example periodic_cubical_complex_persistence.cpp + * @example off_file_from_shape_generator.cpp + * @example rips_distance_matrix_persistence.cpp + * @example rips_persistence.cpp + * @example persistence_landscapes_on_grid/create_landscapes_on_grid.cpp + * @example persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp + * @example persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp + * @example persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp + * @example persistence_landscapes_on_grid/average_landscapes_on_grid.cpp + * @example persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp + * @example persistence_intervals/compute_number_of_dominant_intervals.cpp + * @example persistence_intervals/plot_persistence_Betti_numbers.cpp + * @example persistence_intervals/plot_persistence_intervals.cpp + * @example persistence_intervals/plot_histogram_of_intervals_lengths.cpp + * @example persistence_intervals/compute_bottleneck_distance.cpp + * @example persistence_heat_maps/create_pssk.cpp + * @example persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp + * @example persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp + * @example persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp + * @example persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp + * @example persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp + * @example persistence_heat_maps/average_persistence_heat_maps.cpp + * @example persistence_heat_maps/plot_persistence_heat_map.cpp + * @example persistence_heat_maps/create_persistence_heat_maps.cpp + * @example persistence_vectors/plot_persistence_vectors.cpp + * @example persistence_vectors/compute_distance_of_persistence_vectors.cpp + * @example persistence_vectors/average_persistence_vectors.cpp + * @example persistence_vectors/create_persistence_vectors.cpp + * @example persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp + * @example persistence_landscapes/average_landscapes.cpp + * @example persistence_landscapes/compute_scalar_product_of_landscapes.cpp + * @example persistence_landscapes/create_landscapes.cpp + * @example persistence_landscapes/compute_distance_of_landscapes.cpp + * @example persistence_landscapes/plot_landscapes.cpp */ diff --git a/src/common/doc/installation.h b/src/common/doc/installation.h index c2e63a24..313184b6 100644 --- a/src/common/doc/installation.h +++ b/src/common/doc/installation.h @@ -40,11 +40,8 @@ make \endverbatim * \subsection documentationgeneration Documentation * To generate the documentation, Doxygen is required. * Run the following command in a terminal: -\verbatim -make doxygen -# Documentation will be generated in the folder YYYY-MM-DD-hh-mm-ss_GUDHI_X.Y.Z/doc/html/ -# You can customize the directory name by calling `cmake -DUSER_VERSION_DIR=/my/custom/folder` -\endverbatim + * \verbatim make doxygen \endverbatim + * Documentation will be generated in a folder named html. * * \subsection helloworld Hello world ! * The Hello world for GUDHI @@ -57,7 +54,7 @@ make doxygen * * The following example requires the GNU Multiple Precision Arithmetic * Library (GMP) and will not be built if GMP is not installed: - * \li + * \li * Persistent_cohomology/rips_multifield_persistence.cpp * * Having GMP version 4.2 or higher installed is recommended. @@ -75,55 +72,55 @@ make doxygen * * The following examples/utilities require the Computational Geometry Algorithms * Library (CGAL \cite cgal:eb-19b) and will not be built if CGAL version 4.11.0 or higher is not installed: - * \li + * \li * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp - * \li + * \li * Witness_complex/strong_witness_persistence.cpp - * \li + * \li * Witness_complex/weak_witness_persistence.cpp - * \li + * \li * Witness_complex/example_strong_witness_complex_off.cpp - * \li + * \li * Witness_complex/example_witness_complex_off.cpp - * \li + * \li * Witness_complex/example_witness_complex_sphere.cpp - * \li + * \li * Alpha_complex/Alpha_complex_from_off.cpp - * \li + * \li * Alpha_complex/Alpha_complex_from_points.cpp - * \li + * \li * Alpha_complex/alpha_complex_persistence.cpp - * \li + * \li * Persistent_cohomology/custom_persistence_sort.cpp - * \li + * \li * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp - * \li + * \li * Bottleneck_distance/bottleneck_basic_example.cpp - * \li + * \li * Bottleneck_distance/bottleneck_distance.cpp - * \li + * \li * Nerve_GIC/CoordGIC.cpp - * \li + * \li * Nerve_GIC/FuncGIC.cpp - * \li + * \li * Nerve_GIC/Nerve.cpp - * \li + * \li * Nerve_GIC/VoronoiGIC.cpp - * \li + * \li * Spatial_searching/example_spatial_searching.cpp - * \li + * \li * Subsampling/example_choose_n_farthest_points.cpp - * \li + * \li * Subsampling/example_pick_n_random_points.cpp - * \li + * \li * Subsampling/example_sparsify_point_set.cpp - * \li + * \li * Tangential_complex/example_basic.cpp - * \li + * \li * Tangential_complex/example_with_perturb.cpp - * \li + * \li * Alpha_complex/Weighted_alpha_complex_3d_from_points.cpp - * \li + * \li * Alpha_complex/alpha_complex_3d_persistence.cpp * * \subsection eigen Eigen @@ -133,41 +130,41 @@ make doxygen * * The following examples/utilities require the Eigen and will not be * built if Eigen is not installed: - * \li + * \li * Alpha_complex/Alpha_complex_from_off.cpp - * \li + * \li * Alpha_complex/Alpha_complex_from_points.cpp - * \li + * \li * Alpha_complex/alpha_complex_persistence.cpp - * \li + * \li * Alpha_complex/alpha_complex_3d_persistence.cpp - * \li + * \li * Alpha_complex/Weighted_alpha_complex_3d_from_points.cpp - * \li + * \li * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp - * \li + * \li * Persistent_cohomology/custom_persistence_sort.cpp - * \li + * \li * Spatial_searching/example_spatial_searching.cpp - * \li + * \li * Subsampling/example_choose_n_farthest_points.cpp - * \li + * \li * Subsampling/example_pick_n_random_points.cpp - * \li + * \li * Subsampling/example_sparsify_point_set.cpp - * \li + * \li * Tangential_complex/example_basic.cpp - * \li + * \li * Tangential_complex/example_with_perturb.cpp - * \li + * \li * Witness_complex/strong_witness_persistence.cpp - * \li + * \li * Witness_complex/weak_witness_persistence.cpp - * \li + * \li * Witness_complex/example_strong_witness_complex_off.cpp - * \li + * \li * Witness_complex/example_witness_complex_off.cpp - * \li + * \li * Witness_complex/example_witness_complex_sphere.cpp * * \subsection tbb Threading Building Blocks @@ -178,67 +175,67 @@ make doxygen * Having Intel® TBB installed is recommended to parallelize and accelerate some GUDHI computations. * * The following examples/utilities are using Intel® TBB if installed: - * \li + * \li * Alpha_complex/Alpha_complex_from_off.cpp - * \li + * \li * Alpha_complex/Alpha_complex_from_points.cpp - * \li + * \li * Alpha_complex/alpha_complex_3d_persistence.cpp - * \li + * \li * Alpha_complex/alpha_complex_persistence.cpp - * \li + * \li * Bitmap_cubical_complex/cubical_complex_persistence.cpp - * \li + * \li * Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp - * \li + * \li * Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp - * \li + * \li * Nerve_GIC/CoordGIC.cpp - * \li + * \li * Nerve_GIC/FuncGIC.cpp - * \li + * \li * Nerve_GIC/Nerve.cpp - * \li + * \li * Nerve_GIC/VoronoiGIC.cpp - * \li + * \li * Simplex_tree/simple_simplex_tree.cpp - * \li + * \li * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp - * \li + * \li * Simplex_tree/simplex_tree_from_cliques_of_graph.cpp - * \li + * \li * Simplex_tree/graph_expansion_with_blocker.cpp - * \li + * \li * Persistent_cohomology/alpha_complex_3d_persistence.cpp - * \li + * \li * Persistent_cohomology/alpha_complex_persistence.cpp - * \li + * \li * Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp - * \li + * \li * Persistent_cohomology/persistence_from_file.cpp - * \li + * \li * Persistent_cohomology/persistence_from_simple_simplex_tree.cpp - * \li + * \li * Persistent_cohomology/plain_homology.cpp - * \li + * \li * Persistent_cohomology/rips_multifield_persistence.cpp - * \li + * \li * Persistent_cohomology/rips_persistence_step_by_step.cpp - * \li + * \li * Persistent_cohomology/custom_persistence_sort.cpp - * \li + * \li * Rips_complex/example_one_skeleton_rips_from_points.cpp - * \li + * \li * Rips_complex/example_rips_complex_from_off_file.cpp - * \li + * \li * Rips_complex/rips_distance_matrix_persistence.cpp - * \li + * \li * Rips_complex/rips_persistence.cpp - * \li + * \li * Witness_complex/strong_witness_persistence.cpp - * \li + * \li * Witness_complex/weak_witness_persistence.cpp - * \li + * \li * Witness_complex/example_nearest_landmark_table.cpp * * \section Contributions Bug reports and contributions diff --git a/src/common/include/gudhi/Points_3D_off_io.h b/src/common/include/gudhi/Points_3D_off_io.h index 39b79c96..4f74fd4b 100644 --- a/src/common/include/gudhi/Points_3D_off_io.h +++ b/src/common/include/gudhi/Points_3D_off_io.h @@ -125,7 +125,7 @@ class Points_3D_off_visitor_reader { * This example loads points from an OFF file and builds a vector of CGAL points in dimension 3. * Then, it is asked to display the points. * - * @include common/example_CGAL_3D_points_off_reader.cpp + * @include example_CGAL_3D_points_off_reader.cpp * * When launching: * @@ -134,7 +134,7 @@ class Points_3D_off_visitor_reader { * * the program output is: * - * @include common/cgal3Doffreader_result.txt + * @include cgal3Doffreader_result.txt */ template class Points_3D_off_reader { diff --git a/src/common/include/gudhi/Points_off_io.h b/src/common/include/gudhi/Points_off_io.h index 9dc40568..3aa8afd8 100644 --- a/src/common/include/gudhi/Points_off_io.h +++ b/src/common/include/gudhi/Points_off_io.h @@ -107,7 +107,7 @@ class Points_off_visitor_reader { * This example loads points from an OFF file and builds a vector of points (vector of double). * Then, it is asked to display the points. * - * \include common/example_vector_double_points_off_reader.cpp + * \include example_vector_double_points_off_reader.cpp * * When launching: * @@ -116,7 +116,7 @@ class Points_off_visitor_reader { * * the program outputs a file ../../data/points/alphacomplexdoc.off.txt: * - * \include common/vectordoubleoffreader_result.txt + * \include vectordoubleoffreader_result.txt */ template class Points_off_reader { -- cgit v1.2.3 From c5a12380e0744eaa26b59ae043dd4fa160d9f268 Mon Sep 17 00:00:00 2001 From: VincentRouvreau Date: Mon, 13 Sep 2021 16:34:23 +0200 Subject: make_filtration_non_decreasing no more called in alpha complex dD exact version and exact and safe 3d versions --- src/Alpha_complex/doc/Intro_alpha_complex.h | 2 ++ src/Alpha_complex/include/gudhi/Alpha_complex.h | 6 ++++-- src/Alpha_complex/include/gudhi/Alpha_complex_3d.h | 6 ++++-- src/python/doc/alpha_complex_user.rst | 3 +++ 4 files changed, 13 insertions(+), 4 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index f417ebb2..5ab23720 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -152,6 +152,8 @@ Table of Contents * not quite define a proper filtration (i.e. non-decreasing with respect to inclusion). * We fix that up by calling `SimplicialComplexForAlpha::make_filtration_non_decreasing()`. * + * \note This is not the case in `exact` version, this is the reason why it is not called in this case. + * * \subsubsection pruneabove Prune above given filtration value * * The simplex tree is pruned from the given maximum \f$ \alpha^2 \f$ value (cf. diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index b315fa99..e03bb161 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -435,8 +435,10 @@ class Alpha_complex { // -------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------- - // As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension - complex.make_filtration_non_decreasing(); + if (!exact) + // As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension + // Only in not exact version, cf. https://github.com/GUDHI/gudhi-devel/issues/57 + complex.make_filtration_non_decreasing(); // Remove all simplices that have a filtration value greater than max_alpha_square complex.prune_above_filtration(max_alpha_square); // -------------------------------------------------------------------------------------------- diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h index 4e5fc933..ccc3d852 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h @@ -554,8 +554,10 @@ Weighted_alpha_complex_3d::Weighted_point_3 wp0(Weighted_alpha_complex_3d::Bare_ std::clog << "cells \t\t" << count_cells << std::endl; #endif // DEBUG_TRACES // -------------------------------------------------------------------------------------------- - // As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension - complex.make_filtration_non_decreasing(); + if (Complexity == complexity::FAST) + // As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension + // Only in FAST version, cf. https://github.com/GUDHI/gudhi-devel/issues/57 + complex.make_filtration_non_decreasing(); // Remove all simplices that have a filtration value greater than max_alpha_square complex.prune_above_filtration(max_alpha_square); // -------------------------------------------------------------------------------------------- diff --git a/src/python/doc/alpha_complex_user.rst b/src/python/doc/alpha_complex_user.rst index fffcb3db..ef67a457 100644 --- a/src/python/doc/alpha_complex_user.rst +++ b/src/python/doc/alpha_complex_user.rst @@ -165,6 +165,9 @@ respect to inclusion). We fix that up by calling :func:`~gudhi.SimplexTree.make_filtration_non_decreasing` (cf. `C++ version `_). +.. note:: + This is not the case in `exact` version, this is the reason why it is not called in this case. + Prune above given filtration value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- cgit v1.2.3 From e88833431fbdd2b58b00fe3d3cf84973700477b3 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Wed, 26 Jan 2022 09:49:20 +0100 Subject: Code review: Remove empty_point_set_ that can be deduced from num_vertices (new method in Alpha_complex -> Abstract_alpha_complex -> In/Exact_alpha_complex_dD -> Alpha_complex_interface --- src/Alpha_complex/include/gudhi/Alpha_complex.h | 12 +++++++++++- src/Alpha_complex/test/Alpha_complex_unit_test.cpp | 15 +++++++++++++++ src/python/include/Alpha_complex_factory.h | 10 ++++++++++ src/python/include/Alpha_complex_interface.h | 6 ++---- 4 files changed, 38 insertions(+), 5 deletions(-) (limited to 'src/Alpha_complex') diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h index e03bb161..028ec9bb 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h @@ -20,6 +20,7 @@ #include #include // isnan, fmax #include // for std::unique_ptr +#include // for std::size_t #include #include // aka. Weighted Delaunay triangulation @@ -213,6 +214,15 @@ class Alpha_complex { Alpha_complex (Alpha_complex&& other) = delete; Alpha_complex& operator= (Alpha_complex&& other) = delete; + /** \brief Returns the number of finite vertices in the triangulation. + */ + std::size_t num_vertices() const { + if (triangulation_ == nullptr) + return 0; + else + return triangulation_->number_of_vertices(); + } + /** \brief get_point returns the point corresponding to the vertex given as parameter. * * @param[in] vertex Vertex handle of the point to retrieve. @@ -373,7 +383,7 @@ class Alpha_complex { // -------------------------------------------------------------------------------------------- // Simplex_tree construction from loop on triangulation finite full cells list - if (triangulation_->number_of_vertices() > 0) { + if (num_vertices() > 0) { for (auto cit = triangulation_->finite_full_cells_begin(); cit != triangulation_->finite_full_cells_end(); ++cit) { diff --git a/src/Alpha_complex/test/Alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp index 4b37e4bd..f74ad217 100644 --- a/src/Alpha_complex/test/Alpha_complex_unit_test.cpp +++ b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp @@ -56,6 +56,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_complex_from_OFF_file, TestedKernel, list_of Gudhi::Simplex_tree<> simplex_tree_60; BOOST_CHECK(alpha_complex_from_file.create_complex(simplex_tree_60, max_alpha_square_value)); + std::clog << "alpha_complex_from_file.num_vertices()=" << alpha_complex_from_file.num_vertices() << std::endl; + BOOST_CHECK(alpha_complex_from_file.num_vertices() == 7); + std::clog << "simplex_tree_60.dimension()=" << simplex_tree_60.dimension() << std::endl; BOOST_CHECK(simplex_tree_60.dimension() == 2); @@ -72,6 +75,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_complex_from_OFF_file, TestedKernel, list_of Gudhi::Simplex_tree<> simplex_tree_59; BOOST_CHECK(alpha_complex_from_file.create_complex(simplex_tree_59, max_alpha_square_value)); + std::clog << "alpha_complex_from_file.num_vertices()=" << alpha_complex_from_file.num_vertices() << std::endl; + BOOST_CHECK(alpha_complex_from_file.num_vertices() == 7); + std::clog << "simplex_tree_59.dimension()=" << simplex_tree_59.dimension() << std::endl; BOOST_CHECK(simplex_tree_59.dimension() == 2); @@ -120,6 +126,9 @@ BOOST_AUTO_TEST_CASE(Alpha_complex_from_points) { Gudhi::Simplex_tree<> simplex_tree; BOOST_CHECK(alpha_complex_from_points.create_complex(simplex_tree)); + std::clog << "alpha_complex_from_points.num_vertices()=" << alpha_complex_from_points.num_vertices() << std::endl; + BOOST_CHECK(alpha_complex_from_points.num_vertices() == points.size()); + // Another way to check num_simplices std::clog << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl; int num_simplices = 0; @@ -240,6 +249,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_complex_from_empty_points, TestedKernel, lis // ---------------------------------------------------------------------------- Gudhi::alpha_complex::Alpha_complex alpha_complex_from_points(points); + std::clog << "alpha_complex_from_points.num_vertices()=" << alpha_complex_from_points.num_vertices() << std::endl; + BOOST_CHECK(alpha_complex_from_points.num_vertices() == points.size()); + // Test to the limit BOOST_CHECK_THROW (alpha_complex_from_points.get_point(0), std::out_of_range); @@ -291,6 +303,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Alpha_complex_with_duplicated_points, TestedKernel std::clog << "create_complex" << std::endl; BOOST_CHECK(alpha_complex_from_points.create_complex(simplex_tree)); + std::clog << "alpha_complex_from_points.num_vertices()=" << alpha_complex_from_points.num_vertices() << std::endl; + BOOST_CHECK(alpha_complex_from_points.num_vertices() < points.size()); + std::clog << "simplex_tree.num_vertices()=" << simplex_tree.num_vertices() << std::endl; BOOST_CHECK(simplex_tree.num_vertices() < points.size()); diff --git a/src/python/include/Alpha_complex_factory.h b/src/python/include/Alpha_complex_factory.h index 14ec1f86..3d20aa8f 100644 --- a/src/python/include/Alpha_complex_factory.h +++ b/src/python/include/Alpha_complex_factory.h @@ -70,6 +70,8 @@ class Abstract_alpha_complex { virtual bool create_simplex_tree(Simplex_tree_interface<>* simplex_tree, double max_alpha_square, bool default_filtration_value) = 0; + + virtual std::size_t num_vertices() const = 0; virtual ~Abstract_alpha_complex() = default; }; @@ -104,6 +106,10 @@ class Exact_alpha_complex_dD final : public Abstract_alpha_complex { return alpha_complex_.create_complex(*simplex_tree, max_alpha_square, exact_version_, default_filtration_value); } + virtual std::size_t num_vertices() const { + return alpha_complex_.num_vertices(); + } + private: bool exact_version_; Alpha_complex alpha_complex_; @@ -135,6 +141,10 @@ class Inexact_alpha_complex_dD final : public Abstract_alpha_complex { return alpha_complex_.create_complex(*simplex_tree, max_alpha_square, false, default_filtration_value); } + virtual std::size_t num_vertices() const { + return alpha_complex_.num_vertices(); + } + private: Alpha_complex alpha_complex_; }; diff --git a/src/python/include/Alpha_complex_interface.h b/src/python/include/Alpha_complex_interface.h index 188036ed..671af4a4 100644 --- a/src/python/include/Alpha_complex_interface.h +++ b/src/python/include/Alpha_complex_interface.h @@ -29,8 +29,7 @@ class Alpha_complex_interface { public: Alpha_complex_interface(const std::vector>& points, const std::vector& weights, - bool fast_version, bool exact_version) - : empty_point_set_(points.size() == 0) { + bool fast_version, bool exact_version) { const bool weighted = (weights.size() > 0); if (fast_version) { if (weighted) { @@ -54,13 +53,12 @@ class Alpha_complex_interface { void create_simplex_tree(Simplex_tree_interface<>* simplex_tree, double max_alpha_square, bool default_filtration_value) { // Nothing to be done in case of an empty point set - if (!empty_point_set_) + if (alpha_ptr_->num_vertices() > 0) alpha_ptr_->create_simplex_tree(simplex_tree, max_alpha_square, default_filtration_value); } private: std::unique_ptr alpha_ptr_; - bool empty_point_set_; }; } // namespace alpha_complex -- cgit v1.2.3 From 4fc331267735a3368160ea7cd001b7fa45d720f7 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Thu, 10 Feb 2022 10:32:18 +0100 Subject: Boost 1.66.0 is now the minimal version as required from cgal 5.1 - Also remove useless include boost/version.h --- .github/next_release.md | 3 +++ src/Alpha_complex/include/gudhi/Alpha_complex_3d.h | 1 - src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h | 1 - src/Subsampling/include/gudhi/sparsify_point_set.h | 5 ----- src/cmake/modules/GUDHI_third_party_libraries.cmake | 2 +- src/common/doc/installation.h | 2 +- src/common/include/gudhi/reader_utils.h | 4 ---- src/python/doc/installation.rst | 2 +- 8 files changed, 6 insertions(+), 14 deletions(-) (limited to 'src/Alpha_complex') diff --git a/.github/next_release.md b/.github/next_release.md index 65a92816..e21b25c7 100644 --- a/.github/next_release.md +++ b/.github/next_release.md @@ -13,6 +13,9 @@ Below is a list of changes made since GUDHI 3.5.0: - [Representations](https://gudhi.inria.fr/python/latest/representations.html#gudhi.representations.vector_methods.BettiCurve) - A more flexible Betti curve class capable of computing exact curves +- Installation + - Boost ≥ 1.66.0 is now required (was ≥ 1.56.0). + - [Module](link) - ... diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h index ccc3d852..df5c630e 100644 --- a/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h +++ b/src/Alpha_complex/include/gudhi/Alpha_complex_3d.h @@ -12,7 +12,6 @@ #ifndef ALPHA_COMPLEX_3D_H_ #define ALPHA_COMPLEX_3D_H_ -#include #include #include #include diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h index ee64a277..e5522cc7 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h @@ -14,7 +14,6 @@ #include #include -#include #include #include diff --git a/src/Subsampling/include/gudhi/sparsify_point_set.h b/src/Subsampling/include/gudhi/sparsify_point_set.h index 4571b8f3..b325fe3c 100644 --- a/src/Subsampling/include/gudhi/sparsify_point_set.h +++ b/src/Subsampling/include/gudhi/sparsify_point_set.h @@ -11,12 +11,7 @@ #ifndef SPARSIFY_POINT_SET_H_ #define SPARSIFY_POINT_SET_H_ -#include -#if BOOST_VERSION < 106600 -# include -#else # include -#endif #include #ifdef GUDHI_SUBSAMPLING_PROFILING diff --git a/src/cmake/modules/GUDHI_third_party_libraries.cmake b/src/cmake/modules/GUDHI_third_party_libraries.cmake index b316740d..68ffaee1 100644 --- a/src/cmake/modules/GUDHI_third_party_libraries.cmake +++ b/src/cmake/modules/GUDHI_third_party_libraries.cmake @@ -1,6 +1,6 @@ # This files manage third party libraries required by GUDHI -find_package(Boost 1.56.0 QUIET OPTIONAL_COMPONENTS filesystem unit_test_framework program_options) +find_package(Boost 1.66.0 QUIET OPTIONAL_COMPONENTS filesystem unit_test_framework program_options) # Boost_FOUND is not reliable if(NOT Boost_VERSION) diff --git a/src/common/doc/installation.h b/src/common/doc/installation.h index ef668dfb..67d026bd 100644 --- a/src/common/doc/installation.h +++ b/src/common/doc/installation.h @@ -5,7 +5,7 @@ * Examples of GUDHI headers inclusion can be found in \ref utilities. * * \section compiling Compiling - * The library uses c++14 and requires Boost ≥ 1.56.0 + * The library uses c++14 and requires Boost ≥ 1.66.0 * and CMake ≥ 3.5. * It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015. * diff --git a/src/common/include/gudhi/reader_utils.h b/src/common/include/gudhi/reader_utils.h index a1b104e2..29d5423d 100644 --- a/src/common/include/gudhi/reader_utils.h +++ b/src/common/include/gudhi/reader_utils.h @@ -14,11 +14,7 @@ #include #include -#if BOOST_VERSION < 106600 -# include -#else # include -#endif #include #include diff --git a/src/python/doc/installation.rst b/src/python/doc/installation.rst index 35c344e3..c2c3db34 100644 --- a/src/python/doc/installation.rst +++ b/src/python/doc/installation.rst @@ -39,7 +39,7 @@ If you are instead using a git checkout, beware that the paths are a bit different, and in particular the `python/` subdirectory is actually `src/python/` there. -The library uses c++14 and requires `Boost `_ :math:`\geq` 1.56.0, +The library uses c++14 and requires `Boost `_ :math:`\geq` 1.66.0, `CMake `_ :math:`\geq` 3.5 to generate makefiles, `NumPy `_ :math:`\geq` 1.15.0, `Cython `_ and `pybind11 `_ to compile -- cgit v1.2.3