-- cgit v1.2.3 From a0116bde72e9becc10a14b171089fe15a3d53c06 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 14 Feb 2018 08:51:08 +0000 Subject: Fix copyright issues for Simplex tree git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3248 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: d13758f0059174863de260efac88b32aef256753 --- .../example/cech_complex_cgal_mini_sphere_3d.cpp | 4 +- ...e_alpha_shapes_3_simplex_tree_from_off_file.cpp | 2 +- .../example/graph_expansion_with_blocker.cpp | 46 +++++++++++----------- src/Simplex_tree/example/mini_simplex_tree.cpp | 2 +- src/Simplex_tree/example/simple_simplex_tree.cpp | 2 +- .../example/simplex_tree_from_cliques_of_graph.cpp | 2 +- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/Simplex_tree/example/cech_complex_cgal_mini_sphere_3d.cpp b/src/Simplex_tree/example/cech_complex_cgal_mini_sphere_3d.cpp index 9bd51106..08ed74bb 100644 --- a/src/Simplex_tree/example/cech_complex_cgal_mini_sphere_3d.cpp +++ b/src/Simplex_tree/example/cech_complex_cgal_mini_sphere_3d.cpp @@ -2,9 +2,9 @@ * (Geometric Understanding in Higher Dimensions) is a generic C++ * library for computational topology. * - * Author(s): Clément Maria + * Author(s): Vincent Rouvreau * - * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France) + * Copyright (C) 2017 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/Simplex_tree/example/example_alpha_shapes_3_simplex_tree_from_off_file.cpp b/src/Simplex_tree/example/example_alpha_shapes_3_simplex_tree_from_off_file.cpp index d8289ba9..7f0fcf48 100644 --- a/src/Simplex_tree/example/example_alpha_shapes_3_simplex_tree_from_off_file.cpp +++ b/src/Simplex_tree/example/example_alpha_shapes_3_simplex_tree_from_off_file.cpp @@ -4,7 +4,7 @@ * * Author(s): Vincent Rouvreau * - * Copyright (C) 2014 INRIA Saclay (France) + * Copyright (C) 2014 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/Simplex_tree/example/graph_expansion_with_blocker.cpp b/src/Simplex_tree/example/graph_expansion_with_blocker.cpp index 0d458cbd..f5ee5ee5 100644 --- a/src/Simplex_tree/example/graph_expansion_with_blocker.cpp +++ b/src/Simplex_tree/example/graph_expansion_with_blocker.cpp @@ -4,7 +4,7 @@ * * Author(s): Vincent Rouvreau * - * Copyright (C) 2014 + * Copyright (C) 2017 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,33 +29,33 @@ using Simplex_handle = Simplex_tree::Simplex_handle; int main(int argc, char* const argv[]) { // Construct the Simplex Tree with a 1-skeleton graph example - Simplex_tree simplexTree; + Simplex_tree stree; - simplexTree.insert_simplex({0, 1}, 0.); - simplexTree.insert_simplex({0, 2}, 1.); - simplexTree.insert_simplex({0, 3}, 2.); - simplexTree.insert_simplex({1, 2}, 3.); - simplexTree.insert_simplex({1, 3}, 4.); - simplexTree.insert_simplex({2, 3}, 5.); - simplexTree.insert_simplex({2, 4}, 6.); - simplexTree.insert_simplex({3, 6}, 7.); - simplexTree.insert_simplex({4, 5}, 8.); - simplexTree.insert_simplex({4, 6}, 9.); - simplexTree.insert_simplex({5, 6}, 10.); - simplexTree.insert_simplex({6}, 10.); + stree.insert_simplex({0, 1}, 0.); + stree.insert_simplex({0, 2}, 1.); + stree.insert_simplex({0, 3}, 2.); + stree.insert_simplex({1, 2}, 3.); + stree.insert_simplex({1, 3}, 4.); + stree.insert_simplex({2, 3}, 5.); + stree.insert_simplex({2, 4}, 6.); + stree.insert_simplex({3, 6}, 7.); + stree.insert_simplex({4, 5}, 8.); + stree.insert_simplex({4, 6}, 9.); + stree.insert_simplex({5, 6}, 10.); + stree.insert_simplex({6}, 10.); - simplexTree.expansion_with_blockers(3, [&](Simplex_handle sh) { + stree.expansion_with_blockers(3, [&](Simplex_handle sh) { bool result = false; std::cout << "Blocker on ["; // User can loop on the vertices from the given simplex_handle i.e. - for (auto vertex : simplexTree.simplex_vertex_range(sh)) { + for (auto vertex : stree.simplex_vertex_range(sh)) { // We block the expansion, if the vertex '6' is in the given list of vertices if (vertex == 6) result = true; std::cout << vertex << ", "; } - std::cout << "] ( " << simplexTree.filtration(sh); + std::cout << "] ( " << stree.filtration(sh); // User can re-assign a new filtration value directly in the blocker (default is the maximal value of boudaries) - simplexTree.assign_filtration(sh, simplexTree.filtration(sh) + 1.); + stree.assign_filtration(sh, stree.filtration(sh) + 1.); std::cout << " + 1. ) = " << result << std::endl; @@ -63,13 +63,13 @@ int main(int argc, char* const argv[]) { }); std::cout << "********************************************************************\n"; - std::cout << "* The complex contains " << simplexTree.num_simplices() << " simplices"; - std::cout << " - dimension " << simplexTree.dimension() << "\n"; + std::cout << "* The complex contains " << stree.num_simplices() << " simplices"; + std::cout << " - dimension " << stree.dimension() << "\n"; std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n"; - for (auto f_simplex : simplexTree.filtration_simplex_range()) { + for (auto f_simplex : stree.filtration_simplex_range()) { std::cout << " " - << "[" << simplexTree.filtration(f_simplex) << "] "; - for (auto vertex : simplexTree.simplex_vertex_range(f_simplex)) std::cout << "(" << vertex << ")"; + << "[" << stree.filtration(f_simplex) << "] "; + for (auto vertex : stree.simplex_vertex_range(f_simplex)) std::cout << "(" << vertex << ")"; std::cout << std::endl; } diff --git a/src/Simplex_tree/example/mini_simplex_tree.cpp b/src/Simplex_tree/example/mini_simplex_tree.cpp index 19e45361..bffd4fa3 100644 --- a/src/Simplex_tree/example/mini_simplex_tree.cpp +++ b/src/Simplex_tree/example/mini_simplex_tree.cpp @@ -4,7 +4,7 @@ * * Author(s): Marc Glisse * - * Copyright (C) 2015 INRIA Saclay - Ile-de-France (France) + * Copyright (C) 2015 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/Simplex_tree/example/simple_simplex_tree.cpp b/src/Simplex_tree/example/simple_simplex_tree.cpp index 828977c2..d71b5608 100644 --- a/src/Simplex_tree/example/simple_simplex_tree.cpp +++ b/src/Simplex_tree/example/simple_simplex_tree.cpp @@ -4,7 +4,7 @@ * * Author(s): Vincent Rouvreau * - * Copyright (C) 2014 + * Copyright (C) 2014 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp b/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp index d1b8b2de..0ad7e6a2 100644 --- a/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp +++ b/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp @@ -4,7 +4,7 @@ * * Author(s): Clément Maria * - * Copyright (C) 2014 INRIA + * Copyright (C) 2014 Inria * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by -- cgit v1.2.3 From 56618be4e28a6a149aaa0fef944d8fde719f7844 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 16 Feb 2018 08:04:07 +0000 Subject: Add Cech complex. Do not compile yet. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3250 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: bef87ed8038444685b964175ea65860300917380 --- CMakeLists.txt | 1 + src/CMakeLists.txt | 1 + src/Cech_complex/doc/Intro_cech_complex.h | 0 src/Cech_complex/example/CMakeLists.txt | 14 + .../example/cech_complex_step_by_step.cpp | 179 +++++++ .../example_one_skeleton_cech_from_points.cpp | 74 +++ .../include/Miniball/Miniball.COPYRIGHT | 4 + src/Cech_complex/include/Miniball/Miniball.README | 23 + src/Cech_complex/include/Miniball/Miniball.hpp | 515 +++++++++++++++++++++ src/Cech_complex/include/gudhi/Cech_complex.h | 126 +++++ .../include/gudhi/Cech_complex_blocker.h | 85 ++++ src/cmake/modules/GUDHI_user_version_target.cmake | 4 +- 12 files changed, 1024 insertions(+), 2 deletions(-) create mode 100644 src/Cech_complex/doc/Intro_cech_complex.h create mode 100644 src/Cech_complex/example/CMakeLists.txt create mode 100644 src/Cech_complex/example/cech_complex_step_by_step.cpp create mode 100644 src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp create mode 100644 src/Cech_complex/include/Miniball/Miniball.COPYRIGHT create mode 100644 src/Cech_complex/include/Miniball/Miniball.README create mode 100644 src/Cech_complex/include/Miniball/Miniball.hpp create mode 100644 src/Cech_complex/include/gudhi/Cech_complex.h create mode 100644 src/Cech_complex/include/gudhi/Cech_complex_blocker.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 10373f75..3d8ff6c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ add_gudhi_module(Alpha_complex) add_gudhi_module(Bitmap_cubical_complex) add_gudhi_module(Bottleneck_distance) add_gudhi_module(Contraction) +add_gudhi_module(Cech_complex) add_gudhi_module(Hasse_complex) add_gudhi_module(Persistence_representations) add_gudhi_module(Persistent_cohomology) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 94587044..7cccb19f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,6 +14,7 @@ add_gudhi_module(common) add_gudhi_module(Alpha_complex) add_gudhi_module(Bitmap_cubical_complex) add_gudhi_module(Bottleneck_distance) +add_gudhi_module(Cech_complex) add_gudhi_module(Contraction) add_gudhi_module(Hasse_complex) add_gudhi_module(Persistence_representations) diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h new file mode 100644 index 00000000..e69de29b diff --git a/src/Cech_complex/example/CMakeLists.txt b/src/Cech_complex/example/CMakeLists.txt new file mode 100644 index 00000000..8097871f --- /dev/null +++ b/src/Cech_complex/example/CMakeLists.txt @@ -0,0 +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_LIBRARY}) +if (TBB_FOUND) + target_link_libraries(Cech_complex_example_step_by_step ${TBB_LIBRARIES}) +endif() + +add_executable ( Cech_complex_example_one_skeleton_from_points example_one_skeleton_cech_from_points.cpp) +if (TBB_FOUND) + target_link_libraries(Cech_complex_example_one_skeleton_from_points ${TBB_LIBRARIES}) +endif() +add_test(NAME Cech_complex_example_one_skeleton_from_points COMMAND $) diff --git a/src/Cech_complex/example/cech_complex_step_by_step.cpp b/src/Cech_complex/example/cech_complex_step_by_step.cpp new file mode 100644 index 00000000..e71086b6 --- /dev/null +++ b/src/Cech_complex/example/cech_complex_step_by_step.cpp @@ -0,0 +1,179 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include // infinity +#include // for pair +#include + +// ---------------------------------------------------------------------------- +// rips_persistence_step_by_step is an example of each step that is required to +// build a Rips over a Simplex_tree. Please refer to rips_persistence to see +// how to do the same thing with the Rips_complex wrapper for less detailed +// steps. +// ---------------------------------------------------------------------------- + +// Types definition +using Simplex_tree = Gudhi::Simplex_tree<>; +using Simplex_handle = Simplex_tree::Simplex_handle; +using Filtration_value = Simplex_tree::Filtration_value; +using Point = std::vector; +using Points_off_reader = Gudhi::Points_off_reader; +using Proximity_graph = Gudhi::Proximity_graph; + +class Cech_blocker { + private: + using Point_cloud = std::vector; + using Point_iterator = Point_cloud::const_iterator; + using Coordinate_iterator = Point::const_iterator; + using Min_sphere = Miniball::Miniball >; + public: + bool operator()(Simplex_handle sh) { + std::vector points; + for (auto vertex : simplex_tree_.simplex_vertex_range(sh)) { + points.push_back(point_cloud_[vertex]); +#ifdef DEBUG_TRACES + std::cout << "#(" << vertex << ")#"; +#endif // DEBUG_TRACES + } + Min_sphere ms(dimension_, points.begin(),points.end()); + Filtration_value radius = std::sqrt(ms.squared_radius()); +#ifdef DEBUG_TRACES + std::cout << "radius = " << radius << " - " << (radius > threshold_) << std::endl; +#endif // DEBUG_TRACES + simplex_tree_.assign_filtration(sh, radius); + return (radius > threshold_); + } + Cech_blocker(Simplex_tree& simplex_tree, Filtration_value threshold, const std::vector& point_cloud) + : simplex_tree_(simplex_tree), + threshold_(threshold), + point_cloud_(point_cloud) { + dimension_ = point_cloud_[0].size(); + } + private: + Simplex_tree simplex_tree_; + Filtration_value threshold_; + std::vector point_cloud_; + int dimension_; +}; + + +void program_options(int argc, char * argv[] + , std::string & off_file_points + , Filtration_value & threshold + , int & dim_max); + + +int main(int argc, char * argv[]) { + std::string off_file_points; + Filtration_value threshold; + int dim_max; + + program_options(argc, argv, off_file_points, threshold, dim_max); + + // Extract the points from the file filepoints + Points_off_reader off_reader(off_file_points); + + // Compute the proximity graph of the points + Proximity_graph prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Gudhi::Euclidean_distance()); + + // Construct the Rips complex in a Simplex Tree + Simplex_tree st; + // insert the proximity graph in the simplex tree + st.insert_graph(prox_graph); + // expand the graph until dimension dim_max + st.expansion_with_blockers(dim_max, Cech_blocker(st, threshold, off_reader.get_point_cloud())); + + std::cout << "The complex contains " << st.num_simplices() << " simplices \n"; + std::cout << " and has dimension " << st.dimension() << " \n"; + + // Sort the simplices in the order of the filtration + st.initialize_filtration(); + +#if DEBUG_TRACES + std::cout << "********************************************************************\n"; + // Display the Simplex_tree - Can not be done in the middle of 2 inserts + std::cout << "* The complex contains " << st.num_simplices() << " simplices - dimension=" << st.dimension() << "\n"; + std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n"; + for (auto f_simplex : st.filtration_simplex_range()) { + std::cout << " " << "[" << st.filtration(f_simplex) << "] "; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::cout << static_cast(vertex) << " "; + } + std::cout << std::endl; + } +#endif // DEBUG_TRACES + + return 0; +} + +void program_options(int argc, char * argv[] + , std::string & off_file_points + , Filtration_value & threshold + , int & dim_max) { + namespace po = boost::program_options; + po::options_description hidden("Hidden options"); + hidden.add_options() + ("input-file", po::value(&off_file_points), + "Name of an OFF file containing a point set.\n"); + + po::options_description visible("Allowed options", 100); + visible.add_options() + ("help,h", "produce help message") + ("max-edge-length,r", + po::value(&threshold)->default_value(std::numeric_limits::infinity()), + "Maximal length of an edge for the Rips complex construction.") + ("cpx-dimension,d", po::value(&dim_max)->default_value(1), + "Maximal dimension of the Rips complex we want to compute."); + + po::positional_options_description pos; + pos.add("input-file", 1); + + po::options_description all; + all.add(visible).add(hidden); + + po::variables_map vm; + po::store(po::command_line_parser(argc, argv). + options(all).positional(pos).run(), vm); + po::notify(vm); + + if (vm.count("help") || !vm.count("input-file")) { + std::cout << std::endl; + std::cout << "Construct a Cech complex defined on a set of input points.\n \n"; + + std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl; + std::cout << visible << std::endl; + std::abort(); + } +} diff --git a/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp b/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp new file mode 100644 index 00000000..9b03616c --- /dev/null +++ b/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp @@ -0,0 +1,74 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +#include +#include +#include +#include // for std::numeric_limits + +int main() { + // Type definitions + using Point_cloud = std::vector>; + using Simplex_tree = Gudhi::Simplex_tree; + using Filtration_value = Simplex_tree::Filtration_value; + using Cech_complex = Gudhi::cech_complex::Cech_complex; + + Point_cloud points; + points.push_back({1.0, 1.0}); + points.push_back({7.0, 0.0}); + points.push_back({4.0, 6.0}); + points.push_back({9.0, 6.0}); + points.push_back({0.0, 14.0}); + points.push_back({2.0, 19.0}); + points.push_back({9.0, 17.0}); + + // ---------------------------------------------------------------------------- + // Init of a Rips complex from points + // ---------------------------------------------------------------------------- + Filtration_value threshold = 12.0; + Cech_complex cech_complex_from_points(points, threshold, Gudhi::Euclidean_distance()); + + Simplex_tree stree; + cech_complex_from_points.create_complex(stree, 2); + // ---------------------------------------------------------------------------- + // Display information about the one skeleton Rips complex + // ---------------------------------------------------------------------------- + std::cout << "Cech complex is of dimension " << stree.dimension() << + " - " << stree.num_simplices() << " simplices - " << + stree.num_vertices() << " vertices." << std::endl; + + std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << + std::endl; + for (auto f_simplex : stree.filtration_simplex_range()) { + std::cout << " ( "; + for (auto vertex : stree.simplex_vertex_range(f_simplex)) { + std::cout << vertex << " "; + } + std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] "; + std::cout << std::endl; + } + return 0; +} diff --git a/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT b/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT new file mode 100644 index 00000000..dbe4c553 --- /dev/null +++ b/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT @@ -0,0 +1,4 @@ +The miniball software is available under the GNU General Public License (GPLv3 - https://www.gnu.org/copyleft/gpl.html). +If your intended use is not compliant with this license, please buy a commercial license (EUR 500 - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/license.html). +You need a license if the software that you develop using Miniball V3.0 is not open source. + diff --git a/src/Cech_complex/include/Miniball/Miniball.README b/src/Cech_complex/include/Miniball/Miniball.README new file mode 100644 index 00000000..86a96f08 --- /dev/null +++ b/src/Cech_complex/include/Miniball/Miniball.README @@ -0,0 +1,23 @@ +https://people.inf.ethz.ch/gaertner/subdir/software/miniball.html + +Smallest Enclosing Balls of Points - Fast and Robust in C++. +(high-quality software for smallest enclosing balls of balls is available in the computational geometry algorithms library CGAL) + + +This is the miniball software (V3.0) for computing smallest enclosing balls of points in arbitrary dimensions. It consists of a C++ header file Miniball.hpp (around 500 lines of code) and two example programs miniball_example.cpp and miniball_example_containers.cpp that demonstrate the usage. The first example stores the coordinates of the input points in a two-dimensional array, the second example uses a list of vectors to show how generic containers can be used. + +Credits: Aditya Gupta and Alexandros Konstantinakis-Karmis have significantly contributed to this version of the software. + +Changes - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/changes.txt - from previous versions. + +The theory - https://people.inf.ethz.ch/gaertner/subdir/texts/own_work/esa99_final.pdf - behind the miniball software (Proc. 7th Annual European Symposium on Algorithms (ESA), Lecture Notes in Computer Science 1643, Springer-Verlag, pp.325-338, 1999). + +Main Features: + + Very fast in low dimensions. 1 million points in 5-space are processed within 0.05 seconds on any recent machine. + + High numerical stability. Almost all input degeneracies (cospherical points, multiple points, points very close together) are routinely handled. + + Easily integrates into your code. You can freely choose the coordinate type of your points and the container to store the points. If you still need to adapt the code, the header is small and readable and contains documentation for all major methods. + + diff --git a/src/Cech_complex/include/Miniball/Miniball.hpp b/src/Cech_complex/include/Miniball/Miniball.hpp new file mode 100644 index 00000000..cb76c534 --- /dev/null +++ b/src/Cech_complex/include/Miniball/Miniball.hpp @@ -0,0 +1,515 @@ +// Copright (C) 1999-2013, Bernd Gaertner +// $Rev: 3581 $ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// Contact: +// -------- +// Bernd Gaertner +// Institute of Theoretical Computer Science +// ETH Zuerich +// CAB G31.1 +// CH-8092 Zuerich, Switzerland +// http://www.inf.ethz.ch/personal/gaertner + +#include +#include +#include +#include +#include + +namespace Miniball { + + // Global Functions + // ================ + template + inline NT mb_sqr (NT r) {return r*r;} + + // Functors + // ======== + + // functor to map a point iterator to the corresponding coordinate iterator; + // generic version for points whose coordinate containers have begin() + template < typename Pit_, typename Cit_ > + struct CoordAccessor { + typedef Pit_ Pit; + typedef Cit_ Cit; + inline Cit operator() (Pit it) const { return (*it).begin(); } + }; + + // partial specialization for points whose coordinate containers are arrays + template < typename Pit_, typename Cit_ > + struct CoordAccessor { + typedef Pit_ Pit; + typedef Cit_* Cit; + inline Cit operator() (Pit it) const { return *it; } + }; + + // Class Declaration + // ================= + + template + class Miniball { + private: + // types + // The iterator type to go through the input points + typedef typename CoordAccessor::Pit Pit; + // The iterator type to go through the coordinates of a single point. + typedef typename CoordAccessor::Cit Cit; + // The coordinate type + typedef typename std::iterator_traits::value_type NT; + // The iterator to go through the support points + typedef typename std::list::iterator Sit; + + // data members... + const int d; // dimension + Pit points_begin; + Pit points_end; + CoordAccessor coord_accessor; + double time; + const NT nt0; // NT(0) + + //...for the algorithms + std::list L; + Sit support_end; + int fsize; // number of forced points + int ssize; // number of support points + + // ...for the ball updates + NT* current_c; + NT current_sqr_r; + NT** c; + NT* sqr_r; + + // helper arrays + NT* q0; + NT* z; + NT* f; + NT** v; + NT** a; + + public: + // The iterator type to go through the support points + typedef typename std::list::const_iterator SupportPointIterator; + + // PRE: [begin, end) is a nonempty range + // POST: computes the smallest enclosing ball of the points in the range + // [begin, end); the functor a maps a point iterator to an iterator + // through the d coordinates of the point + Miniball (int d_, Pit begin, Pit end, CoordAccessor ca = CoordAccessor()); + + // POST: returns a pointer to the first element of an array that holds + // the d coordinates of the center of the computed ball + const NT* center () const; + + // POST: returns the squared radius of the computed ball + NT squared_radius () const; + + // POST: returns the number of support points of the computed ball; + // the support points form a minimal set with the same smallest + // enclosing ball as the input set; in particular, the support + // points are on the boundary of the computed ball, and their + // number is at most d+1 + int nr_support_points () const; + + // POST: returns an iterator to the first support point + SupportPointIterator support_points_begin () const; + + // POST: returns a past-the-end iterator for the range of support points + SupportPointIterator support_points_end () const; + + // POST: returns the maximum excess of any input point w.r.t. the computed + // ball, divided by the squared radius of the computed ball. The + // excess of a point is the difference between its squared distance + // from the center and the squared radius; Ideally, the return value + // is 0. subopt is set to the absolute value of the most negative + // coefficient in the affine combination of the support points that + // yields the center. Ideally, this is a convex combination, and there + // is no negative coefficient in which case subopt is set to 0. + NT relative_error (NT& subopt) const; + + // POST: return true if the relative error is at most tol, and the + // suboptimality is 0; the default tolerance is 10 times the + // coordinate type's machine epsilon + bool is_valid (NT tol = NT(10) * std::numeric_limits::epsilon()) const; + + // POST: returns the time in seconds taken by the constructor call for + // computing the smallest enclosing ball + double get_time() const; + + // POST: deletes dynamically allocated arrays + ~Miniball(); + + private: + void mtf_mb (Sit n); + void mtf_move_to_front (Sit j); + void pivot_mb (Pit n); + void pivot_move_to_front (Pit j); + NT excess (Pit pit) const; + void pop (); + bool push (Pit pit); + NT suboptimality () const; + void create_arrays(); + void delete_arrays(); + }; + + // Class Definition + // ================ + template + Miniball::Miniball (int d_, Pit begin, Pit end, + CoordAccessor ca) + : d (d_), + points_begin (begin), + points_end (end), + coord_accessor (ca), + time (clock()), + nt0 (NT(0)), + L(), + support_end (L.begin()), + fsize(0), + ssize(0), + current_c (NULL), + current_sqr_r (NT(-1)), + c (NULL), + sqr_r (NULL), + q0 (NULL), + z (NULL), + f (NULL), + v (NULL), + a (NULL) + { + assert (points_begin != points_end); + create_arrays(); + + // set initial center + for (int j=0; j + Miniball::~Miniball() + { + delete_arrays(); + } + + template + void Miniball::create_arrays() + { + c = new NT*[d+1]; + v = new NT*[d+1]; + a = new NT*[d+1]; + for (int i=0; i + void Miniball::delete_arrays() + { + delete[] f; + delete[] z; + delete[] q0; + delete[] sqr_r; + for (int i=0; i + const typename Miniball::NT* + Miniball::center () const + { + return current_c; + } + + template + typename Miniball::NT + Miniball::squared_radius () const + { + return current_sqr_r; + } + + template + int Miniball::nr_support_points () const + { + assert (ssize < d+2); + return ssize; + } + + template + typename Miniball::SupportPointIterator + Miniball::support_points_begin () const + { + return L.begin(); + } + + template + typename Miniball::SupportPointIterator + Miniball::support_points_end () const + { + return support_end; + } + + template + typename Miniball::NT + Miniball::relative_error (NT& subopt) const + { + NT e, max_e = nt0; + // compute maximum absolute excess of support points + for (SupportPointIterator it = support_points_begin(); + it != support_points_end(); ++it) { + e = excess (*it); + if (e < nt0) e = -e; + if (e > max_e) { + max_e = e; + } + } + // compute maximum excess of any point + for (Pit i = points_begin; i != points_end; ++i) + if ((e = excess (i)) > max_e) + max_e = e; + + subopt = suboptimality(); + assert (current_sqr_r > nt0 || max_e == nt0); + return (current_sqr_r == nt0 ? nt0 : max_e / current_sqr_r); + } + + template + bool Miniball::is_valid (NT tol) const + { + NT suboptimality; + return ( (relative_error (suboptimality) <= tol) && (suboptimality == 0) ); + } + + template + double Miniball::get_time() const + { + return time; + } + + template + void Miniball::mtf_mb (Sit n) + { + // Algorithm 1: mtf_mb (L_{n-1}, B), where L_{n-1} = [L.begin, n) + // B: the set of forced points, defining the current ball + // S: the superset of support points computed by the algorithm + // -------------------------------------------------------------- + // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, + // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf + + // PRE: B = S + assert (fsize == ssize); + + support_end = L.begin(); + if ((fsize) == d+1) return; + + // incremental construction + for (Sit i = L.begin(); i != n;) + { + // INV: (support_end - L.begin() == |S|-|B|) + assert (std::distance (L.begin(), support_end) == ssize - fsize); + + Sit j = i++; + if (excess(*j) > nt0) + if (push(*j)) { // B := B + p_i + mtf_mb (j); // mtf_mb (L_{i-1}, B + p_i) + pop(); // B := B - p_i + mtf_move_to_front(j); + } + } + // POST: the range [L.begin(), support_end) stores the set S\B + } + + template + void Miniball::mtf_move_to_front (Sit j) + { + if (support_end == j) + support_end++; + L.splice (L.begin(), L, j); + } + + template + void Miniball::pivot_mb (Pit n) + { + // Algorithm 2: pivot_mb (L_{n-1}), where L_{n-1} = [L.begin, n) + // -------------------------------------------------------------- + // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, + // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf + NT old_sqr_r; + const NT* c; + Pit pivot, k; + NT e, max_e, sqr_r; + Cit p; + do { + old_sqr_r = current_sqr_r; + sqr_r = current_sqr_r; + + pivot = points_begin; + max_e = nt0; + for (k = points_begin; k != n; ++k) { + p = coord_accessor(k); + e = -sqr_r; + c = current_c; + for (int j=0; j(*p++-*c++); + if (e > max_e) { + max_e = e; + pivot = k; + } + } + + if (max_e > nt0) { + // check if the pivot is already contained in the support set + if (std::find(L.begin(), support_end, pivot) == support_end) { + assert (fsize == 0); + if (push (pivot)) { + mtf_mb(support_end); + pop(); + pivot_move_to_front(pivot); + } + } + } + } while (old_sqr_r < current_sqr_r); + } + + template + void Miniball::pivot_move_to_front (Pit j) + { + L.push_front(j); + if (std::distance(L.begin(), support_end) == d+2) + support_end--; + } + + template + inline typename Miniball::NT + Miniball::excess (Pit pit) const + { + Cit p = coord_accessor(pit); + NT e = -current_sqr_r; + NT* c = current_c; + for (int k=0; k(*p++-*c++); + } + return e; + } + + template + void Miniball::pop () + { + --fsize; + } + + template + bool Miniball::push (Pit pit) + { + int i, j; + NT eps = mb_sqr(std::numeric_limits::epsilon()); + + Cit cit = coord_accessor(pit); + Cit p = cit; + + if (fsize==0) { + for (i=0; i(v[fsize][j]); + z[fsize]*=2; + + // reject push if z_fsize too small + if (z[fsize](*p++-c[fsize-1][i]); + f[fsize]=e/z[fsize]; + + for (i=0; i + typename Miniball::NT + Miniball::suboptimality () const + { + NT* l = new NT[d+1]; + NT min_l = nt0; + l[0] = NT(1); + for (int i=ssize-1; i>0; --i) { + l[i] = f[i]; + for (int k=ssize-1; k>i; --k) + l[i]-=a[k][i]*l[k]; + if (l[i] < min_l) min_l = l[i]; + l[0] -= l[i]; + } + if (l[0] < min_l) min_l = l[0]; + delete[] l; + if (min_l < nt0) + return -min_l; + return nt0; + } + +} // end Namespace Miniball diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h new file mode 100644 index 00000000..3a0d828a --- /dev/null +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -0,0 +1,126 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef CECH_COMPLEX_H_ +#define CECH_COMPLEX_H_ + +#include // for Gudhi::Proximity_graph +#include // for GUDHI_CHECK +#include // for Gudhi::cech_complex::Cech_blocker + +#include +#include +#include +#include // for std::size + +namespace Gudhi { + +namespace cech_complex { + +/** + * \class Cech_complex + * \brief Cech complex data structure. + * + * \ingroup Cech_complex + * + * \details + * The data structure is a one skeleton graph, or Rips graph, containing edges when the edge length is less or equal + * to a given threshold. Edge length is computed from a user given point cloud with a given distance function, or a + * distance matrix. + * + * \tparam Filtration_value is the type used to store the filtration values of the simplicial complex. + */ +template +class Cech_complex { + private: + using Vertex_handle = typename SimplicialComplexForCechComplex::Vertex_handle; + using Filtration_value = typename SimplicialComplexForCechComplex::Filtration_value; + using Proximity_graph = Gudhi::Proximity_graph; + + public: + /** \brief Cech_complex constructor from a list of points. + * + * @param[in] points Range of points. + * @param[in] threshold Rips value. + * @param[in] distance distance function that returns a `Filtration_value` from 2 given points. + * + * \tparam ForwardPointRange must be a range for which `std::begin` and `std::end` return input iterators on a + * point. + * + * \tparam Distance furnishes `operator()(const Point& p1, const Point& p2)`, where + * `Point` is a point from the `ForwardPointRange`, and that returns a `Filtration_value`. + */ + template + Cech_complex(const ForwardPointRange& points, Filtration_value threshold, Distance distance) + : threshold_(threshold), + point_cloud_(points) { + GUDHI_CHECK(std::size(points) > 0, + std::invalid_argument("Cech_complex::create_complex - point cloud is empty")); + dimension_ = points[0].size(); + cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, threshold_, distance); + } + + /** \brief Initializes the simplicial complex from the Rips graph and expands it until a given maximal + * dimension. + * + * @param[in] complex SimplicialComplexForCech to be created. + * @param[in] dim_max graph expansion for Rips until this given maximal dimension. + * @exception std::invalid_argument In debug mode, if `complex.num_vertices()` does not return 0. + * + */ + void create_complex(SimplicialComplexForCechComplex& complex, int dim_max) { + GUDHI_CHECK(complex.num_vertices() == 0, + std::invalid_argument("Cech_complex::create_complex - simplicial complex is not empty")); + + // insert the proximity graph in the simplicial complex + complex.insert_graph(cech_skeleton_graph_); + // expand the graph until dimension dim_max + complex.expansion_with_blockers(dim_max, + Cech_blocker(complex, this)); + } + + Filtration_value threshold() const { + return threshold_; + } + + std::size_t dimension() const { + return dimension_; + } + + auto point(std::size_t vertex) const -> decltype(point_cloud_.begin() + vertex) { + GUDHI_CHECK((point_cloud_.begin() + vertex) < point_cloud_.end(), + std::invalid_argument("Cech_complex::point - simplicial complex is not empty")); + return (point_cloud_.begin() + vertex); + } + + private: + Proximity_graph cech_skeleton_graph_; + Filtration_value threshold_; + ForwardPointRange point_cloud_; + std::size_t dimension_; +}; + +} // namespace cech_complex + +} // namespace Gudhi + +#endif // CECH_COMPLEX_H_ diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h new file mode 100644 index 00000000..647bf0b7 --- /dev/null +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -0,0 +1,85 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef CECH_COMPLEX_BLOCKER_H_ +#define CECH_COMPLEX_BLOCKER_H_ + +#include +#include + +#include + +#include +#include +#include // for std::sqrt + +namespace Gudhi { + +namespace cech_complex { + +// Just declaring Cech_complex class because used and not yet defined. +template +class Cech_complex; + +template +class Cech_blocker { + private: + using Point = std::vector; + using Point_cloud = std::vector; + using Point_iterator = Point_cloud::const_iterator; + using Coordinate_iterator = Point::const_iterator; + using Min_sphere = Miniball::Miniball>; + using Simplex_handle = typename SimplicialComplexForCech::Simplex_handle; + using Filtration_value = typename SimplicialComplexForCech::Filtration_value; + using Cech_complex = Gudhi::cech_complex::Cech_complex; + + public: + bool operator()(Simplex_handle sh) { + Point_cloud points; + for (auto vertex : simplicial_complex_.simplex_vertex_range(sh)) { + points.push_back(cc_ptr_->point(vertex)); +#ifdef DEBUG_TRACES + std::cout << "#(" << vertex << ")#"; +#endif // DEBUG_TRACES + } + Min_sphere ms(cc_ptr_->dimension(), points.begin(),points.end()); + Filtration_value radius = std::sqrt(ms.squared_radius()); +#ifdef DEBUG_TRACES + std::cout << "radius = " << radius << " - " << (radius > cc_ptr_->threshold()) << std::endl; +#endif // DEBUG_TRACES + simplicial_complex_.assign_filtration(sh, radius); + return (radius > cc_ptr_->threshold()); + } + Cech_blocker(SimplicialComplexForCech& simplicial_complex, Cech_complex* cc_ptr) + : simplicial_complex_(simplicial_complex), + cc_ptr_(cc_ptr) { + } + private: + SimplicialComplexForCech simplicial_complex_; + Cech_complex* cc_ptr_; +}; + +} // namespace cech_complex + +} // namespace Gudhi + +#endif // CECH_COMPLEX_BLOCKER_H_ diff --git a/src/cmake/modules/GUDHI_user_version_target.cmake b/src/cmake/modules/GUDHI_user_version_target.cmake index 4abc2574..87141380 100644 --- a/src/cmake/modules/GUDHI_user_version_target.cmake +++ b/src/cmake/modules/GUDHI_user_version_target.cmake @@ -49,9 +49,9 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11) set(GUDHI_DIRECTORIES "doc;example;concept;utilities") if (NOT CGAL_VERSION VERSION_GREATER 4.11.0) - set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/gudhi_patches") + set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/Miniball;include/gudhi_patches") else () - set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi") + set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/Miniball") endif () foreach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST}) -- cgit v1.2.3 From 4a91726c9500e4b7ffe469192aa1140650c3d094 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 16 Feb 2018 16:42:04 +0000 Subject: Compiles. Class documentation is done. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3252 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: fdcfe090afddb112dee4c19c7b42432277a7f468 --- src/Cech_complex/include/gudhi/Cech_complex.h | 57 +++++++++++++--------- .../include/gudhi/Cech_complex_blocker.h | 5 +- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 3a0d828a..94939105 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -29,8 +29,8 @@ #include #include -#include -#include // for std::size +#include // for std::size_t +#include // for exception management namespace Gudhi { @@ -43,18 +43,21 @@ namespace cech_complex { * \ingroup Cech_complex * * \details - * The data structure is a one skeleton graph, or Rips graph, containing edges when the edge length is less or equal - * to a given threshold. Edge length is computed from a user given point cloud with a given distance function, or a - * distance matrix. - * - * \tparam Filtration_value is the type used to store the filtration values of the simplicial complex. + * The data structure is a proximity graph, containing edges when the edge length is less or equal + * to a given threshold. Edge length is computed from a user given point cloud with a given distance function. + * + * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required + * by `Gudhi::Proximity_graph`. + * + * \tparam ForwardPointRange furnishes `.size()`, `.begin()` and `.end()` methods, and a `const_iterator` type + * definition. */ -template +template class Cech_complex { private: - using Vertex_handle = typename SimplicialComplexForCechComplex::Vertex_handle; - using Filtration_value = typename SimplicialComplexForCechComplex::Filtration_value; - using Proximity_graph = Gudhi::Proximity_graph; + using Vertex_handle = typename SimplicialComplexForProximityGraph::Vertex_handle; + using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value; + using Proximity_graph = Gudhi::Proximity_graph; public: /** \brief Cech_complex constructor from a list of points. @@ -62,9 +65,10 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] threshold Rips value. * @param[in] distance distance function that returns a `Filtration_value` from 2 given points. - * - * \tparam ForwardPointRange must be a range for which `std::begin` and `std::end` return input iterators on a - * point. + * @exception std::invalid_argument In debug mode, if `points.size()` returns a value ≤ 0. + * + * \tparam ForwardPointRange must be a range for which `.size()`, `.begin()` and `.end()` methods return input + * iterators on a point. A point must have a `.size()` method available. * * \tparam Distance furnishes `operator()(const Point& p1, const Point& p2)`, where * `Point` is a point from the `ForwardPointRange`, and that returns a `Filtration_value`. @@ -73,20 +77,23 @@ class Cech_complex { Cech_complex(const ForwardPointRange& points, Filtration_value threshold, Distance distance) : threshold_(threshold), point_cloud_(points) { - GUDHI_CHECK(std::size(points) > 0, + GUDHI_CHECK(points.size() > 0, std::invalid_argument("Cech_complex::create_complex - point cloud is empty")); - dimension_ = points[0].size(); - cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, threshold_, distance); + dimension_ = points.begin()->size(); + cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, + threshold_, + distance); } - /** \brief Initializes the simplicial complex from the Rips graph and expands it until a given maximal - * dimension. + /** \brief Initializes the simplicial complex from the proximity graph and expands it until a given maximal + * dimension, using the Cech blocker oracle. * * @param[in] complex SimplicialComplexForCech to be created. - * @param[in] dim_max graph expansion for Rips until this given maximal dimension. + * @param[in] dim_max graph expansion until this given maximal dimension. * @exception std::invalid_argument In debug mode, if `complex.num_vertices()` does not return 0. * */ + template void create_complex(SimplicialComplexForCechComplex& complex, int dim_max) { GUDHI_CHECK(complex.num_vertices() == 0, std::invalid_argument("Cech_complex::create_complex - simplicial complex is not empty")); @@ -98,17 +105,23 @@ class Cech_complex { Cech_blocker(complex, this)); } + /** @return Threshold value given at construction. */ Filtration_value threshold() const { return threshold_; } + /** @return Dimension value given at construction by the first point dimension. */ std::size_t dimension() const { return dimension_; } - auto point(std::size_t vertex) const -> decltype(point_cloud_.begin() + vertex) { + /** @param[in] vertex Point position in the range. + * @return Threshold value given at construction. + * @exception std::out_of_range In debug mode, if point position in the range is out. + */ + typename ForwardPointRange::const_iterator point(std::size_t vertex) const { GUDHI_CHECK((point_cloud_.begin() + vertex) < point_cloud_.end(), - std::invalid_argument("Cech_complex::point - simplicial complex is not empty")); + std::out_of_range("Cech_complex::point - simplicial complex is not empty")); return (point_cloud_.begin() + vertex); } diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 647bf0b7..25fab909 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -23,8 +23,7 @@ #ifndef CECH_COMPLEX_BLOCKER_H_ #define CECH_COMPLEX_BLOCKER_H_ -#include -#include +#include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex #include @@ -56,7 +55,7 @@ class Cech_blocker { bool operator()(Simplex_handle sh) { Point_cloud points; for (auto vertex : simplicial_complex_.simplex_vertex_range(sh)) { - points.push_back(cc_ptr_->point(vertex)); + points.push_back(*(cc_ptr_->point(vertex))); #ifdef DEBUG_TRACES std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES -- cgit v1.2.3 From 0586a149b5bb3a4b65b63b2ab7d3ecdd9682ee1b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 20 Feb 2018 16:03:52 +0000 Subject: tests and utils fix git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3253 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 5786a8a7e4b16750f29fac99ca61926158542cfd --- .../concept/SimplicialComplexForCech.h | 66 +++++ .../example_one_skeleton_cech_from_points.cpp | 5 +- src/Cech_complex/include/Miniball/Miniball.hpp | 5 + src/Cech_complex/include/gudhi/Cech_complex.h | 18 +- .../include/gudhi/Cech_complex_blocker.h | 23 +- src/Cech_complex/test/CMakeLists.txt | 15 ++ src/Cech_complex/test/README | 12 + src/Cech_complex/test/test_cech_complex.cpp | 274 +++++++++++++++++++++ src/Cech_complex/utilities/CMakeLists.txt | 14 ++ src/Cech_complex/utilities/cech_persistence.cpp | 136 ++++++++++ src/Cech_complex/utilities/cechcomplex.md | 33 +++ 11 files changed, 587 insertions(+), 14 deletions(-) create mode 100644 src/Cech_complex/concept/SimplicialComplexForCech.h create mode 100644 src/Cech_complex/test/CMakeLists.txt create mode 100644 src/Cech_complex/test/README create mode 100644 src/Cech_complex/test/test_cech_complex.cpp create mode 100644 src/Cech_complex/utilities/CMakeLists.txt create mode 100644 src/Cech_complex/utilities/cech_persistence.cpp create mode 100644 src/Cech_complex/utilities/cechcomplex.md diff --git a/src/Cech_complex/concept/SimplicialComplexForCech.h b/src/Cech_complex/concept/SimplicialComplexForCech.h new file mode 100644 index 00000000..1954a703 --- /dev/null +++ b/src/Cech_complex/concept/SimplicialComplexForCech.h @@ -0,0 +1,66 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef CONCEPT_CECH_COMPLEX_SIMPLICIAL_COMPLEX_FOR_CECH_H_ +#define CONCEPT_CECH_COMPLEX_SIMPLICIAL_COMPLEX_FOR_CECH_H_ + +namespace Gudhi { + +namespace cech_complex { + +/** \brief The concept SimplicialComplexForCech describes the requirements for a type to implement a simplicial + * complex, that can be created from a `Cech_complex`. + */ +struct SimplicialComplexForCech { + /** Handle to specify a simplex. */ + typedef unspecified Simplex_handle; + /** Handle to specify a vertex. Must be a non-negative integer. */ + typedef unspecified Vertex_handle; + /** Handle to specify the simplex filtration value. */ + typedef unspecified Filtration_value; + + /** Assigns the 'simplex' with the given 'filtration' value. */ + int assign_filtration(Simplex_handle simplex, Filtration_value filtration); + + /** \brief Returns a range over vertices of a given + * simplex. */ + Simplex_vertex_range simplex_vertex_range(Simplex_handle const & simplex); + + /** \brief Inserts a given `Gudhi::ProximityGraph` in the simplicial complex. */ + template + void insert_graph(const ProximityGraph& proximity_graph); + + /** \brief Expands the simplicial complex containing only its one skeleton until a given maximal dimension. + * expansion can be blocked by the blocker oracle. */ + template< typename Blocker > + void expansion_with_blockers(int max_dim, Blocker block_simplex); + + /** Returns the number of vertices in the simplicial complex. */ + std::size_t num_vertices(); + +}; + +} // namespace alpha_complex + +} // namespace Gudhi + +#endif // CONCEPT_ALPHA_COMPLEX_SIMPLICIAL_COMPLEX_FOR_ALPHA_H_ diff --git a/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp b/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp index 9b03616c..73679716 100644 --- a/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp +++ b/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp @@ -27,11 +27,12 @@ #include #include #include +#include #include // for std::numeric_limits int main() { // Type definitions - using Point_cloud = std::vector>; + using Point_cloud = std::vector>; using Simplex_tree = Gudhi::Simplex_tree; using Filtration_value = Simplex_tree::Filtration_value; using Cech_complex = Gudhi::cech_complex::Cech_complex; @@ -52,7 +53,7 @@ int main() { Cech_complex cech_complex_from_points(points, threshold, Gudhi::Euclidean_distance()); Simplex_tree stree; - cech_complex_from_points.create_complex(stree, 2); + cech_complex_from_points.create_complex(stree, 3); // ---------------------------------------------------------------------------- // Display information about the one skeleton Rips complex // ---------------------------------------------------------------------------- diff --git a/src/Cech_complex/include/Miniball/Miniball.hpp b/src/Cech_complex/include/Miniball/Miniball.hpp index cb76c534..a42d62a7 100644 --- a/src/Cech_complex/include/Miniball/Miniball.hpp +++ b/src/Cech_complex/include/Miniball/Miniball.hpp @@ -23,6 +23,9 @@ // CH-8092 Zuerich, Switzerland // http://www.inf.ethz.ch/personal/gaertner +#ifndef MINIBALL_HPP_ +#define MINIBALL_HPP_ + #include #include #include @@ -513,3 +516,5 @@ namespace Miniball { } } // end Namespace Miniball + +#endif // MINIBALL_HPP_ diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 94939105..e847c97f 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -28,7 +28,6 @@ #include // for Gudhi::cech_complex::Cech_blocker #include -#include #include // for std::size_t #include // for exception management @@ -40,7 +39,7 @@ namespace cech_complex { * \class Cech_complex * \brief Cech complex data structure. * - * \ingroup Cech_complex + * \ingroup cech_complex * * \details * The data structure is a proximity graph, containing edges when the edge length is less or equal @@ -65,10 +64,9 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] threshold Rips value. * @param[in] distance distance function that returns a `Filtration_value` from 2 given points. - * @exception std::invalid_argument In debug mode, if `points.size()` returns a value ≤ 0. * * \tparam ForwardPointRange must be a range for which `.size()`, `.begin()` and `.end()` methods return input - * iterators on a point. A point must have a `.size()` method available. + * iterators on a point. `.begin()` and `.end()` methods are required for a point. * * \tparam Distance furnishes `operator()(const Point& p1, const Point& p2)`, where * `Point` is a point from the `ForwardPointRange`, and that returns a `Filtration_value`. @@ -77,12 +75,10 @@ class Cech_complex { Cech_complex(const ForwardPointRange& points, Filtration_value threshold, Distance distance) : threshold_(threshold), point_cloud_(points) { - GUDHI_CHECK(points.size() > 0, - std::invalid_argument("Cech_complex::create_complex - point cloud is empty")); - dimension_ = points.begin()->size(); + dimension_ = points.begin()->end() - points.begin()->begin(); cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, - threshold_, - distance); + threshold_, + distance); } /** \brief Initializes the simplicial complex from the proximity graph and expands it until a given maximal @@ -116,10 +112,10 @@ class Cech_complex { } /** @param[in] vertex Point position in the range. - * @return Threshold value given at construction. + * @return A const iterator on the point. * @exception std::out_of_range In debug mode, if point position in the range is out. */ - typename ForwardPointRange::const_iterator point(std::size_t vertex) const { + typename ForwardPointRange::const_iterator point_iterator(std::size_t vertex) const { GUDHI_CHECK((point_cloud_.begin() + vertex) < point_cloud_.end(), std::out_of_range("Cech_complex::point - simplicial complex is not empty")); return (point_cloud_.begin() + vertex); diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 25fab909..f8738be0 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -39,6 +39,20 @@ namespace cech_complex { template class Cech_complex; +/** \internal + * \class Cech_blocker + * \brief Cech complex blocker. + * + * \ingroup cech_complex + * + * \details + * Cech blocker is an oracle constructed from a Cech_complex and a simplicial complex. + * + * \tparam SimplicialComplexForProximityGraph furnishes `Simplex_handle` and `Filtration_value` type definition, + * `simplex_vertex_range(Simplex_handle sh)`and `assign_filtration(Simplex_handle sh, Filtration_value filt)` methods. + * + * \tparam ForwardPointRange is required by the pointer on Chech_complex for type definition. + */ template class Cech_blocker { private: @@ -52,10 +66,15 @@ class Cech_blocker { using Cech_complex = Gudhi::cech_complex::Cech_complex; public: + /** \internal \brief Cech complex blocker operator() - the oracle - assigns the filtration value from the simplex + * radius and returns if the simplex expansion must be blocked. + * \param[in] sh The Simplex_handle. + * \return true if the simplex radius is greater than the Cech_complex threshold*/ bool operator()(Simplex_handle sh) { Point_cloud points; for (auto vertex : simplicial_complex_.simplex_vertex_range(sh)) { - points.push_back(*(cc_ptr_->point(vertex))); + points.push_back(Point(cc_ptr_->point_iterator(vertex)->begin(), + cc_ptr_->point_iterator(vertex)->end())); #ifdef DEBUG_TRACES std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES @@ -68,6 +87,8 @@ class Cech_blocker { simplicial_complex_.assign_filtration(sh, radius); return (radius > cc_ptr_->threshold()); } + + /** \internal \brief Cech complex blocker constructor. */ Cech_blocker(SimplicialComplexForCech& simplicial_complex, Cech_complex* cc_ptr) : simplicial_complex_(simplicial_complex), cc_ptr_(cc_ptr) { diff --git a/src/Cech_complex/test/CMakeLists.txt b/src/Cech_complex/test/CMakeLists.txt new file mode 100644 index 00000000..8db51173 --- /dev/null +++ b/src/Cech_complex/test/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.6) +project(Cech_complex_tests) + +include(GUDHI_test_coverage) + +add_executable ( Cech_complex_test_unit test_cech_complex.cpp ) +target_link_libraries(Cech_complex_test_unit ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) +if (TBB_FOUND) + target_link_libraries(Cech_complex_test_unit ${TBB_LIBRARIES}) +endif() + +# Do not forget to copy test files in current binary dir +file(COPY "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) + +gudhi_add_coverage_test(Cech_complex_test_unit) diff --git a/src/Cech_complex/test/README b/src/Cech_complex/test/README new file mode 100644 index 00000000..adf704f7 --- /dev/null +++ b/src/Cech_complex/test/README @@ -0,0 +1,12 @@ +To compile: +*********** + +cmake . +make + +To launch with details: +*********************** + +./Cech_complex_test_unit --report_level=detailed --log_level=all + + ==> echo $? returns 0 in case of success (non-zero otherwise) diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp new file mode 100644 index 00000000..aa42d322 --- /dev/null +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -0,0 +1,274 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "cech_complex" +#include + +#include // float comparison +#include +#include +#include +#include // std::max + +#include +// to construct Cech_complex from a OFF file of points +#include +#include +#include +#include + +#include + +// Type definitions +using Simplex_tree = Gudhi::Simplex_tree<>; +using Filtration_value = Simplex_tree::Filtration_value; +using Point = std::vector; +using Point_cloud = std::vector; +using Points_off_reader = Gudhi::Points_off_reader; +using Cech_complex = Gudhi::cech_complex::Cech_complex; + +using Point_iterator = Point_cloud::const_iterator; +using Coordinate_iterator = Point::const_iterator; +using Min_sphere = Miniball::Miniball>; + +BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { + // ---------------------------------------------------------------------------- + // + // Init of a Cech complex from a OFF file + // + // ---------------------------------------------------------------------------- + std::string off_file_name("alphacomplexdoc.off"); + double threshold = 12.0; + std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech threshold=" << + threshold << "==========" << std::endl; + + Points_off_reader off_reader(off_file_name); + Point_cloud point_cloud = off_reader.get_point_cloud(); + Cech_complex cech_complex_from_file(point_cloud, threshold, Gudhi::Euclidean_distance()); + + std::size_t i = 0; + for (; i < point_cloud.size(); i++) { + BOOST_CHECK(point_cloud[i] == *(cech_complex_from_file.point_iterator(i))); + } +#ifdef GUDHI_DEBUG + BOOST_CHECK_THROW (cech_complex_from_file.point_iterator(i+1), std::out_of_range); +#endif // GUDHI_DEBUG + + const int DIMENSION_1 = 1; + Simplex_tree st; + cech_complex_from_file.create_complex(st, DIMENSION_1); + std::cout << "st.dimension()=" << st.dimension() << std::endl; + BOOST_CHECK(st.dimension() == DIMENSION_1); + + const int NUMBER_OF_VERTICES = 7; + std::cout << "st.num_vertices()=" << st.num_vertices() << std::endl; + BOOST_CHECK(st.num_vertices() == NUMBER_OF_VERTICES); + + std::cout << "st.num_simplices()=" << st.num_simplices() << std::endl; + BOOST_CHECK(st.num_simplices() == 18); + + // Check filtration values of vertices is 0.0 + for (auto f_simplex : st.skeleton_simplex_range(0)) { + BOOST_CHECK(st.filtration(f_simplex) == 0.0); + } + + // Check filtration values of edges + for (auto f_simplex : st.skeleton_simplex_range(DIMENSION_1)) { + if (DIMENSION_1 == st.dimension(f_simplex)) { + std::vector vp; + std::cout << "vertex = ("; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::cout << vertex << ","; + vp.push_back(off_reader.get_point_cloud().at(vertex)); + } + std::cout << ") - distance =" << Gudhi::Euclidean_distance()(vp.at(0), vp.at(1)) << + " - filtration =" << st.filtration(f_simplex) << std::endl; + BOOST_CHECK(vp.size() == 2); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Euclidean_distance()(vp.at(0), vp.at(1))); + } + } + + const int DIMENSION_2 = 2; + Simplex_tree st2; + cech_complex_from_file.create_complex(st2, DIMENSION_2); + std::cout << "st2.dimension()=" << st2.dimension() << std::endl; + BOOST_CHECK(st2.dimension() == DIMENSION_2); + + std::cout << "st2.num_vertices()=" << st2.num_vertices() << std::endl; + BOOST_CHECK(st2.num_vertices() == NUMBER_OF_VERTICES); + + std::cout << "st2.num_simplices()=" << st2.num_simplices() << std::endl; + BOOST_CHECK(st2.num_simplices() == 23); + + Point_cloud points012; + for (std::size_t vertex = 0; vertex <= 2; vertex++) { + points012.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), + cech_complex_from_file.point_iterator(vertex)->end())); + } + Min_sphere ms012(cech_complex_from_file.dimension(), points012.begin(),points012.end()); + + Simplex_tree::Filtration_value f012 = st2.filtration(st2.find({0, 1, 2})); + std::cout << "f012= " << f012 << " | ms012_radius= " << std::sqrt(ms012.squared_radius()) << std::endl; + + GUDHI_TEST_FLOAT_EQUALITY_CHECK(f012, std::sqrt(ms012.squared_radius())); + + Point_cloud points456; + for (std::size_t vertex = 4; vertex <= 6; vertex++) { + points456.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), + cech_complex_from_file.point_iterator(vertex)->end())); + } + Min_sphere ms456(cech_complex_from_file.dimension(), points456.begin(),points456.end()); + + Simplex_tree::Filtration_value f456 = st2.filtration(st2.find({4, 5, 6})); + std::cout << "f456= " << f456 << " | ms456_radius= " << std::sqrt(ms456.squared_radius()) << std::endl; + + GUDHI_TEST_FLOAT_EQUALITY_CHECK(f456, std::sqrt(ms456.squared_radius())); + + const int DIMENSION_3 = 3; + Simplex_tree st3; + cech_complex_from_file.create_complex(st3, DIMENSION_3); + std::cout << "st3.dimension()=" << st3.dimension() << std::endl; + BOOST_CHECK(st3.dimension() == DIMENSION_3); + + std::cout << "st3.num_vertices()=" << st3.num_vertices() << std::endl; + BOOST_CHECK(st3.num_vertices() == NUMBER_OF_VERTICES); + + std::cout << "st3.num_simplices()=" << st3.num_simplices() << std::endl; + BOOST_CHECK(st3.num_simplices() == 24); + + Point_cloud points0123; + for (std::size_t vertex = 0; vertex <= 3; vertex++) { + points0123.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), + cech_complex_from_file.point_iterator(vertex)->end())); + } + Min_sphere ms0123(cech_complex_from_file.dimension(), points0123.begin(),points0123.end()); + + Simplex_tree::Filtration_value f0123 = st3.filtration(st3.find({0, 1, 2, 3})); + std::cout << "f0123= " << f0123 << " | ms0123_radius= " << std::sqrt(ms0123.squared_radius()) << std::endl; + + GUDHI_TEST_FLOAT_EQUALITY_CHECK(f0123, std::sqrt(ms0123.squared_radius())); + + + + Point_cloud points01; + for (std::size_t vertex = 0; vertex <= 1; vertex++) { + points01.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), + cech_complex_from_file.point_iterator(vertex)->end())); + } + Min_sphere ms01(cech_complex_from_file.dimension(), points01.begin(),points01.end()); + + Simplex_tree::Filtration_value f01 = st2.filtration(st2.find({0, 1})); + std::cout << "f01= " << f01 << " | ms01_radius= " << std::sqrt(ms01.squared_radius()) << std::endl; + +} + +BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { + // ---------------------------------------------------------------------------- + // Init of a list of points + // ---------------------------------------------------------------------------- + Point_cloud points; + std::vector coords = { 0.0, 0.0, 0.0, 1.0 }; + points.push_back(Point(coords.begin(), coords.end())); + coords = { 0.0, 0.0, 1.0, 0.0 }; + points.push_back(Point(coords.begin(), coords.end())); + coords = { 0.0, 1.0, 0.0, 0.0 }; + points.push_back(Point(coords.begin(), coords.end())); + coords = { 1.0, 0.0, 0.0, 0.0 }; + points.push_back(Point(coords.begin(), coords.end())); + + // ---------------------------------------------------------------------------- + // Init of a Cech complex from the list of points + // ---------------------------------------------------------------------------- + Cech_complex cech_complex_from_points(points, 2.0, Gudhi::Euclidean_distance()); + + std::cout << "========== cech_complex_from_points ==========" << std::endl; + Simplex_tree st; + const int DIMENSION = 3; + cech_complex_from_points.create_complex(st, DIMENSION); + + // Another way to check num_simplices + std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << std::endl; + int num_simplices = 0; + for (auto f_simplex : st.filtration_simplex_range()) { + num_simplices++; + std::cout << " ( "; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::cout << vertex << " "; + } + std::cout << ") -> " << "[" << st.filtration(f_simplex) << "] "; + std::cout << std::endl; + } + BOOST_CHECK(num_simplices == 15); + std::cout << "st.num_simplices()=" << st.num_simplices() << std::endl; + BOOST_CHECK(st.num_simplices() == 15); + + std::cout << "st.dimension()=" << st.dimension() << std::endl; + BOOST_CHECK(st.dimension() == DIMENSION); + std::cout << "st.num_vertices()=" << st.num_vertices() << std::endl; + BOOST_CHECK(st.num_vertices() == 4); + + for (auto f_simplex : st.filtration_simplex_range()) { + std::cout << "dimension(" << st.dimension(f_simplex) << ") - f = " << st.filtration(f_simplex) << std::endl; + switch (st.dimension(f_simplex)) { + case 0: + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.0); + break; + case 1: + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 1.41421, .00001); + break; + case 2: + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.816497, .00001); + break; + case 3: + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.866025, .00001); + break; + default: + BOOST_CHECK(false); // Shall not happen + break; + } + } +} + +#ifdef GUDHI_DEBUG +BOOST_AUTO_TEST_CASE(Cech_create_complex_throw) { + // ---------------------------------------------------------------------------- + // + // Init of a Cech complex from a OFF file + // + // ---------------------------------------------------------------------------- + std::string off_file_name("alphacomplexdoc.off"); + double threshold = 12.0; + std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech threshold=" << + threshold << "==========" << std::endl; + + Gudhi::Points_off_reader off_reader(off_file_name); + Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance()); + + Simplex_tree stree; + std::vector simplex = {0, 1, 2}; + stree.insert_simplex_and_subfaces(simplex); + std::cout << "Check exception throw in debug mode" << std::endl; + // throw excpt because stree is not empty + BOOST_CHECK_THROW (cech_complex_from_file.create_complex(stree, 1), std::invalid_argument); +} +#endif diff --git a/src/Cech_complex/utilities/CMakeLists.txt b/src/Cech_complex/utilities/CMakeLists.txt new file mode 100644 index 00000000..a4f89d2c --- /dev/null +++ b/src/Cech_complex/utilities/CMakeLists.txt @@ -0,0 +1,14 @@ +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_LIBRARY}) + +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_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") + +install(TARGETS cech_persistence DESTINATION bin) diff --git a/src/Cech_complex/utilities/cech_persistence.cpp b/src/Cech_complex/utilities/cech_persistence.cpp new file mode 100644 index 00000000..e93596d4 --- /dev/null +++ b/src/Cech_complex/utilities/cech_persistence.cpp @@ -0,0 +1,136 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Clément Maria + * + * Copyright (C) 2014 INRIA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include // infinity + +// Types definition +using Simplex_tree = Gudhi::Simplex_tree; +using Filtration_value = Simplex_tree::Filtration_value; +using Point = std::vector; +using Point_cloud = std::vector; +using Points_off_reader = Gudhi::Points_off_reader; +using Cech_complex = Gudhi::cech_complex::Cech_complex; +using Field_Zp = Gudhi::persistent_cohomology::Field_Zp; +using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology; + +void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag, + Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence); + +int main(int argc, char* argv[]) { + std::string off_file_points; + std::string filediag; + Filtration_value threshold; + int dim_max; + int p; + Filtration_value min_persistence; + + program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence); + + Points_off_reader off_reader(off_file_points); + Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance()); + + // Construct the Cech complex in a Simplex Tree + Simplex_tree simplex_tree; + + cech_complex_from_file.create_complex(simplex_tree, dim_max); + std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n"; + std::cout << " and has dimension " << simplex_tree.dimension() << " \n"; + + // Sort the simplices in the order of the filtration + simplex_tree.initialize_filtration(); + + // Compute the persistence diagram of the complex + Persistent_cohomology pcoh(simplex_tree); + // initializes the coefficient field for homology + pcoh.init_coefficients(p); + + pcoh.compute_persistent_cohomology(min_persistence); + + // Output the diagram in filediag + if (filediag.empty()) { + pcoh.output_diagram(); + } else { + std::ofstream out(filediag); + pcoh.output_diagram(out); + out.close(); + } + + return 0; +} + +void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag, + Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) { + namespace po = boost::program_options; + po::options_description hidden("Hidden options"); + hidden.add_options()("input-file", po::value(&off_file_points), + "Name of an OFF file containing a point set.\n"); + + po::options_description visible("Allowed options", 100); + visible.add_options()("help,h", "produce help message")( + "output-file,o", po::value(&filediag)->default_value(std::string()), + "Name of file in which the persistence diagram is written. Default print in std::cout")( + "max-edge-length,r", + po::value(&threshold)->default_value(std::numeric_limits::infinity()), + "Maximal length of an edge for the Cech complex construction.")( + "cpx-dimension,d", po::value(&dim_max)->default_value(1), + "Maximal dimension of the Cech complex we want to compute.")( + "field-charac,p", po::value(&p)->default_value(11), + "Characteristic p of the coefficient field Z/pZ for computing homology.")( + "min-persistence,m", po::value(&min_persistence), + "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length " + "intervals"); + + po::positional_options_description pos; + pos.add("input-file", 1); + + po::options_description all; + all.add(visible).add(hidden); + + po::variables_map vm; + po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm); + po::notify(vm); + + if (vm.count("help") || !vm.count("input-file")) { + std::cout << std::endl; + std::cout << "Compute the persistent homology with coefficient field Z/pZ \n"; + std::cout << "of a Cech complex defined on a set of input points.\n \n"; + std::cout << "The output diagram contains one bar per line, written with the convention: \n"; + std::cout << " p dim b d \n"; + std::cout << "where dim is the dimension of the homological feature,\n"; + std::cout << "b and d are respectively the birth and death of the feature and \n"; + std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl; + + std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl; + std::cout << visible << std::endl; + std::abort(); + } +} diff --git a/src/Cech_complex/utilities/cechcomplex.md b/src/Cech_complex/utilities/cechcomplex.md new file mode 100644 index 00000000..6330727a --- /dev/null +++ b/src/Cech_complex/utilities/cechcomplex.md @@ -0,0 +1,33 @@ + + +# Cech complex # + +## cech_persistence ## +This program computes the persistent homology with coefficient field *Z/pZ* of a Cech complex defined on a set of input points, using Euclidean distance. The output diagram contains one bar per line, written with the convention: + +`p dim birth death` + +where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature, and `p` is the characteristic of the field *Z/pZ* used for homology coefficients (`p` must be a prime number). + +**Usage** + +`cech_persistence [options] ` + +**Allowed options** + +* `-h [ --help ]` Produce help message +* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output. +* `-r [ --max-edge-length ]` (default = inf) Maximal length of an edge for the Cech complex construction. +* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Cech complex we want to compute. +* `-p [ --field-charac ]` (default = 11) Characteristic p of the 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. + +Beware: this program may use a lot of RAM and take a lot of time if `max-edge-length` is set to a large value. + +**Example 1 with Z/2Z coefficients** + +`cech_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 2` + +**Example 2 with Z/3Z coefficients** + +`cech_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 3` -- cgit v1.2.3 From d57e3dfbf15f8aaa3afa097a4e3ed49cd23d26ea Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 20 Feb 2018 16:30:27 +0000 Subject: Add doc, example renamed git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3254 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 666bacd07c711b89167c87155c21fe88688e2e68 --- src/Cech_complex/doc/COPYRIGHT | 19 ++ src/Cech_complex/doc/Intro_cech_complex.h | 92 ++++++ .../doc/cech_complex_representation.ipe | 326 +++++++++++++++++++++ .../doc/cech_complex_representation.png | Bin 0 -> 15677 bytes src/Cech_complex/doc/cech_one_skeleton.ipe | 326 +++++++++++++++++++++ src/Cech_complex/doc/cech_one_skeleton.png | Bin 0 -> 47651 bytes src/Cech_complex/example/CMakeLists.txt | 6 +- .../example/cech_complex_example_from_points.cpp | 75 +++++ .../cech_complex_example_from_points_for_doc.txt | 16 + .../example_one_skeleton_cech_from_points.cpp | 75 ----- .../include/gudhi/Cech_complex_blocker.h | 8 +- 11 files changed, 861 insertions(+), 82 deletions(-) create mode 100644 src/Cech_complex/doc/COPYRIGHT create mode 100644 src/Cech_complex/doc/cech_complex_representation.ipe create mode 100644 src/Cech_complex/doc/cech_complex_representation.png create mode 100644 src/Cech_complex/doc/cech_one_skeleton.ipe create mode 100644 src/Cech_complex/doc/cech_one_skeleton.png create mode 100644 src/Cech_complex/example/cech_complex_example_from_points.cpp create mode 100644 src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt delete mode 100644 src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp diff --git a/src/Cech_complex/doc/COPYRIGHT b/src/Cech_complex/doc/COPYRIGHT new file mode 100644 index 00000000..594b7d03 --- /dev/null +++ b/src/Cech_complex/doc/COPYRIGHT @@ -0,0 +1,19 @@ +The files of this directory are part of the Gudhi Library. The Gudhi library +(Geometric Understanding in Higher Dimensions) is a generic C++ library for +computational topology. + +Author(s): Clément Maria, Pawel Dlotko, Vincent Rouvreau + +Copyright (C) 2015 INRIA + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index e69de29b..f2052763 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -0,0 +1,92 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DOC_CECH_COMPLEX_INTRO_CECH_COMPLEX_H_ +#define DOC_CECH_COMPLEX_INTRO_CECH_COMPLEX_H_ + +namespace Gudhi { + +namespace cech_complex { + +/** \defgroup cech_complex Cech complex + * + * \author Clément Maria, Pawel Dlotko, Vincent Rouvreau + * + * @{ + * + * \section cechdefinition Cech complex definition + * + * Cech_complex + * (Wikipedia) is a + * proximity graph that allows to construct a + * simplicial complex + * from it. + * The input can be a point cloud with a given distance function. + * + * The filtration value of each edge is computed from a user-given distance function. + * + * All edges that have a filtration value strictly greater than a given threshold value are not inserted into + * the complex. + * + * When creating a simplicial complex from this proximity graph, Cech inserts the proximity graph into the data + * structure, and then expands the simplicial complex when required. + * + * Vertex name correspond to the index of the point in the given range (aka. the point cloud). + * + * \image html "cech_complex_representation.png" "Cech complex proximity graph representation" + * + * On this example, as edges (4,5), (4,6) and (5,6) are in the complex, simplex (4,5,6) is added with the filtration + * value set with \f$max(filtration(4,5), filtration(4,6), filtration(5,6))\f$. + * And so on for simplex (0,1,2,3). + * + * If the Cech_complex interfaces are not detailed enough for your need, please refer to + * + * cech_persistence_step_by_step.cpp example, where the graph construction over the Simplex_tree is more detailed. + * + * \section cechpointsdistance Point cloud and distance function + * + * \subsection cechpointscloudexample Example from a point cloud and a distance function + * + * This example builds the proximity graph from the given points, threshold value, and distance function. + * Then it creates a `Simplex_tree` with it. + * + * Then, it is asked to display information about the simplicial complex. + * + * \include Cech_complex/cech_complex_example_from_points.cpp + * + * When launching (Cech maximal distance between 2 points is 7.1, is expanded until dimension 2): + * + * \code $> ./Cech_complex_example_from_points + * \endcode + * + * the program output is: + * + * \include Cech_complex/cech_complex_example_from_points_for_doc.txt + * + */ +/** @} */ // end defgroup cech_complex + +} // namespace cech_complex + +} // namespace Gudhi + +#endif // DOC_CECH_COMPLEX_INTRO_CECH_COMPLEX_H_ diff --git a/src/Cech_complex/doc/cech_complex_representation.ipe b/src/Cech_complex/doc/cech_complex_representation.ipe new file mode 100644 index 00000000..7f6028f4 --- /dev/null +++ b/src/Cech_complex/doc/cech_complex_representation.ipe @@ -0,0 +1,326 @@ + + + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + +0.6 0 0 0.6 0 0 e + + + + + +0.5 0 0 0.5 0 0 e + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h + + + + + +-0.5 -0.5 m +0.5 -0.5 l +0.5 0.5 l +-0.5 0.5 l +h + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + + + +-0.43 -0.57 m +0.57 0.43 l +0.43 0.57 l +-0.57 -0.43 l +h + + +-0.43 0.57 m +0.57 -0.43 l +0.43 -0.57 l +-0.57 0.43 l +h + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +-1 0.333 m +0 0 l +-1 -0.333 l + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +109.771 601.912 m +159.595 601.797 l +140.058 541.915 l +h + + +79.8776 552.169 m +109.756 601.699 l +139.812 542.209 l +h + + +69.8453 682.419 m +159.925 712.208 l +90.12 732.039 l +h + +Rips complex +0 +1 +2 +3 +4 +5 +6 + +60 710 m +40 660 l + + +40 660 m +130 690 l + + +130 690 m +60 710 l + + +40 660 m +80 580 l + + +80 580 m +130 580 l +130 580 l + + +130 580 m +110 520 l + + +110 520 m +50 530 l +50 530 l +50 530 l + + +50 530 m +80 580 l + + +130 580 m +130 690 l + + + + + + + +150.038 609.9 m +179.929 549.727 l + + + + +158.7 593.269 m +81.4925 544.805 l + + +256.324 639.958 m +370.055 639.958 l + + +56.8567 0 0 56.8567 313.217 639.756 e + + + +Rips threshold + + diff --git a/src/Cech_complex/doc/cech_complex_representation.png b/src/Cech_complex/doc/cech_complex_representation.png new file mode 100644 index 00000000..e901d92e Binary files /dev/null and b/src/Cech_complex/doc/cech_complex_representation.png differ diff --git a/src/Cech_complex/doc/cech_one_skeleton.ipe b/src/Cech_complex/doc/cech_one_skeleton.ipe new file mode 100644 index 00000000..3a35970c --- /dev/null +++ b/src/Cech_complex/doc/cech_one_skeleton.ipe @@ -0,0 +1,326 @@ + + + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + +0.6 0 0 0.6 0 0 e + + + + + +0.5 0 0 0.5 0 0 e + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h + + + + + +-0.5 -0.5 m +0.5 -0.5 l +0.5 0.5 l +-0.5 0.5 l +h + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + + + +-0.43 -0.57 m +0.57 0.43 l +0.43 0.57 l +-0.57 -0.43 l +h + + +-0.43 0.57 m +0.57 -0.43 l +0.43 -0.57 l +-0.57 0.43 l +h + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +-1 0.333 m +0 0 l +-1 -0.333 l + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +109.771 601.912 m +159.595 601.797 l +140.058 541.915 l +h + + +79.8776 552.169 m +109.756 601.699 l +139.812 542.209 l +h + + +69.8453 682.419 m +159.925 712.208 l +90.12 732.039 l +h + +One skeleton graph +0 +1 +2 +3 +4 +5 +6 + +60 710 m +40 660 l + + +40 660 m +130 690 l + + +130 690 m +60 710 l + + +40 660 m +80 580 l + + +80 580 m +130 580 l +130 580 l + + +130 580 m +110 520 l + + +110 520 m +50 530 l +50 530 l +50 530 l + + +50 530 m +80 580 l + + +130 580 m +130 690 l + + + + + + + +150.038 609.9 m +179.929 549.727 l + + + + +158.7 593.269 m +81.4925 544.805 l + + +256.324 639.958 m +370.055 639.958 l + + +56.8567 0 0 56.8567 313.217 639.756 e + + + +Rips threshold + + diff --git a/src/Cech_complex/doc/cech_one_skeleton.png b/src/Cech_complex/doc/cech_one_skeleton.png new file mode 100644 index 00000000..1028770e Binary files /dev/null and b/src/Cech_complex/doc/cech_one_skeleton.png differ diff --git a/src/Cech_complex/example/CMakeLists.txt b/src/Cech_complex/example/CMakeLists.txt index 8097871f..ac32ff95 100644 --- a/src/Cech_complex/example/CMakeLists.txt +++ b/src/Cech_complex/example/CMakeLists.txt @@ -7,8 +7,8 @@ if (TBB_FOUND) target_link_libraries(Cech_complex_example_step_by_step ${TBB_LIBRARIES}) endif() -add_executable ( Cech_complex_example_one_skeleton_from_points example_one_skeleton_cech_from_points.cpp) +add_executable ( Cech_complex_example_from_points cech_complex_example_from_points.cpp) if (TBB_FOUND) - target_link_libraries(Cech_complex_example_one_skeleton_from_points ${TBB_LIBRARIES}) + target_link_libraries(Cech_complex_example_from_points ${TBB_LIBRARIES}) endif() -add_test(NAME Cech_complex_example_one_skeleton_from_points COMMAND $) +add_test(NAME Cech_complex_example_from_points COMMAND $) diff --git a/src/Cech_complex/example/cech_complex_example_from_points.cpp b/src/Cech_complex/example/cech_complex_example_from_points.cpp new file mode 100644 index 00000000..882849c3 --- /dev/null +++ b/src/Cech_complex/example/cech_complex_example_from_points.cpp @@ -0,0 +1,75 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +#include +#include +#include +#include + +int main() { + // Type definitions + using Point_cloud = std::vector>; + using Simplex_tree = Gudhi::Simplex_tree; + using Filtration_value = Simplex_tree::Filtration_value; + using Cech_complex = Gudhi::cech_complex::Cech_complex; + + Point_cloud points; + points.push_back({1.0, 1.0}); + points.push_back({7.0, 0.0}); + points.push_back({4.0, 6.0}); + points.push_back({9.0, 6.0}); + points.push_back({0.0, 14.0}); + points.push_back({2.0, 19.0}); + points.push_back({9.0, 17.0}); + + // ---------------------------------------------------------------------------- + // Init of a Cech complex from points + // ---------------------------------------------------------------------------- + // 7.1 is a magic number to force one blocker, and one non-blocker + Filtration_value threshold = 7.1; + Cech_complex cech_complex_from_points(points, threshold, Gudhi::Euclidean_distance()); + + Simplex_tree stree; + cech_complex_from_points.create_complex(stree, 2); + // ---------------------------------------------------------------------------- + // Display information about the one skeleton Cech complex + // ---------------------------------------------------------------------------- + std::cout << "Cech complex is of dimension " << stree.dimension() << + " - " << stree.num_simplices() << " simplices - " << + stree.num_vertices() << " vertices." << std::endl; + + std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << + std::endl; + for (auto f_simplex : stree.filtration_simplex_range()) { + std::cout << " ( "; + for (auto vertex : stree.simplex_vertex_range(f_simplex)) { + std::cout << vertex << " "; + } + std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] "; + std::cout << std::endl; + } + return 0; +} diff --git a/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt b/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt new file mode 100644 index 00000000..684e120b --- /dev/null +++ b/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt @@ -0,0 +1,16 @@ +Cech complex is of dimension 2 - 14 simplices - 7 vertices. +Iterator on Cech complex simplices in the filtration order, with [filtration value]: + ( 0 ) -> [0] + ( 1 ) -> [0] + ( 2 ) -> [0] + ( 3 ) -> [0] + ( 4 ) -> [0] + ( 5 ) -> [0] + ( 6 ) -> [0] + ( 3 2 ) -> [5] + ( 5 4 ) -> [5.38516] + ( 2 0 ) -> [5.83095] + ( 1 0 ) -> [6.08276] + ( 3 1 ) -> [6.32456] + ( 2 1 ) -> [6.7082] + ( 3 2 1 ) -> [7.07107] diff --git a/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp b/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp deleted file mode 100644 index 73679716..00000000 --- a/src/Cech_complex/example/example_one_skeleton_cech_from_points.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* This file is part of the Gudhi Library. The Gudhi library - * (Geometric Understanding in Higher Dimensions) is a generic C++ - * library for computational topology. - * - * Author(s): Vincent Rouvreau - * - * Copyright (C) 2018 Inria - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include - -#include -#include -#include -#include -#include // for std::numeric_limits - -int main() { - // Type definitions - using Point_cloud = std::vector>; - using Simplex_tree = Gudhi::Simplex_tree; - using Filtration_value = Simplex_tree::Filtration_value; - using Cech_complex = Gudhi::cech_complex::Cech_complex; - - Point_cloud points; - points.push_back({1.0, 1.0}); - points.push_back({7.0, 0.0}); - points.push_back({4.0, 6.0}); - points.push_back({9.0, 6.0}); - points.push_back({0.0, 14.0}); - points.push_back({2.0, 19.0}); - points.push_back({9.0, 17.0}); - - // ---------------------------------------------------------------------------- - // Init of a Rips complex from points - // ---------------------------------------------------------------------------- - Filtration_value threshold = 12.0; - Cech_complex cech_complex_from_points(points, threshold, Gudhi::Euclidean_distance()); - - Simplex_tree stree; - cech_complex_from_points.create_complex(stree, 3); - // ---------------------------------------------------------------------------- - // Display information about the one skeleton Rips complex - // ---------------------------------------------------------------------------- - std::cout << "Cech complex is of dimension " << stree.dimension() << - " - " << stree.num_simplices() << " simplices - " << - stree.num_vertices() << " vertices." << std::endl; - - std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << - std::endl; - for (auto f_simplex : stree.filtration_simplex_range()) { - std::cout << " ( "; - for (auto vertex : stree.simplex_vertex_range(f_simplex)) { - std::cout << vertex << " "; - } - std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] "; - std::cout << std::endl; - } - return 0; -} diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index f8738be0..fb52f712 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -80,12 +80,12 @@ class Cech_blocker { #endif // DEBUG_TRACES } Min_sphere ms(cc_ptr_->dimension(), points.begin(),points.end()); - Filtration_value radius = std::sqrt(ms.squared_radius()); + Filtration_value diameter = 2 * std::sqrt(ms.squared_radius()); #ifdef DEBUG_TRACES - std::cout << "radius = " << radius << " - " << (radius > cc_ptr_->threshold()) << std::endl; + std::cout << "diameter = " << diameter << " - " << (diameter > cc_ptr_->threshold()) << std::endl; #endif // DEBUG_TRACES - simplicial_complex_.assign_filtration(sh, radius); - return (radius > cc_ptr_->threshold()); + simplicial_complex_.assign_filtration(sh, diameter); + return (diameter > cc_ptr_->threshold()); } /** \internal \brief Cech complex blocker constructor. */ -- cgit v1.2.3 From 3cd1e01f0b0d4fdb46f49ec640c389374ca2fe70 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Feb 2018 23:16:55 +0000 Subject: Fix Cech with radius distance Add a meta generation script for off_file_generator git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3256 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: fb13baa124ddc97c0dc61835ab0c72595d666155 --- scripts/metagen.sh | 15 ++ src/Cech_complex/benchmark/CMakeLists.txt | 12 ++ .../benchmark/cech_complex_benchmark.cpp | 153 +++++++++++++++++++++ src/Cech_complex/doc/cech_one_skeleton.png | Bin 47651 -> 12070 bytes .../example/cech_complex_example_from_points.cpp | 43 ++---- .../example/cech_complex_step_by_step.cpp | 32 ++--- src/Cech_complex/include/gudhi/Cech_complex.h | 33 ++--- .../include/gudhi/Cech_complex_blocker.h | 19 +-- src/Cech_complex/test/test_cech_complex.cpp | 38 ++--- src/Cech_complex/utilities/CMakeLists.txt | 2 +- src/Cech_complex/utilities/cech_persistence.cpp | 14 +- src/common/include/gudhi/distance_functions.h | 33 +++++ 12 files changed, 284 insertions(+), 110 deletions(-) create mode 100755 scripts/metagen.sh create mode 100644 src/Cech_complex/benchmark/CMakeLists.txt create mode 100644 src/Cech_complex/benchmark/cech_complex_benchmark.cpp diff --git a/scripts/metagen.sh b/scripts/metagen.sh new file mode 100755 index 00000000..4483d24e --- /dev/null +++ b/scripts/metagen.sh @@ -0,0 +1,15 @@ +#!/bin/bash +sep="_" +for geom in "sphere" "klein" "torus" +do + for number in 10 100 1000 + do + for dim in {3..5} + do + echo "./off_file_from_shape_generator on $geom $geom$sep$number$sep$dim.off $number $dim" + ./off_file_from_shape_generator on $geom $geom$sep$number$sep$dim.off $number $dim + done + done +done + +#./off_file_from_shape_generator in|on sphere|cube off_file_name points_number[integer > 0] dimension[integer > 1] radius[double > 0.0 | default = 1.0] diff --git a/src/Cech_complex/benchmark/CMakeLists.txt b/src/Cech_complex/benchmark/CMakeLists.txt new file mode 100644 index 00000000..2a65865b --- /dev/null +++ b/src/Cech_complex/benchmark/CMakeLists.txt @@ -0,0 +1,12 @@ +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_LIBRARY}) + +if (TBB_FOUND) + target_link_libraries(cech_complex_benchmark ${TBB_LIBRARIES}) +endif() diff --git a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp new file mode 100644 index 00000000..71c88982 --- /dev/null +++ b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp @@ -0,0 +1,153 @@ +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. + * + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2018 Inria + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations + +#include +#include + + +// Types definition +using Simplex_tree = Gudhi::Simplex_tree<>; +using Filtration_value = Simplex_tree::Filtration_value; +using Point = std::vector; +using Point_cloud = std::vector; +using Points_off_reader = Gudhi::Points_off_reader; +using Proximity_graph = Gudhi::Proximity_graph; +using Rips_complex = Gudhi::rips_complex::Rips_complex; +using Cech_complex = Gudhi::cech_complex::Cech_complex; + + +class Radius_distance { + public: + // boost::range_value is not SFINAE-friendly so we cannot use it in the return type + template< typename Point > + typename std::iterator_traits::type>::value_type + operator()(const Point& p1, const Point& p2) const { + // Type def + using Point_cloud = std::vector; + using Point_iterator = typename Point_cloud::const_iterator; + using Coordinate_iterator = typename Point::const_iterator; + using Min_sphere = typename Miniball::Miniball>; + + Point_cloud point_cloud; + point_cloud.push_back(p1); + point_cloud.push_back(p2); + + GUDHI_CHECK((p1.end()-p1.begin()) != (p2.end()-p2.begin()), "inconsistent point dimensions"); + Min_sphere min_sphere(p1.end()-p1.begin(), point_cloud.begin(),point_cloud.end()); + + return std::sqrt(min_sphere.squared_radius()); + } +}; + + +int main(int argc, char * argv[]) { + std::string off_file_points = "tore3D_1307.off"; + Filtration_value threshold = 1e20; + + // Extract the points from the file filepoints + Points_off_reader off_reader(off_file_points); + + Gudhi::Clock euclidean_clock("Gudhi::Euclidean_distance"); + // Compute the proximity graph of the points + Proximity_graph euclidean_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Gudhi::Euclidean_distance()); + + std::cout << euclidean_clock << std::endl; + + Gudhi::Clock radius_clock("Radius_distance"); + // Compute the proximity graph of the points + Proximity_graph radius_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Radius_distance()); + std::cout << radius_clock << std::endl; + + Gudhi::Clock squared_radius_clock("Gudhi::Radius_distance()"); + // Compute the proximity graph of the points + Proximity_graph sq_radius_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Gudhi::Radius_distance()); + std::cout << squared_radius_clock << std::endl; + + + boost::filesystem::path full_path(boost::filesystem::current_path()); + std::cout << "Current path is : " << full_path << std::endl; + + + std::cout << "File name;Radius;Rips time;Cech time; Ratio Rips/Cech time;Rips nb simplices;Cech nb simplices;" << std::endl; + boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end + for ( boost::filesystem::directory_iterator itr( boost::filesystem::current_path() ); + itr != end_itr; + ++itr ) + { + if ( ! boost::filesystem::is_directory(itr->status()) ) + { + if ( itr->path().extension() == ".off" ) // see below + { + Points_off_reader off_reader(itr->path().string()); + + for (Filtration_value radius = 0.1; radius < 0.4; radius += 0.1) { + std::cout << itr->path().stem() << ";"; + std::cout << radius << ";"; + Gudhi::Clock rips_clock("Rips computation"); + Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), radius, Gudhi::Radius_distance()); + Simplex_tree rips_stree; + rips_complex_from_points.create_complex(rips_stree, 2); + // ------------------------------------------ + // Display information about the Rips complex + // ------------------------------------------ + double rips_sec = rips_clock.num_seconds(); + std::cout << rips_sec << ";"; + + Gudhi::Clock cech_clock("Cech computation"); + Cech_complex cech_complex_from_points(off_reader.get_point_cloud(), radius); + Simplex_tree cech_stree; + cech_complex_from_points.create_complex(cech_stree, 2); + // ------------------------------------------ + // Display information about the Cech complex + // ------------------------------------------ + double cech_sec = cech_clock.num_seconds(); + std::cout << cech_sec << ";"; + std::cout << cech_sec / rips_sec << ";"; + + std::cout << rips_stree.num_simplices() << ";"; + std::cout << cech_stree.num_simplices() << ";" << std::endl; + } + } + } + } + + + return 0; +} diff --git a/src/Cech_complex/doc/cech_one_skeleton.png b/src/Cech_complex/doc/cech_one_skeleton.png index 1028770e..ffa9c329 100644 Binary files a/src/Cech_complex/doc/cech_one_skeleton.png and b/src/Cech_complex/doc/cech_one_skeleton.png differ diff --git a/src/Cech_complex/example/cech_complex_example_from_points.cpp b/src/Cech_complex/example/cech_complex_example_from_points.cpp index 882849c3..97327e69 100644 --- a/src/Cech_complex/example/cech_complex_example_from_points.cpp +++ b/src/Cech_complex/example/cech_complex_example_from_points.cpp @@ -1,25 +1,3 @@ -/* This file is part of the Gudhi Library. The Gudhi library - * (Geometric Understanding in Higher Dimensions) is a generic C++ - * library for computational topology. - * - * Author(s): Vincent Rouvreau - * - * Copyright (C) 2018 Inria - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - #include #include #include @@ -37,23 +15,22 @@ int main() { using Cech_complex = Gudhi::cech_complex::Cech_complex; Point_cloud points; - points.push_back({1.0, 1.0}); - points.push_back({7.0, 0.0}); - points.push_back({4.0, 6.0}); - points.push_back({9.0, 6.0}); - points.push_back({0.0, 14.0}); - points.push_back({2.0, 19.0}); - points.push_back({9.0, 17.0}); + points.push_back({0., 0.}); + points.push_back({0., 2.}); + points.push_back({std::sqrt(3.), 1.}); + points.push_back({1., 0.}); + points.push_back({1., 2.}); + points.push_back({1. - std::sqrt(3.), 1.}); // ---------------------------------------------------------------------------- // Init of a Cech complex from points // ---------------------------------------------------------------------------- - // 7.1 is a magic number to force one blocker, and one non-blocker - Filtration_value threshold = 7.1; - Cech_complex cech_complex_from_points(points, threshold, Gudhi::Euclidean_distance()); + // 5. is a magic number to force one blocker, and one non-blocker + Filtration_value max_radius = 12.; + Cech_complex cech_complex_from_points(points, max_radius); Simplex_tree stree; - cech_complex_from_points.create_complex(stree, 2); + cech_complex_from_points.create_complex(stree, -1); // ---------------------------------------------------------------------------- // Display information about the one skeleton Cech complex // ---------------------------------------------------------------------------- diff --git a/src/Cech_complex/example/cech_complex_step_by_step.cpp b/src/Cech_complex/example/cech_complex_step_by_step.cpp index e71086b6..8705a3e5 100644 --- a/src/Cech_complex/example/cech_complex_step_by_step.cpp +++ b/src/Cech_complex/example/cech_complex_step_by_step.cpp @@ -65,23 +65,22 @@ class Cech_blocker { std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES } - Min_sphere ms(dimension_, points.begin(),points.end()); - Filtration_value radius = std::sqrt(ms.squared_radius()); + Filtration_value radius = Gudhi::Radius_distance()(points); #ifdef DEBUG_TRACES - std::cout << "radius = " << radius << " - " << (radius > threshold_) << std::endl; + std::cout << "radius = " << radius << " - " << (radius > max_radius_) << std::endl; #endif // DEBUG_TRACES simplex_tree_.assign_filtration(sh, radius); - return (radius > threshold_); + return (radius > max_radius_); } - Cech_blocker(Simplex_tree& simplex_tree, Filtration_value threshold, const std::vector& point_cloud) + Cech_blocker(Simplex_tree& simplex_tree, Filtration_value max_radius, const std::vector& point_cloud) : simplex_tree_(simplex_tree), - threshold_(threshold), + max_radius_(max_radius), point_cloud_(point_cloud) { dimension_ = point_cloud_[0].size(); } private: Simplex_tree simplex_tree_; - Filtration_value threshold_; + Filtration_value max_radius_; std::vector point_cloud_; int dimension_; }; @@ -89,31 +88,31 @@ class Cech_blocker { void program_options(int argc, char * argv[] , std::string & off_file_points - , Filtration_value & threshold + , Filtration_value & max_radius , int & dim_max); int main(int argc, char * argv[]) { std::string off_file_points; - Filtration_value threshold; + Filtration_value max_radius; int dim_max; - program_options(argc, argv, off_file_points, threshold, dim_max); + program_options(argc, argv, off_file_points, max_radius, dim_max); // Extract the points from the file filepoints Points_off_reader off_reader(off_file_points); // Compute the proximity graph of the points Proximity_graph prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Gudhi::Euclidean_distance()); + max_radius, + Gudhi::Radius_distance()); // Construct the Rips complex in a Simplex Tree Simplex_tree st; // insert the proximity graph in the simplex tree st.insert_graph(prox_graph); // expand the graph until dimension dim_max - st.expansion_with_blockers(dim_max, Cech_blocker(st, threshold, off_reader.get_point_cloud())); + st.expansion_with_blockers(dim_max, Cech_blocker(st, max_radius, off_reader.get_point_cloud())); std::cout << "The complex contains " << st.num_simplices() << " simplices \n"; std::cout << " and has dimension " << st.dimension() << " \n"; @@ -123,7 +122,6 @@ int main(int argc, char * argv[]) { #if DEBUG_TRACES std::cout << "********************************************************************\n"; - // Display the Simplex_tree - Can not be done in the middle of 2 inserts std::cout << "* The complex contains " << st.num_simplices() << " simplices - dimension=" << st.dimension() << "\n"; std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n"; for (auto f_simplex : st.filtration_simplex_range()) { @@ -140,7 +138,7 @@ int main(int argc, char * argv[]) { void program_options(int argc, char * argv[] , std::string & off_file_points - , Filtration_value & threshold + , Filtration_value & max_radius , int & dim_max) { namespace po = boost::program_options; po::options_description hidden("Hidden options"); @@ -151,8 +149,8 @@ void program_options(int argc, char * argv[] po::options_description visible("Allowed options", 100); visible.add_options() ("help,h", "produce help message") - ("max-edge-length,r", - po::value(&threshold)->default_value(std::numeric_limits::infinity()), + ("max-radius,r", + po::value(&max_radius)->default_value(std::numeric_limits::infinity()), "Maximal length of an edge for the Rips complex construction.") ("cpx-dimension,d", po::value(&dim_max)->default_value(1), "Maximal dimension of the Rips complex we want to compute."); diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index e847c97f..a50ed9fa 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -23,12 +23,12 @@ #ifndef CECH_COMPLEX_H_ #define CECH_COMPLEX_H_ +#include // for Gudhi::Squared_radius #include // for Gudhi::Proximity_graph #include // for GUDHI_CHECK #include // for Gudhi::cech_complex::Cech_blocker #include -#include // for std::size_t #include // for exception management namespace Gudhi { @@ -43,7 +43,7 @@ namespace cech_complex { * * \details * The data structure is a proximity graph, containing edges when the edge length is less or equal - * to a given threshold. Edge length is computed from a user given point cloud with a given distance function. + * to a given max_radius. Edge length is computed from `Gudhi::Squared_radius` distance function. * * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. @@ -62,23 +62,18 @@ class Cech_complex { /** \brief Cech_complex constructor from a list of points. * * @param[in] points Range of points. - * @param[in] threshold Rips value. - * @param[in] distance distance function that returns a `Filtration_value` from 2 given points. + * @param[in] max_radius Maximal radius value. * * \tparam ForwardPointRange must be a range for which `.size()`, `.begin()` and `.end()` methods return input * iterators on a point. `.begin()` and `.end()` methods are required for a point. * - * \tparam Distance furnishes `operator()(const Point& p1, const Point& p2)`, where - * `Point` is a point from the `ForwardPointRange`, and that returns a `Filtration_value`. */ - template - Cech_complex(const ForwardPointRange& points, Filtration_value threshold, Distance distance) - : threshold_(threshold), + Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) + : max_radius_(max_radius), point_cloud_(points) { - dimension_ = points.begin()->end() - points.begin()->begin(); cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, - threshold_, - distance); + max_radius_, + Gudhi::Radius_distance()); } /** \brief Initializes the simplicial complex from the proximity graph and expands it until a given maximal @@ -101,14 +96,9 @@ class Cech_complex { Cech_blocker(complex, this)); } - /** @return Threshold value given at construction. */ - Filtration_value threshold() const { - return threshold_; - } - - /** @return Dimension value given at construction by the first point dimension. */ - std::size_t dimension() const { - return dimension_; + /** @return max_radius value given at construction. */ + Filtration_value max_radius() const { + return max_radius_; } /** @param[in] vertex Point position in the range. @@ -123,9 +113,8 @@ class Cech_complex { private: Proximity_graph cech_skeleton_graph_; - Filtration_value threshold_; + Filtration_value max_radius_; ForwardPointRange point_cloud_; - std::size_t dimension_; }; } // namespace cech_complex diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index fb52f712..d718b56e 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -23,9 +23,8 @@ #ifndef CECH_COMPLEX_BLOCKER_H_ #define CECH_COMPLEX_BLOCKER_H_ -#include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex - -#include +#include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex +#include // for Gudhi::Squared_radius #include #include @@ -58,9 +57,6 @@ class Cech_blocker { private: using Point = std::vector; using Point_cloud = std::vector; - using Point_iterator = Point_cloud::const_iterator; - using Coordinate_iterator = Point::const_iterator; - using Min_sphere = Miniball::Miniball>; using Simplex_handle = typename SimplicialComplexForCech::Simplex_handle; using Filtration_value = typename SimplicialComplexForCech::Filtration_value; using Cech_complex = Gudhi::cech_complex::Cech_complex; @@ -69,7 +65,7 @@ class Cech_blocker { /** \internal \brief Cech complex blocker operator() - the oracle - assigns the filtration value from the simplex * radius and returns if the simplex expansion must be blocked. * \param[in] sh The Simplex_handle. - * \return true if the simplex radius is greater than the Cech_complex threshold*/ + * \return true if the simplex radius is greater than the Cech_complex max_radius*/ bool operator()(Simplex_handle sh) { Point_cloud points; for (auto vertex : simplicial_complex_.simplex_vertex_range(sh)) { @@ -79,13 +75,12 @@ class Cech_blocker { std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES } - Min_sphere ms(cc_ptr_->dimension(), points.begin(),points.end()); - Filtration_value diameter = 2 * std::sqrt(ms.squared_radius()); + Filtration_value squared_radius = Gudhi::Radius_distance()(points); #ifdef DEBUG_TRACES - std::cout << "diameter = " << diameter << " - " << (diameter > cc_ptr_->threshold()) << std::endl; + std::cout << "squared_radius = " << squared_radius << " - " << (squared_radius > cc_ptr_->max_radius()) << std::endl; #endif // DEBUG_TRACES - simplicial_complex_.assign_filtration(sh, diameter); - return (diameter > cc_ptr_->threshold()); + simplicial_complex_.assign_filtration(sh, squared_radius); + return (squared_radius > cc_ptr_->max_radius()); } /** \internal \brief Cech complex blocker constructor. */ diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index aa42d322..626f1d82 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -58,14 +58,15 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { // // ---------------------------------------------------------------------------- std::string off_file_name("alphacomplexdoc.off"); - double threshold = 12.0; - std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech threshold=" << - threshold << "==========" << std::endl; + double max_radius = 12.0; + std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech max_radius=" << + max_radius << "==========" << std::endl; Points_off_reader off_reader(off_file_name); Point_cloud point_cloud = off_reader.get_point_cloud(); - Cech_complex cech_complex_from_file(point_cloud, threshold, Gudhi::Euclidean_distance()); + Cech_complex cech_complex_from_file(point_cloud, max_radius); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cech_complex_from_file.max_radius(), max_radius); std::size_t i = 0; for (; i < point_cloud.size(); i++) { BOOST_CHECK(point_cloud[i] == *(cech_complex_from_file.point_iterator(i))); @@ -101,10 +102,10 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { std::cout << vertex << ","; vp.push_back(off_reader.get_point_cloud().at(vertex)); } - std::cout << ") - distance =" << Gudhi::Euclidean_distance()(vp.at(0), vp.at(1)) << + std::cout << ") - distance =" << Gudhi::Radius_distance()(vp.at(0), vp.at(1)) << " - filtration =" << st.filtration(f_simplex) << std::endl; BOOST_CHECK(vp.size() == 2); - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Euclidean_distance()(vp.at(0), vp.at(1))); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Radius_distance()(vp.at(0), vp.at(1))); } } @@ -125,7 +126,8 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { points012.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), cech_complex_from_file.point_iterator(vertex)->end())); } - Min_sphere ms012(cech_complex_from_file.dimension(), points012.begin(),points012.end()); + std::size_t dimension = point_cloud[0].end() - point_cloud[0].begin(); + Min_sphere ms012(dimension, points012.begin(),points012.end()); Simplex_tree::Filtration_value f012 = st2.filtration(st2.find({0, 1, 2})); std::cout << "f012= " << f012 << " | ms012_radius= " << std::sqrt(ms012.squared_radius()) << std::endl; @@ -137,7 +139,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { points456.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), cech_complex_from_file.point_iterator(vertex)->end())); } - Min_sphere ms456(cech_complex_from_file.dimension(), points456.begin(),points456.end()); + Min_sphere ms456(dimension, points456.begin(),points456.end()); Simplex_tree::Filtration_value f456 = st2.filtration(st2.find({4, 5, 6})); std::cout << "f456= " << f456 << " | ms456_radius= " << std::sqrt(ms456.squared_radius()) << std::endl; @@ -161,7 +163,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { points0123.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), cech_complex_from_file.point_iterator(vertex)->end())); } - Min_sphere ms0123(cech_complex_from_file.dimension(), points0123.begin(),points0123.end()); + Min_sphere ms0123(dimension, points0123.begin(),points0123.end()); Simplex_tree::Filtration_value f0123 = st3.filtration(st3.find({0, 1, 2, 3})); std::cout << "f0123= " << f0123 << " | ms0123_radius= " << std::sqrt(ms0123.squared_radius()) << std::endl; @@ -175,7 +177,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { points01.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), cech_complex_from_file.point_iterator(vertex)->end())); } - Min_sphere ms01(cech_complex_from_file.dimension(), points01.begin(),points01.end()); + Min_sphere ms01(dimension, points01.begin(),points01.end()); Simplex_tree::Filtration_value f01 = st2.filtration(st2.find({0, 1})); std::cout << "f01= " << f01 << " | ms01_radius= " << std::sqrt(ms01.squared_radius()) << std::endl; @@ -199,7 +201,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { // ---------------------------------------------------------------------------- // Init of a Cech complex from the list of points // ---------------------------------------------------------------------------- - Cech_complex cech_complex_from_points(points, 2.0, Gudhi::Euclidean_distance()); + Cech_complex cech_complex_from_points(points, 2.0); std::cout << "========== cech_complex_from_points ==========" << std::endl; Simplex_tree st; @@ -234,13 +236,13 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.0); break; case 1: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 1.41421, .00001); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.5); break; case 2: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.816497, .00001); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.666667, .00001); break; case 3: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.866025, .00001); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.75); break; default: BOOST_CHECK(false); // Shall not happen @@ -257,12 +259,12 @@ BOOST_AUTO_TEST_CASE(Cech_create_complex_throw) { // // ---------------------------------------------------------------------------- std::string off_file_name("alphacomplexdoc.off"); - double threshold = 12.0; - std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech threshold=" << - threshold << "==========" << std::endl; + double max_radius = 12.0; + std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech max_radius=" << + max_radius << "==========" << std::endl; Gudhi::Points_off_reader off_reader(off_file_name); - Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance()); + Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), max_radius); Simplex_tree stree; std::vector simplex = {0, 1, 2}; diff --git a/src/Cech_complex/utilities/CMakeLists.txt b/src/Cech_complex/utilities/CMakeLists.txt index a4f89d2c..30b99729 100644 --- a/src/Cech_complex/utilities/CMakeLists.txt +++ b/src/Cech_complex/utilities/CMakeLists.txt @@ -9,6 +9,6 @@ if (TBB_FOUND) endif() add_test(NAME Cech_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") + "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3") install(TARGETS cech_persistence DESTINATION bin) diff --git a/src/Cech_complex/utilities/cech_persistence.cpp b/src/Cech_complex/utilities/cech_persistence.cpp index e93596d4..93a200ff 100644 --- a/src/Cech_complex/utilities/cech_persistence.cpp +++ b/src/Cech_complex/utilities/cech_persistence.cpp @@ -43,20 +43,20 @@ using Field_Zp = Gudhi::persistent_cohomology::Field_Zp; using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology; void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag, - Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence); + Filtration_value& max_radius, int& dim_max, int& p, Filtration_value& min_persistence); int main(int argc, char* argv[]) { std::string off_file_points; std::string filediag; - Filtration_value threshold; + Filtration_value max_radius; int dim_max; int p; Filtration_value min_persistence; - program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence); + program_options(argc, argv, off_file_points, filediag, max_radius, dim_max, p, min_persistence); Points_off_reader off_reader(off_file_points); - Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance()); + Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), max_radius); // Construct the Cech complex in a Simplex Tree Simplex_tree simplex_tree; @@ -88,7 +88,7 @@ int main(int argc, char* argv[]) { } void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag, - Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) { + Filtration_value& max_radius, int& dim_max, int& p, Filtration_value& min_persistence) { namespace po = boost::program_options; po::options_description hidden("Hidden options"); hidden.add_options()("input-file", po::value(&off_file_points), @@ -98,8 +98,8 @@ void program_options(int argc, char* argv[], std::string& off_file_points, std:: visible.add_options()("help,h", "produce help message")( "output-file,o", po::value(&filediag)->default_value(std::string()), "Name of file in which the persistence diagram is written. Default print in std::cout")( - "max-edge-length,r", - po::value(&threshold)->default_value(std::numeric_limits::infinity()), + "max-radius,r", + po::value(&max_radius)->default_value(std::numeric_limits::infinity()), "Maximal length of an edge for the Cech complex construction.")( "cpx-dimension,d", po::value(&dim_max)->default_value(1), "Maximal dimension of the Cech complex we want to compute.")( diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 3a5d1fd5..3ce51ad1 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -25,6 +25,8 @@ #include +#include + #include #include // for std::sqrt @@ -68,6 +70,37 @@ class Euclidean_distance { } }; +/** @brief Compute the squared radius between Points given by a range of coordinates. The points are assumed to + * have the same dimension. */ +class Radius_distance { + public: + // boost::range_value is not SFINAE-friendly so we cannot use it in the return type + template< typename Point > + typename std::iterator_traits::type>::value_type + operator()(const Point& p1, const Point& p2) const { + return Euclidean_distance()(p1, p2) / 2.; + } + // boost::range_value is not SFINAE-friendly so we cannot use it in the return type + template< typename Point_cloud, + typename Point_iterator = typename boost::range_const_iterator::type, + typename Point= typename std::iterator_traits::value_type, + typename Coordinate_iterator = typename boost::range_const_iterator::type, + typename Coordinate = typename std::iterator_traits::value_type> + Coordinate + operator()(const Point_cloud& point_cloud) const { + using Min_sphere = Miniball::Miniball>; + + //Min_sphere ms(point_cloud.begin()->end() - point_cloud.begin()->begin(), point_cloud.begin(),point_cloud.end()); + Min_sphere ms(point_cloud.end() - point_cloud.begin(), point_cloud.begin(),point_cloud.end()); +#ifdef DEBUG_TRACES + std::cout << "Radius on " << point_cloud.end() - point_cloud.begin() << " points = " + << std::sqrt(ms.squared_radius()) << std::endl; +#endif // DEBUG_TRACES + + return std::sqrt(ms.squared_radius()); + } +}; + } // namespace Gudhi #endif // DISTANCE_FUNCTIONS_H_ -- cgit v1.2.3 From b3a64294af818c977804c4b67a317782d872e2b5 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 5 Mar 2018 13:38:57 +0000 Subject: Fix doc and tests git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3262 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: c76eb981f5960938221aa2498cb87b0707391733 --- .../benchmark/cech_complex_benchmark.cpp | 10 +- src/Cech_complex/doc/Intro_cech_complex.h | 52 ++++--- .../doc/cech_complex_representation.ipe | 160 +++++++++++---------- .../doc/cech_complex_representation.png | Bin 15677 -> 54399 bytes src/Cech_complex/doc/cech_one_skeleton.ipe | 154 +++++++++----------- src/Cech_complex/doc/cech_one_skeleton.png | Bin 12070 -> 29354 bytes .../example/cech_complex_example_from_points.cpp | 22 +-- .../cech_complex_example_from_points_for_doc.txt | 45 ++++-- src/Cech_complex/include/gudhi/Cech_complex.h | 4 +- .../include/gudhi/Cech_complex_blocker.h | 11 +- src/Cech_complex/test/test_cech_complex.cpp | 12 +- src/Doxyfile | 3 +- src/common/include/gudhi/distance_functions.h | 8 +- 13 files changed, 255 insertions(+), 226 deletions(-) diff --git a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp index 71c88982..83ef9dca 100644 --- a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp +++ b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp @@ -93,12 +93,12 @@ int main(int argc, char * argv[]) { Radius_distance()); std::cout << radius_clock << std::endl; - Gudhi::Clock squared_radius_clock("Gudhi::Radius_distance()"); + Gudhi::Clock common_radius_clock("Gudhi::Radius_distance()"); // Compute the proximity graph of the points Proximity_graph sq_radius_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), threshold, Gudhi::Radius_distance()); - std::cout << squared_radius_clock << std::endl; + std::cout << common_radius_clock << std::endl; boost::filesystem::path full_path(boost::filesystem::current_path()); @@ -116,6 +116,7 @@ int main(int argc, char * argv[]) { if ( itr->path().extension() == ".off" ) // see below { Points_off_reader off_reader(itr->path().string()); + Point p0 = off_reader.get_point_cloud()[0]; for (Filtration_value radius = 0.1; radius < 0.4; radius += 0.1) { std::cout << itr->path().stem() << ";"; @@ -123,7 +124,7 @@ int main(int argc, char * argv[]) { Gudhi::Clock rips_clock("Rips computation"); Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), radius, Gudhi::Radius_distance()); Simplex_tree rips_stree; - rips_complex_from_points.create_complex(rips_stree, 2); + rips_complex_from_points.create_complex(rips_stree, p0.size() - 1); // ------------------------------------------ // Display information about the Rips complex // ------------------------------------------ @@ -133,7 +134,7 @@ int main(int argc, char * argv[]) { Gudhi::Clock cech_clock("Cech computation"); Cech_complex cech_complex_from_points(off_reader.get_point_cloud(), radius); Simplex_tree cech_stree; - cech_complex_from_points.create_complex(cech_stree, 2); + cech_complex_from_points.create_complex(cech_stree, p0.size() - 1); // ------------------------------------------ // Display information about the Cech complex // ------------------------------------------ @@ -141,6 +142,7 @@ int main(int argc, char * argv[]) { std::cout << cech_sec << ";"; std::cout << cech_sec / rips_sec << ";"; + assert(rips_stree.num_simplices() >= cech_stree.num_simplices()); std::cout << rips_stree.num_simplices() << ";"; std::cout << cech_stree.num_simplices() << ";" << std::endl; } diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index f2052763..8b6c7851 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -29,7 +29,7 @@ namespace cech_complex { /** \defgroup cech_complex Cech complex * - * \author Clément Maria, Pawel Dlotko, Vincent Rouvreau + * \author Vincent Rouvreau * * @{ * @@ -40,40 +40,54 @@ namespace cech_complex { * proximity graph that allows to construct a * simplicial complex * from it. - * The input can be a point cloud with a given distance function. + * The input shall be a point cloud in an Euclidean space. * - * The filtration value of each edge is computed from a user-given distance function. + * The filtration value of each edge of the `Gudhi::Proximity_graph` is computed from `Gudhi::Radius_distance` function. * - * All edges that have a filtration value strictly greater than a given threshold value are not inserted into - * the complex. + * All edges that have a filtration value strictly greater than a user given maximal radius value, \f$max\_radius\f$, + * are not inserted into the complex. * - * When creating a simplicial complex from this proximity graph, Cech inserts the proximity graph into the data - * structure, and then expands the simplicial complex when required. - * * Vertex name correspond to the index of the point in the given range (aka. the point cloud). * - * \image html "cech_complex_representation.png" "Cech complex proximity graph representation" - * - * On this example, as edges (4,5), (4,6) and (5,6) are in the complex, simplex (4,5,6) is added with the filtration - * value set with \f$max(filtration(4,5), filtration(4,6), filtration(5,6))\f$. - * And so on for simplex (0,1,2,3). + * \image html "cech_one_skeleton.png" "Cech complex proximity graph representation" * + * When creating a simplicial complex from this proximity graph, Cech inserts the proximity graph into the simplicial + * complex data structure, and then expands the simplicial complex when required. + * + * On this example, as edges \f$(x,y)\f$, \f$(y,z)\f$ and \f$(z,y)\f$ are in the complex, the minimal ball radius + * containing the points \f$(x,y,z)\f$ is computed. + * + * \f$(x,y,z)\f$ is inserted to the simplicial complex with the filtration value set with + * \f$mini\_ball\_radius(x,y,z))\f$ iff \f$mini\_ball\_radius(x,y,z)) \leq max\_radius\f$. + * + * And so on for higher dimensions. + * + * \image html "cech_complex_representation.png" "Cech complex expansion" + * + * The minimal ball radius computation is insured by + * + * the miniball software (V3.0) - Smallest Enclosing Balls of Points - and distributed with GUDHI. + * + * Please refer to + * + * the miniball software design description for more information about this computation. + * * If the Cech_complex interfaces are not detailed enough for your need, please refer to - * - * cech_persistence_step_by_step.cpp example, where the graph construction over the Simplex_tree is more detailed. + * + * cech_complex_step_by_step.cpp example, where the graph construction over the Simplex_tree is more detailed. * - * \section cechpointsdistance Point cloud and distance function + * \section cechpointsdistance Point cloud * - * \subsection cechpointscloudexample Example from a point cloud and a distance function + * \subsection cechpointscloudexample Example from a point cloud * - * This example builds the proximity graph from the given points, threshold value, and distance function. + * This example builds the proximity graph from the given points, and maximal radius values. * Then it creates a `Simplex_tree` with it. * * Then, it is asked to display information about the simplicial complex. * * \include Cech_complex/cech_complex_example_from_points.cpp * - * When launching (Cech maximal distance between 2 points is 7.1, is expanded until dimension 2): + * When launching (Cech maximal distance between 2 points is 1., is expanded until dimension 2): * * \code $> ./Cech_complex_example_from_points * \endcode diff --git a/src/Cech_complex/doc/cech_complex_representation.ipe b/src/Cech_complex/doc/cech_complex_representation.ipe index 7f6028f4..c64d7596 100644 --- a/src/Cech_complex/doc/cech_complex_representation.ipe +++ b/src/Cech_complex/doc/cech_complex_representation.ipe @@ -1,7 +1,7 @@ - + @@ -232,95 +232,99 @@ h - -109.771 601.912 m -159.595 601.797 l -140.058 541.915 l + +48 640 m +80 672 l +48 672 l h - -79.8776 552.169 m -109.756 601.699 l -139.812 542.209 l +Cech complex +0 +1 +2 +3 +4 +5 +6 + + + + + + + + + + + + + +32 0 0 32 304 672 e + + +304 672 m +336 672 l + +Maximal radius +7 +8 +9 + +112 576 m +144 608 l + + +144 672 m +144 608 l +200 640 l h - -69.8453 682.419 m -159.925 712.208 l -90.12 732.039 l + +48 576 m +112 576 l +80 544 l h -Rips complex -0 -1 -2 -3 -4 -5 -6 - -60 710 m -40 660 l - - -40 660 m -130 690 l - - -130 690 m -60 710 l - - -40 660 m -80 580 l - - -80 580 m -130 580 l -130 580 l - - -130 580 m -110 520 l - - -110 520 m -50 530 l -50 530 l -50 530 l + + +80 672 m +144 672 l +112 728 l +h - -50 530 m -80 580 l + + + + +48 576 m +48 640 l +32 608 l +h - -130 580 m -130 690 l + + + + + + + +32 0 0 32 80 576 e - - - - - - -150.038 609.9 m -179.929 549.727 l + +22.6274 0 0 22.6274 64 656 e - - - -158.7 593.269 m -81.4925 544.805 l + +37.1429 0 0 37.1429 112 690.857 e - -256.324 639.958 m -370.055 639.958 l + +37.1429 0 0 37.1429 162.857 640 e - -56.8567 0 0 56.8567 313.217 639.756 e + +10 + +32 0 0 32 48 608 e - - -Rips threshold + + diff --git a/src/Cech_complex/doc/cech_complex_representation.png b/src/Cech_complex/doc/cech_complex_representation.png index e901d92e..4d103a56 100644 Binary files a/src/Cech_complex/doc/cech_complex_representation.png and b/src/Cech_complex/doc/cech_complex_representation.png differ diff --git a/src/Cech_complex/doc/cech_one_skeleton.ipe b/src/Cech_complex/doc/cech_one_skeleton.ipe index 3a35970c..345e6d7b 100644 --- a/src/Cech_complex/doc/cech_one_skeleton.ipe +++ b/src/Cech_complex/doc/cech_one_skeleton.ipe @@ -1,7 +1,7 @@ - + @@ -232,95 +232,83 @@ h - -109.771 601.912 m -159.595 601.797 l -140.058 541.915 l +Proximity graph +0 +1 + +304 672 m +336 672 l + +2 +3 +4 +5 +6 + + + + + + + + + + + +32 0 0 32 304 672 e + +Maximal radius +7 +8 +9 + +112 576 m +144 608 l + + +144 672 m +144 608 l +200 640 l h - -79.8776 552.169 m -109.756 601.699 l -139.812 542.209 l + +48 640 m +80 672 l +48 672 l h - -69.8453 682.419 m -159.925 712.208 l -90.12 732.039 l + +48 576 m +112 576 l +80 544 l h -One skeleton graph -0 -1 -2 -3 -4 -5 -6 - -60 710 m -40 660 l - - -40 660 m -130 690 l - - -130 690 m -60 710 l - - -40 660 m -80 580 l - - -80 580 m -130 580 l -130 580 l - - -130 580 m -110 520 l - - -110 520 m -50 530 l -50 530 l -50 530 l - - -50 530 m -80 580 l - - -130 580 m -130 690 l - - - - - - - -150.038 609.9 m -179.929 549.727 l - - - - -158.7 593.269 m -81.4925 544.805 l - - -256.324 639.958 m -370.055 639.958 l + + +80 672 m +144 672 l +112 728 l +h - -56.8567 0 0 56.8567 313.217 639.756 e + + +48 576 m +48 640 l +32 608 l +h - - -Rips threshold + + + + + + + + + + +10 + + diff --git a/src/Cech_complex/doc/cech_one_skeleton.png b/src/Cech_complex/doc/cech_one_skeleton.png index ffa9c329..807e0936 100644 Binary files a/src/Cech_complex/doc/cech_one_skeleton.png and b/src/Cech_complex/doc/cech_one_skeleton.png differ diff --git a/src/Cech_complex/example/cech_complex_example_from_points.cpp b/src/Cech_complex/example/cech_complex_example_from_points.cpp index 97327e69..3b889d56 100644 --- a/src/Cech_complex/example/cech_complex_example_from_points.cpp +++ b/src/Cech_complex/example/cech_complex_example_from_points.cpp @@ -15,22 +15,26 @@ int main() { using Cech_complex = Gudhi::cech_complex::Cech_complex; Point_cloud points; - points.push_back({0., 0.}); - points.push_back({0., 2.}); - points.push_back({std::sqrt(3.), 1.}); - points.push_back({1., 0.}); - points.push_back({1., 2.}); - points.push_back({1. - std::sqrt(3.), 1.}); + points.push_back({1., 0.}); // 0 + points.push_back({0., 1.}); // 1 + points.push_back({2., 1.}); // 2 + points.push_back({3., 2.}); // 3 + points.push_back({0., 3.}); // 4 + points.push_back({3. + std::sqrt(3.), 3.}); // 5 + points.push_back({1., 4.}); // 6 + points.push_back({3., 4.}); // 7 + points.push_back({2., 4. + std::sqrt(3.)}); // 8 + points.push_back({0., 4.}); // 9 + points.push_back({-0.5, 2.}); // 10 // ---------------------------------------------------------------------------- // Init of a Cech complex from points // ---------------------------------------------------------------------------- - // 5. is a magic number to force one blocker, and one non-blocker - Filtration_value max_radius = 12.; + Filtration_value max_radius = 1.; Cech_complex cech_complex_from_points(points, max_radius); Simplex_tree stree; - cech_complex_from_points.create_complex(stree, -1); + cech_complex_from_points.create_complex(stree, 2); // ---------------------------------------------------------------------------- // Display information about the one skeleton Cech complex // ---------------------------------------------------------------------------- diff --git a/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt b/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt index 684e120b..be0afc76 100644 --- a/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt +++ b/src/Cech_complex/example/cech_complex_example_from_points_for_doc.txt @@ -1,16 +1,31 @@ -Cech complex is of dimension 2 - 14 simplices - 7 vertices. Iterator on Cech complex simplices in the filtration order, with [filtration value]: - ( 0 ) -> [0] - ( 1 ) -> [0] - ( 2 ) -> [0] - ( 3 ) -> [0] - ( 4 ) -> [0] - ( 5 ) -> [0] - ( 6 ) -> [0] - ( 3 2 ) -> [5] - ( 5 4 ) -> [5.38516] - ( 2 0 ) -> [5.83095] - ( 1 0 ) -> [6.08276] - ( 3 1 ) -> [6.32456] - ( 2 1 ) -> [6.7082] - ( 3 2 1 ) -> [7.07107] + ( 0 ) -> [0] + ( 1 ) -> [0] + ( 2 ) -> [0] + ( 3 ) -> [0] + ( 4 ) -> [0] + ( 5 ) -> [0] + ( 6 ) -> [0] + ( 7 ) -> [0] + ( 8 ) -> [0] + ( 9 ) -> [0] + ( 10 ) -> [0] + ( 9 4 ) -> [0.5] + ( 9 6 ) -> [0.5] + ( 10 1 ) -> [0.559017] + ( 10 4 ) -> [0.559017] + ( 1 0 ) -> [0.707107] + ( 2 0 ) -> [0.707107] + ( 3 2 ) -> [0.707107] + ( 6 4 ) -> [0.707107] + ( 9 6 4 ) -> [0.707107] + ( 2 1 ) -> [1] + ( 2 1 0 ) -> [1] + ( 4 1 ) -> [1] + ( 5 3 ) -> [1] + ( 7 3 ) -> [1] + ( 7 5 ) -> [1] + ( 7 6 ) -> [1] + ( 8 6 ) -> [1] + ( 8 7 ) -> [1] + ( 10 4 1 ) -> [1] diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index a50ed9fa..612c73c3 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -23,7 +23,7 @@ #ifndef CECH_COMPLEX_H_ #define CECH_COMPLEX_H_ -#include // for Gudhi::Squared_radius +#include // for Gudhi::Radius_distance #include // for Gudhi::Proximity_graph #include // for GUDHI_CHECK #include // for Gudhi::cech_complex::Cech_blocker @@ -43,7 +43,7 @@ namespace cech_complex { * * \details * The data structure is a proximity graph, containing edges when the edge length is less or equal - * to a given max_radius. Edge length is computed from `Gudhi::Squared_radius` distance function. + * to a given max_radius. Edge length is computed from `Gudhi::Radius_distance` distance function. * * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index d718b56e..5ba17c51 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -24,7 +24,7 @@ #define CECH_COMPLEX_BLOCKER_H_ #include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex -#include // for Gudhi::Squared_radius +#include // for Gudhi::Radius_distance #include #include @@ -75,12 +75,13 @@ class Cech_blocker { std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES } - Filtration_value squared_radius = Gudhi::Radius_distance()(points); + Filtration_value radius = Gudhi::Radius_distance()(points); #ifdef DEBUG_TRACES - std::cout << "squared_radius = " << squared_radius << " - " << (squared_radius > cc_ptr_->max_radius()) << std::endl; + if (radius > cc_ptr_->max_radius()) + std::cout << "radius > max_radius => expansion is blocked\n"; #endif // DEBUG_TRACES - simplicial_complex_.assign_filtration(sh, squared_radius); - return (squared_radius > cc_ptr_->max_radius()); + simplicial_complex_.assign_filtration(sh, radius); + return (radius > cc_ptr_->max_radius()); } /** \internal \brief Cech complex blocker constructor. */ diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index 626f1d82..eae8778c 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { BOOST_CHECK(st.num_vertices() == NUMBER_OF_VERTICES); std::cout << "st.num_simplices()=" << st.num_simplices() << std::endl; - BOOST_CHECK(st.num_simplices() == 18); + BOOST_CHECK(st.num_simplices() == 28); // Check filtration values of vertices is 0.0 for (auto f_simplex : st.skeleton_simplex_range(0)) { @@ -119,7 +119,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { BOOST_CHECK(st2.num_vertices() == NUMBER_OF_VERTICES); std::cout << "st2.num_simplices()=" << st2.num_simplices() << std::endl; - BOOST_CHECK(st2.num_simplices() == 23); + BOOST_CHECK(st2.num_simplices() == 63); Point_cloud points012; for (std::size_t vertex = 0; vertex <= 2; vertex++) { @@ -156,7 +156,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { BOOST_CHECK(st3.num_vertices() == NUMBER_OF_VERTICES); std::cout << "st3.num_simplices()=" << st3.num_simplices() << std::endl; - BOOST_CHECK(st3.num_simplices() == 24); + BOOST_CHECK(st3.num_simplices() == 98); Point_cloud points0123; for (std::size_t vertex = 0; vertex <= 3; vertex++) { @@ -236,13 +236,13 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.0); break; case 1: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.5); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.707107, .00001); break; case 2: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.666667, .00001); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.816497, .00001); break; case 3: - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.75); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), 0.866025, .00001); break; default: BOOST_CHECK(false); // Shall not happen diff --git a/src/Doxyfile b/src/Doxyfile index f1981e2e..52de65b0 100644 --- a/src/Doxyfile +++ b/src/Doxyfile @@ -843,7 +843,8 @@ EXAMPLE_RECURSIVE = NO IMAGE_PATH = doc/Skeleton_blocker/ \ doc/Alpha_complex/ \ doc/common/ \ - doc/Contraction/ \ + doc/Cech_complex/ \ + doc/Contraction/ \ doc/Simplex_tree/ \ doc/Persistent_cohomology/ \ doc/Witness_complex/ \ diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 3ce51ad1..7749b98e 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -90,11 +90,11 @@ class Radius_distance { operator()(const Point_cloud& point_cloud) const { using Min_sphere = Miniball::Miniball>; - //Min_sphere ms(point_cloud.begin()->end() - point_cloud.begin()->begin(), point_cloud.begin(),point_cloud.end()); - Min_sphere ms(point_cloud.end() - point_cloud.begin(), point_cloud.begin(),point_cloud.end()); + Min_sphere ms(point_cloud.begin()->end() - point_cloud.begin()->begin(), point_cloud.begin(),point_cloud.end()); #ifdef DEBUG_TRACES - std::cout << "Radius on " << point_cloud.end() - point_cloud.begin() << " points = " - << std::sqrt(ms.squared_radius()) << std::endl; + std::cout << "Radius_distance = " << std::sqrt(ms.squared_radius()) << " | nb points = " + << point_cloud.end() - point_cloud.begin() << " | dimension = " + << point_cloud.begin()->end() - point_cloud.begin()->begin() << std::endl; #endif // DEBUG_TRACES return std::sqrt(ms.squared_radius()); -- cgit v1.2.3 From 2a9f6eb628979a9634c647be93e575e3177c15da Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 5 Mar 2018 15:43:13 +0000 Subject: Fix documentation git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3264 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: af6241dfe42d988b542224b9dae7364f3f22b6fd --- src/Cech_complex/doc/Intro_cech_complex.h | 4 +- .../doc/cech_complex_representation.ipe | 4 +- .../doc/cech_complex_representation.png | Bin 54399 -> 39938 bytes src/Cech_complex/doc/cech_one_skeleton.ipe | 4 +- src/Cech_complex/doc/cech_one_skeleton.png | Bin 29354 -> 24662 bytes src/Cech_complex/test/test_cech_complex.cpp | 124 ++++++++++----------- src/common/doc/main_page.h | 18 ++- 7 files changed, 85 insertions(+), 69 deletions(-) diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index 8b6c7851..ec0d35e2 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -67,11 +67,13 @@ namespace cech_complex { * The minimal ball radius computation is insured by * * the miniball software (V3.0) - Smallest Enclosing Balls of Points - and distributed with GUDHI. - * * Please refer to * * the miniball software design description for more information about this computation. * + * This radius computation is the reason why the Cech_complex is taking much more time to be computed than the + * \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. diff --git a/src/Cech_complex/doc/cech_complex_representation.ipe b/src/Cech_complex/doc/cech_complex_representation.ipe index c64d7596..377745a3 100644 --- a/src/Cech_complex/doc/cech_complex_representation.ipe +++ b/src/Cech_complex/doc/cech_complex_representation.ipe @@ -1,7 +1,7 @@ - + @@ -267,7 +267,7 @@ h Maximal radius 7 -8 +8 9 112 576 m diff --git a/src/Cech_complex/doc/cech_complex_representation.png b/src/Cech_complex/doc/cech_complex_representation.png index 4d103a56..d0eb85a5 100644 Binary files a/src/Cech_complex/doc/cech_complex_representation.png and b/src/Cech_complex/doc/cech_complex_representation.png differ diff --git a/src/Cech_complex/doc/cech_one_skeleton.ipe b/src/Cech_complex/doc/cech_one_skeleton.ipe index 345e6d7b..ed66e132 100644 --- a/src/Cech_complex/doc/cech_one_skeleton.ipe +++ b/src/Cech_complex/doc/cech_one_skeleton.ipe @@ -1,7 +1,7 @@ - + @@ -259,7 +259,7 @@ h Maximal radius 7 -8 +8 9 112 576 m diff --git a/src/Cech_complex/doc/cech_one_skeleton.png b/src/Cech_complex/doc/cech_one_skeleton.png index 807e0936..cc636616 100644 Binary files a/src/Cech_complex/doc/cech_one_skeleton.png and b/src/Cech_complex/doc/cech_one_skeleton.png differ diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index eae8778c..8cbfe431 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -42,7 +42,7 @@ // Type definitions using Simplex_tree = Gudhi::Simplex_tree<>; using Filtration_value = Simplex_tree::Filtration_value; -using Point = std::vector; +using Point = std::vector; using Point_cloud = std::vector; using Points_off_reader = Gudhi::Points_off_reader; using Cech_complex = Gudhi::cech_complex::Cech_complex; @@ -51,42 +51,52 @@ using Point_iterator = Point_cloud::const_iterator; using Coordinate_iterator = Point::const_iterator; using Min_sphere = Miniball::Miniball>; -BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { +BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { // ---------------------------------------------------------------------------- // - // Init of a Cech complex from a OFF file + // Init of a Cech complex from a point cloud // // ---------------------------------------------------------------------------- - std::string off_file_name("alphacomplexdoc.off"); - double max_radius = 12.0; - std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech max_radius=" << + Point_cloud points; + points.push_back({1., 0.}); // 0 + points.push_back({0., 1.}); // 1 + points.push_back({2., 1.}); // 2 + points.push_back({3., 2.}); // 3 + points.push_back({0., 3.}); // 4 + points.push_back({3. + std::sqrt(3.), 3.}); // 5 + points.push_back({1., 4.}); // 6 + points.push_back({3., 4.}); // 7 + points.push_back({2., 4. + std::sqrt(3.)}); // 8 + points.push_back({0., 4.}); // 9 + points.push_back({-0.5, 2.}); // 10 + + Filtration_value max_radius = 1.0; + std::cout << "========== NUMBER OF POINTS = " << points.size() << " - Cech max_radius = " << max_radius << "==========" << std::endl; - Points_off_reader off_reader(off_file_name); - Point_cloud point_cloud = off_reader.get_point_cloud(); - Cech_complex cech_complex_from_file(point_cloud, max_radius); + Cech_complex cech_complex_for_doc(points, max_radius); - GUDHI_TEST_FLOAT_EQUALITY_CHECK(cech_complex_from_file.max_radius(), max_radius); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(cech_complex_for_doc.max_radius(), max_radius); std::size_t i = 0; - for (; i < point_cloud.size(); i++) { - BOOST_CHECK(point_cloud[i] == *(cech_complex_from_file.point_iterator(i))); + for (; i < points.size(); i++) { + BOOST_CHECK(points[i] == *(cech_complex_for_doc.point_iterator(i))); } #ifdef GUDHI_DEBUG - BOOST_CHECK_THROW (cech_complex_from_file.point_iterator(i+1), std::out_of_range); + BOOST_CHECK_THROW (cech_complex_for_doc.point_iterator(i+1), std::out_of_range); #endif // GUDHI_DEBUG const int DIMENSION_1 = 1; Simplex_tree st; - cech_complex_from_file.create_complex(st, DIMENSION_1); + cech_complex_for_doc.create_complex(st, DIMENSION_1); std::cout << "st.dimension()=" << st.dimension() << std::endl; BOOST_CHECK(st.dimension() == DIMENSION_1); - const int NUMBER_OF_VERTICES = 7; + const int NUMBER_OF_VERTICES = 11; std::cout << "st.num_vertices()=" << st.num_vertices() << std::endl; BOOST_CHECK(st.num_vertices() == NUMBER_OF_VERTICES); std::cout << "st.num_simplices()=" << st.num_simplices() << std::endl; - BOOST_CHECK(st.num_simplices() == 28); + BOOST_CHECK(st.num_simplices() == 27); // Check filtration values of vertices is 0.0 for (auto f_simplex : st.skeleton_simplex_range(0)) { @@ -100,7 +110,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { std::cout << "vertex = ("; for (auto vertex : st.simplex_vertex_range(f_simplex)) { std::cout << vertex << ","; - vp.push_back(off_reader.get_point_cloud().at(vertex)); + vp.push_back(points.at(vertex)); } std::cout << ") - distance =" << Gudhi::Radius_distance()(vp.at(0), vp.at(1)) << " - filtration =" << st.filtration(f_simplex) << std::endl; @@ -110,8 +120,13 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { } const int DIMENSION_2 = 2; + +#ifdef GUDHI_DEBUG + BOOST_CHECK_THROW (cech_complex_for_doc.create_complex(st, DIMENSION_2), std::invalid_argument); +#endif + Simplex_tree st2; - cech_complex_from_file.create_complex(st2, DIMENSION_2); + cech_complex_for_doc.create_complex(st2, DIMENSION_2); std::cout << "st2.dimension()=" << st2.dimension() << std::endl; BOOST_CHECK(st2.dimension() == DIMENSION_2); @@ -119,14 +134,14 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { BOOST_CHECK(st2.num_vertices() == NUMBER_OF_VERTICES); std::cout << "st2.num_simplices()=" << st2.num_simplices() << std::endl; - BOOST_CHECK(st2.num_simplices() == 63); + BOOST_CHECK(st2.num_simplices() == 30); Point_cloud points012; for (std::size_t vertex = 0; vertex <= 2; vertex++) { - points012.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), - cech_complex_from_file.point_iterator(vertex)->end())); + points012.push_back(Point(cech_complex_for_doc.point_iterator(vertex)->begin(), + cech_complex_for_doc.point_iterator(vertex)->end())); } - std::size_t dimension = point_cloud[0].end() - point_cloud[0].begin(); + std::size_t dimension = points[0].end() - points[0].begin(); Min_sphere ms012(dimension, points012.begin(),points012.end()); Simplex_tree::Filtration_value f012 = st2.filtration(st2.find({0, 1, 2})); @@ -134,53 +149,36 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_file) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(f012, std::sqrt(ms012.squared_radius())); - Point_cloud points456; - for (std::size_t vertex = 4; vertex <= 6; vertex++) { - points456.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), - cech_complex_from_file.point_iterator(vertex)->end())); - } - Min_sphere ms456(dimension, points456.begin(),points456.end()); - - Simplex_tree::Filtration_value f456 = st2.filtration(st2.find({4, 5, 6})); - std::cout << "f456= " << f456 << " | ms456_radius= " << std::sqrt(ms456.squared_radius()) << std::endl; + Point_cloud points1410; + points1410.push_back(Point(cech_complex_for_doc.point_iterator(1)->begin(), + cech_complex_for_doc.point_iterator(1)->end())); + points1410.push_back(Point(cech_complex_for_doc.point_iterator(4)->begin(), + cech_complex_for_doc.point_iterator(4)->end())); + points1410.push_back(Point(cech_complex_for_doc.point_iterator(10)->begin(), + cech_complex_for_doc.point_iterator(10)->end())); + Min_sphere ms1410(dimension, points1410.begin(),points1410.end()); - GUDHI_TEST_FLOAT_EQUALITY_CHECK(f456, std::sqrt(ms456.squared_radius())); + Simplex_tree::Filtration_value f1410 = st2.filtration(st2.find({1, 4, 10})); + std::cout << "f1410= " << f1410 << " | ms1410_radius= " << std::sqrt(ms1410.squared_radius()) << std::endl; - const int DIMENSION_3 = 3; - Simplex_tree st3; - cech_complex_from_file.create_complex(st3, DIMENSION_3); - std::cout << "st3.dimension()=" << st3.dimension() << std::endl; - BOOST_CHECK(st3.dimension() == DIMENSION_3); - - std::cout << "st3.num_vertices()=" << st3.num_vertices() << std::endl; - BOOST_CHECK(st3.num_vertices() == NUMBER_OF_VERTICES); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(f1410, std::sqrt(ms1410.squared_radius())); - std::cout << "st3.num_simplices()=" << st3.num_simplices() << std::endl; - BOOST_CHECK(st3.num_simplices() == 98); - - Point_cloud points0123; - for (std::size_t vertex = 0; vertex <= 3; vertex++) { - points0123.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), - cech_complex_from_file.point_iterator(vertex)->end())); - } - Min_sphere ms0123(dimension, points0123.begin(),points0123.end()); + Point_cloud points469; + points469.push_back(Point(cech_complex_for_doc.point_iterator(4)->begin(), + cech_complex_for_doc.point_iterator(4)->end())); + points469.push_back(Point(cech_complex_for_doc.point_iterator(6)->begin(), + cech_complex_for_doc.point_iterator(6)->end())); + points469.push_back(Point(cech_complex_for_doc.point_iterator(9)->begin(), + cech_complex_for_doc.point_iterator(9)->end())); + Min_sphere ms469(dimension, points469.begin(),points469.end()); - Simplex_tree::Filtration_value f0123 = st3.filtration(st3.find({0, 1, 2, 3})); - std::cout << "f0123= " << f0123 << " | ms0123_radius= " << std::sqrt(ms0123.squared_radius()) << std::endl; + Simplex_tree::Filtration_value f469 = st2.filtration(st2.find({4, 6, 9})); + std::cout << "f469= " << f469 << " | ms469_radius= " << std::sqrt(ms469.squared_radius()) << std::endl; - GUDHI_TEST_FLOAT_EQUALITY_CHECK(f0123, std::sqrt(ms0123.squared_radius())); - - - - Point_cloud points01; - for (std::size_t vertex = 0; vertex <= 1; vertex++) { - points01.push_back(Point(cech_complex_from_file.point_iterator(vertex)->begin(), - cech_complex_from_file.point_iterator(vertex)->end())); - } - Min_sphere ms01(dimension, points01.begin(),points01.end()); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(f469, std::sqrt(ms469.squared_radius())); - Simplex_tree::Filtration_value f01 = st2.filtration(st2.find({0, 1})); - std::cout << "f01= " << f01 << " | ms01_radius= " << std::sqrt(ms01.squared_radius()) << std::endl; + BOOST_CHECK((st2.find({6, 7, 8}) == st2.null_simplex())); + BOOST_CHECK((st2.find({3, 5, 7}) == st2.null_simplex())); } diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h index b3e9ea03..3851dde7 100644 --- a/src/common/doc/main_page.h +++ b/src/common/doc/main_page.h @@ -41,6 +41,22 @@ User manual: \ref alpha_complex - Reference manual: Gudhi::alpha_complex::Alpha_complex + + \subsection CechComplexDataStructure Cech complex + \image html "cech_complex_representation.png" "Cech complex representation" + + + + +
+ Author: Vincent Rouvreau
+ Introduced in: GUDHI 2.2.0
+ Copyright: GPL v3
+
+ The Cech complex is a proximity graph that allows to construct a simplicial complex from it. + It guarantees the simplices inserted are inside a ball of a given radius.
+ User manual: \ref cech_complex - Reference manual: Gudhi::cech_complex::Cech_complex +
\subsection CubicalComplexDataStructure Cubical complex \image html "Cubical_complex_representation.png" "Cubical complex representation" @@ -57,6 +73,7 @@ User manual: \ref cubical_complex - Reference manual: Gudhi::cubical_complex::Bitmap_cubical_complex + \subsection RipsComplexDataStructure Rips complex \image html "rips_complex_representation.png" "Rips complex representation" @@ -74,7 +91,6 @@ User manual: \ref rips_complex - Reference manual: Gudhi::rips_complex::Rips_complex -
\subsection SimplexTreeDataStructure Simplex tree \image html "Simplex_tree_representation.png" "Simplex tree representation" -- cgit v1.2.3 From 76658daa8112d622579a9fac7718f3f94f728862 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 5 Mar 2018 16:03:59 +0000 Subject: Install Miniball with gudhi for Cech to compile git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3265 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 35309d8ef71455028fd4abeeba03ece2b0d0461f --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7cccb19f..ff7acafc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -105,4 +105,5 @@ install(FILES # install the include file on "make install" install(DIRECTORY include/gudhi DESTINATION include) +install(DIRECTORY include/Miniball DESTINATION include) #--------------------------------------------------------------------------------------- -- cgit v1.2.3 From 0d0ca116e7fef77cc950b7e85380495661311d91 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Mar 2018 08:36:00 +0000 Subject: Move Miniball in gudhi git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3302 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 736e5c33a9593e4dfb5b19ddc745ab9852d71b40 --- src/CMakeLists.txt | 1 - .../benchmark/cech_complex_benchmark.cpp | 5 +- src/Cech_complex/example/CMakeLists.txt | 2 + .../example/cech_complex_step_by_step.cpp | 4 +- .../include/Miniball/Miniball.COPYRIGHT | 4 - src/Cech_complex/include/Miniball/Miniball.README | 23 - src/Cech_complex/include/Miniball/Miniball.hpp | 520 -------------------- src/Cech_complex/include/gudhi/Miniball.COPYRIGHT | 4 + src/Cech_complex/include/gudhi/Miniball.README | 23 + src/Cech_complex/include/gudhi/Miniball.hpp | 523 +++++++++++++++++++++ src/Cech_complex/test/test_cech_complex.cpp | 5 +- src/common/include/gudhi/distance_functions.h | 2 +- 12 files changed, 559 insertions(+), 557 deletions(-) delete mode 100644 src/Cech_complex/include/Miniball/Miniball.COPYRIGHT delete mode 100644 src/Cech_complex/include/Miniball/Miniball.README delete mode 100644 src/Cech_complex/include/Miniball/Miniball.hpp create mode 100644 src/Cech_complex/include/gudhi/Miniball.COPYRIGHT create mode 100644 src/Cech_complex/include/gudhi/Miniball.README create mode 100644 src/Cech_complex/include/gudhi/Miniball.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff7acafc..7cccb19f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -105,5 +105,4 @@ install(FILES # install the include file on "make install" install(DIRECTORY include/gudhi DESTINATION include) -install(DIRECTORY include/Miniball DESTINATION include) #--------------------------------------------------------------------------------------- diff --git a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp index 83ef9dca..6ba52419 100644 --- a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp +++ b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp @@ -27,8 +27,7 @@ #include #include #include - -#include +#include #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations @@ -57,7 +56,7 @@ class Radius_distance { using Point_cloud = std::vector; using Point_iterator = typename Point_cloud::const_iterator; using Coordinate_iterator = typename Point::const_iterator; - using Min_sphere = typename Miniball::Miniball>; + using Min_sphere = typename Gudhi::Miniball::Miniball>; Point_cloud point_cloud; point_cloud.push_back(p1); diff --git a/src/Cech_complex/example/CMakeLists.txt b/src/Cech_complex/example/CMakeLists.txt index ac32ff95..ab391215 100644 --- a/src/Cech_complex/example/CMakeLists.txt +++ b/src/Cech_complex/example/CMakeLists.txt @@ -6,6 +6,8 @@ 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") add_executable ( Cech_complex_example_from_points cech_complex_example_from_points.cpp) if (TBB_FOUND) diff --git a/src/Cech_complex/example/cech_complex_step_by_step.cpp b/src/Cech_complex/example/cech_complex_step_by_step.cpp index 8705a3e5..0e7c4bbd 100644 --- a/src/Cech_complex/example/cech_complex_step_by_step.cpp +++ b/src/Cech_complex/example/cech_complex_step_by_step.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include @@ -55,7 +55,7 @@ class Cech_blocker { using Point_cloud = std::vector; using Point_iterator = Point_cloud::const_iterator; using Coordinate_iterator = Point::const_iterator; - using Min_sphere = Miniball::Miniball >; + using Min_sphere = Gudhi::Miniball::Miniball >; public: bool operator()(Simplex_handle sh) { std::vector points; diff --git a/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT b/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT deleted file mode 100644 index dbe4c553..00000000 --- a/src/Cech_complex/include/Miniball/Miniball.COPYRIGHT +++ /dev/null @@ -1,4 +0,0 @@ -The miniball software is available under the GNU General Public License (GPLv3 - https://www.gnu.org/copyleft/gpl.html). -If your intended use is not compliant with this license, please buy a commercial license (EUR 500 - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/license.html). -You need a license if the software that you develop using Miniball V3.0 is not open source. - diff --git a/src/Cech_complex/include/Miniball/Miniball.README b/src/Cech_complex/include/Miniball/Miniball.README deleted file mode 100644 index 86a96f08..00000000 --- a/src/Cech_complex/include/Miniball/Miniball.README +++ /dev/null @@ -1,23 +0,0 @@ -https://people.inf.ethz.ch/gaertner/subdir/software/miniball.html - -Smallest Enclosing Balls of Points - Fast and Robust in C++. -(high-quality software for smallest enclosing balls of balls is available in the computational geometry algorithms library CGAL) - - -This is the miniball software (V3.0) for computing smallest enclosing balls of points in arbitrary dimensions. It consists of a C++ header file Miniball.hpp (around 500 lines of code) and two example programs miniball_example.cpp and miniball_example_containers.cpp that demonstrate the usage. The first example stores the coordinates of the input points in a two-dimensional array, the second example uses a list of vectors to show how generic containers can be used. - -Credits: Aditya Gupta and Alexandros Konstantinakis-Karmis have significantly contributed to this version of the software. - -Changes - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/changes.txt - from previous versions. - -The theory - https://people.inf.ethz.ch/gaertner/subdir/texts/own_work/esa99_final.pdf - behind the miniball software (Proc. 7th Annual European Symposium on Algorithms (ESA), Lecture Notes in Computer Science 1643, Springer-Verlag, pp.325-338, 1999). - -Main Features: - - Very fast in low dimensions. 1 million points in 5-space are processed within 0.05 seconds on any recent machine. - - High numerical stability. Almost all input degeneracies (cospherical points, multiple points, points very close together) are routinely handled. - - Easily integrates into your code. You can freely choose the coordinate type of your points and the container to store the points. If you still need to adapt the code, the header is small and readable and contains documentation for all major methods. - - diff --git a/src/Cech_complex/include/Miniball/Miniball.hpp b/src/Cech_complex/include/Miniball/Miniball.hpp deleted file mode 100644 index a42d62a7..00000000 --- a/src/Cech_complex/include/Miniball/Miniball.hpp +++ /dev/null @@ -1,520 +0,0 @@ -// Copright (C) 1999-2013, Bernd Gaertner -// $Rev: 3581 $ -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact: -// -------- -// Bernd Gaertner -// Institute of Theoretical Computer Science -// ETH Zuerich -// CAB G31.1 -// CH-8092 Zuerich, Switzerland -// http://www.inf.ethz.ch/personal/gaertner - -#ifndef MINIBALL_HPP_ -#define MINIBALL_HPP_ - -#include -#include -#include -#include -#include - -namespace Miniball { - - // Global Functions - // ================ - template - inline NT mb_sqr (NT r) {return r*r;} - - // Functors - // ======== - - // functor to map a point iterator to the corresponding coordinate iterator; - // generic version for points whose coordinate containers have begin() - template < typename Pit_, typename Cit_ > - struct CoordAccessor { - typedef Pit_ Pit; - typedef Cit_ Cit; - inline Cit operator() (Pit it) const { return (*it).begin(); } - }; - - // partial specialization for points whose coordinate containers are arrays - template < typename Pit_, typename Cit_ > - struct CoordAccessor { - typedef Pit_ Pit; - typedef Cit_* Cit; - inline Cit operator() (Pit it) const { return *it; } - }; - - // Class Declaration - // ================= - - template - class Miniball { - private: - // types - // The iterator type to go through the input points - typedef typename CoordAccessor::Pit Pit; - // The iterator type to go through the coordinates of a single point. - typedef typename CoordAccessor::Cit Cit; - // The coordinate type - typedef typename std::iterator_traits::value_type NT; - // The iterator to go through the support points - typedef typename std::list::iterator Sit; - - // data members... - const int d; // dimension - Pit points_begin; - Pit points_end; - CoordAccessor coord_accessor; - double time; - const NT nt0; // NT(0) - - //...for the algorithms - std::list L; - Sit support_end; - int fsize; // number of forced points - int ssize; // number of support points - - // ...for the ball updates - NT* current_c; - NT current_sqr_r; - NT** c; - NT* sqr_r; - - // helper arrays - NT* q0; - NT* z; - NT* f; - NT** v; - NT** a; - - public: - // The iterator type to go through the support points - typedef typename std::list::const_iterator SupportPointIterator; - - // PRE: [begin, end) is a nonempty range - // POST: computes the smallest enclosing ball of the points in the range - // [begin, end); the functor a maps a point iterator to an iterator - // through the d coordinates of the point - Miniball (int d_, Pit begin, Pit end, CoordAccessor ca = CoordAccessor()); - - // POST: returns a pointer to the first element of an array that holds - // the d coordinates of the center of the computed ball - const NT* center () const; - - // POST: returns the squared radius of the computed ball - NT squared_radius () const; - - // POST: returns the number of support points of the computed ball; - // the support points form a minimal set with the same smallest - // enclosing ball as the input set; in particular, the support - // points are on the boundary of the computed ball, and their - // number is at most d+1 - int nr_support_points () const; - - // POST: returns an iterator to the first support point - SupportPointIterator support_points_begin () const; - - // POST: returns a past-the-end iterator for the range of support points - SupportPointIterator support_points_end () const; - - // POST: returns the maximum excess of any input point w.r.t. the computed - // ball, divided by the squared radius of the computed ball. The - // excess of a point is the difference between its squared distance - // from the center and the squared radius; Ideally, the return value - // is 0. subopt is set to the absolute value of the most negative - // coefficient in the affine combination of the support points that - // yields the center. Ideally, this is a convex combination, and there - // is no negative coefficient in which case subopt is set to 0. - NT relative_error (NT& subopt) const; - - // POST: return true if the relative error is at most tol, and the - // suboptimality is 0; the default tolerance is 10 times the - // coordinate type's machine epsilon - bool is_valid (NT tol = NT(10) * std::numeric_limits::epsilon()) const; - - // POST: returns the time in seconds taken by the constructor call for - // computing the smallest enclosing ball - double get_time() const; - - // POST: deletes dynamically allocated arrays - ~Miniball(); - - private: - void mtf_mb (Sit n); - void mtf_move_to_front (Sit j); - void pivot_mb (Pit n); - void pivot_move_to_front (Pit j); - NT excess (Pit pit) const; - void pop (); - bool push (Pit pit); - NT suboptimality () const; - void create_arrays(); - void delete_arrays(); - }; - - // Class Definition - // ================ - template - Miniball::Miniball (int d_, Pit begin, Pit end, - CoordAccessor ca) - : d (d_), - points_begin (begin), - points_end (end), - coord_accessor (ca), - time (clock()), - nt0 (NT(0)), - L(), - support_end (L.begin()), - fsize(0), - ssize(0), - current_c (NULL), - current_sqr_r (NT(-1)), - c (NULL), - sqr_r (NULL), - q0 (NULL), - z (NULL), - f (NULL), - v (NULL), - a (NULL) - { - assert (points_begin != points_end); - create_arrays(); - - // set initial center - for (int j=0; j - Miniball::~Miniball() - { - delete_arrays(); - } - - template - void Miniball::create_arrays() - { - c = new NT*[d+1]; - v = new NT*[d+1]; - a = new NT*[d+1]; - for (int i=0; i - void Miniball::delete_arrays() - { - delete[] f; - delete[] z; - delete[] q0; - delete[] sqr_r; - for (int i=0; i - const typename Miniball::NT* - Miniball::center () const - { - return current_c; - } - - template - typename Miniball::NT - Miniball::squared_radius () const - { - return current_sqr_r; - } - - template - int Miniball::nr_support_points () const - { - assert (ssize < d+2); - return ssize; - } - - template - typename Miniball::SupportPointIterator - Miniball::support_points_begin () const - { - return L.begin(); - } - - template - typename Miniball::SupportPointIterator - Miniball::support_points_end () const - { - return support_end; - } - - template - typename Miniball::NT - Miniball::relative_error (NT& subopt) const - { - NT e, max_e = nt0; - // compute maximum absolute excess of support points - for (SupportPointIterator it = support_points_begin(); - it != support_points_end(); ++it) { - e = excess (*it); - if (e < nt0) e = -e; - if (e > max_e) { - max_e = e; - } - } - // compute maximum excess of any point - for (Pit i = points_begin; i != points_end; ++i) - if ((e = excess (i)) > max_e) - max_e = e; - - subopt = suboptimality(); - assert (current_sqr_r > nt0 || max_e == nt0); - return (current_sqr_r == nt0 ? nt0 : max_e / current_sqr_r); - } - - template - bool Miniball::is_valid (NT tol) const - { - NT suboptimality; - return ( (relative_error (suboptimality) <= tol) && (suboptimality == 0) ); - } - - template - double Miniball::get_time() const - { - return time; - } - - template - void Miniball::mtf_mb (Sit n) - { - // Algorithm 1: mtf_mb (L_{n-1}, B), where L_{n-1} = [L.begin, n) - // B: the set of forced points, defining the current ball - // S: the superset of support points computed by the algorithm - // -------------------------------------------------------------- - // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, - // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf - - // PRE: B = S - assert (fsize == ssize); - - support_end = L.begin(); - if ((fsize) == d+1) return; - - // incremental construction - for (Sit i = L.begin(); i != n;) - { - // INV: (support_end - L.begin() == |S|-|B|) - assert (std::distance (L.begin(), support_end) == ssize - fsize); - - Sit j = i++; - if (excess(*j) > nt0) - if (push(*j)) { // B := B + p_i - mtf_mb (j); // mtf_mb (L_{i-1}, B + p_i) - pop(); // B := B - p_i - mtf_move_to_front(j); - } - } - // POST: the range [L.begin(), support_end) stores the set S\B - } - - template - void Miniball::mtf_move_to_front (Sit j) - { - if (support_end == j) - support_end++; - L.splice (L.begin(), L, j); - } - - template - void Miniball::pivot_mb (Pit n) - { - // Algorithm 2: pivot_mb (L_{n-1}), where L_{n-1} = [L.begin, n) - // -------------------------------------------------------------- - // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, - // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf - NT old_sqr_r; - const NT* c; - Pit pivot, k; - NT e, max_e, sqr_r; - Cit p; - do { - old_sqr_r = current_sqr_r; - sqr_r = current_sqr_r; - - pivot = points_begin; - max_e = nt0; - for (k = points_begin; k != n; ++k) { - p = coord_accessor(k); - e = -sqr_r; - c = current_c; - for (int j=0; j(*p++-*c++); - if (e > max_e) { - max_e = e; - pivot = k; - } - } - - if (max_e > nt0) { - // check if the pivot is already contained in the support set - if (std::find(L.begin(), support_end, pivot) == support_end) { - assert (fsize == 0); - if (push (pivot)) { - mtf_mb(support_end); - pop(); - pivot_move_to_front(pivot); - } - } - } - } while (old_sqr_r < current_sqr_r); - } - - template - void Miniball::pivot_move_to_front (Pit j) - { - L.push_front(j); - if (std::distance(L.begin(), support_end) == d+2) - support_end--; - } - - template - inline typename Miniball::NT - Miniball::excess (Pit pit) const - { - Cit p = coord_accessor(pit); - NT e = -current_sqr_r; - NT* c = current_c; - for (int k=0; k(*p++-*c++); - } - return e; - } - - template - void Miniball::pop () - { - --fsize; - } - - template - bool Miniball::push (Pit pit) - { - int i, j; - NT eps = mb_sqr(std::numeric_limits::epsilon()); - - Cit cit = coord_accessor(pit); - Cit p = cit; - - if (fsize==0) { - for (i=0; i(v[fsize][j]); - z[fsize]*=2; - - // reject push if z_fsize too small - if (z[fsize](*p++-c[fsize-1][i]); - f[fsize]=e/z[fsize]; - - for (i=0; i - typename Miniball::NT - Miniball::suboptimality () const - { - NT* l = new NT[d+1]; - NT min_l = nt0; - l[0] = NT(1); - for (int i=ssize-1; i>0; --i) { - l[i] = f[i]; - for (int k=ssize-1; k>i; --k) - l[i]-=a[k][i]*l[k]; - if (l[i] < min_l) min_l = l[i]; - l[0] -= l[i]; - } - if (l[0] < min_l) min_l = l[0]; - delete[] l; - if (min_l < nt0) - return -min_l; - return nt0; - } - -} // end Namespace Miniball - -#endif // MINIBALL_HPP_ diff --git a/src/Cech_complex/include/gudhi/Miniball.COPYRIGHT b/src/Cech_complex/include/gudhi/Miniball.COPYRIGHT new file mode 100644 index 00000000..dbe4c553 --- /dev/null +++ b/src/Cech_complex/include/gudhi/Miniball.COPYRIGHT @@ -0,0 +1,4 @@ +The miniball software is available under the GNU General Public License (GPLv3 - https://www.gnu.org/copyleft/gpl.html). +If your intended use is not compliant with this license, please buy a commercial license (EUR 500 - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/license.html). +You need a license if the software that you develop using Miniball V3.0 is not open source. + diff --git a/src/Cech_complex/include/gudhi/Miniball.README b/src/Cech_complex/include/gudhi/Miniball.README new file mode 100644 index 00000000..86a96f08 --- /dev/null +++ b/src/Cech_complex/include/gudhi/Miniball.README @@ -0,0 +1,23 @@ +https://people.inf.ethz.ch/gaertner/subdir/software/miniball.html + +Smallest Enclosing Balls of Points - Fast and Robust in C++. +(high-quality software for smallest enclosing balls of balls is available in the computational geometry algorithms library CGAL) + + +This is the miniball software (V3.0) for computing smallest enclosing balls of points in arbitrary dimensions. It consists of a C++ header file Miniball.hpp (around 500 lines of code) and two example programs miniball_example.cpp and miniball_example_containers.cpp that demonstrate the usage. The first example stores the coordinates of the input points in a two-dimensional array, the second example uses a list of vectors to show how generic containers can be used. + +Credits: Aditya Gupta and Alexandros Konstantinakis-Karmis have significantly contributed to this version of the software. + +Changes - https://people.inf.ethz.ch/gaertner/subdir/software/miniball/changes.txt - from previous versions. + +The theory - https://people.inf.ethz.ch/gaertner/subdir/texts/own_work/esa99_final.pdf - behind the miniball software (Proc. 7th Annual European Symposium on Algorithms (ESA), Lecture Notes in Computer Science 1643, Springer-Verlag, pp.325-338, 1999). + +Main Features: + + Very fast in low dimensions. 1 million points in 5-space are processed within 0.05 seconds on any recent machine. + + High numerical stability. Almost all input degeneracies (cospherical points, multiple points, points very close together) are routinely handled. + + Easily integrates into your code. You can freely choose the coordinate type of your points and the container to store the points. If you still need to adapt the code, the header is small and readable and contains documentation for all major methods. + + diff --git a/src/Cech_complex/include/gudhi/Miniball.hpp b/src/Cech_complex/include/gudhi/Miniball.hpp new file mode 100644 index 00000000..ce6cbb5b --- /dev/null +++ b/src/Cech_complex/include/gudhi/Miniball.hpp @@ -0,0 +1,523 @@ +// Copright (C) 1999-2013, Bernd Gaertner +// $Rev: 3581 $ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// Contact: +// -------- +// Bernd Gaertner +// Institute of Theoretical Computer Science +// ETH Zuerich +// CAB G31.1 +// CH-8092 Zuerich, Switzerland +// http://www.inf.ethz.ch/personal/gaertner + +#ifndef MINIBALL_HPP_ +#define MINIBALL_HPP_ + +#include +#include +#include +#include +#include + +namespace Gudhi { + +namespace Miniball { + + // Global Functions + // ================ + template + inline NT mb_sqr (NT r) {return r*r;} + + // Functors + // ======== + + // functor to map a point iterator to the corresponding coordinate iterator; + // generic version for points whose coordinate containers have begin() + template < typename Pit_, typename Cit_ > + struct CoordAccessor { + typedef Pit_ Pit; + typedef Cit_ Cit; + inline Cit operator() (Pit it) const { return (*it).begin(); } + }; + + // partial specialization for points whose coordinate containers are arrays + template < typename Pit_, typename Cit_ > + struct CoordAccessor { + typedef Pit_ Pit; + typedef Cit_* Cit; + inline Cit operator() (Pit it) const { return *it; } + }; + + // Class Declaration + // ================= + + template + class Miniball { + private: + // types + // The iterator type to go through the input points + typedef typename CoordAccessor::Pit Pit; + // The iterator type to go through the coordinates of a single point. + typedef typename CoordAccessor::Cit Cit; + // The coordinate type + typedef typename std::iterator_traits::value_type NT; + // The iterator to go through the support points + typedef typename std::list::iterator Sit; + + // data members... + const int d; // dimension + Pit points_begin; + Pit points_end; + CoordAccessor coord_accessor; + double time; + const NT nt0; // NT(0) + + //...for the algorithms + std::list L; + Sit support_end; + int fsize; // number of forced points + int ssize; // number of support points + + // ...for the ball updates + NT* current_c; + NT current_sqr_r; + NT** c; + NT* sqr_r; + + // helper arrays + NT* q0; + NT* z; + NT* f; + NT** v; + NT** a; + + public: + // The iterator type to go through the support points + typedef typename std::list::const_iterator SupportPointIterator; + + // PRE: [begin, end) is a nonempty range + // POST: computes the smallest enclosing ball of the points in the range + // [begin, end); the functor a maps a point iterator to an iterator + // through the d coordinates of the point + Miniball (int d_, Pit begin, Pit end, CoordAccessor ca = CoordAccessor()); + + // POST: returns a pointer to the first element of an array that holds + // the d coordinates of the center of the computed ball + const NT* center () const; + + // POST: returns the squared radius of the computed ball + NT squared_radius () const; + + // POST: returns the number of support points of the computed ball; + // the support points form a minimal set with the same smallest + // enclosing ball as the input set; in particular, the support + // points are on the boundary of the computed ball, and their + // number is at most d+1 + int nr_support_points () const; + + // POST: returns an iterator to the first support point + SupportPointIterator support_points_begin () const; + + // POST: returns a past-the-end iterator for the range of support points + SupportPointIterator support_points_end () const; + + // POST: returns the maximum excess of any input point w.r.t. the computed + // ball, divided by the squared radius of the computed ball. The + // excess of a point is the difference between its squared distance + // from the center and the squared radius; Ideally, the return value + // is 0. subopt is set to the absolute value of the most negative + // coefficient in the affine combination of the support points that + // yields the center. Ideally, this is a convex combination, and there + // is no negative coefficient in which case subopt is set to 0. + NT relative_error (NT& subopt) const; + + // POST: return true if the relative error is at most tol, and the + // suboptimality is 0; the default tolerance is 10 times the + // coordinate type's machine epsilon + bool is_valid (NT tol = NT(10) * std::numeric_limits::epsilon()) const; + + // POST: returns the time in seconds taken by the constructor call for + // computing the smallest enclosing ball + double get_time() const; + + // POST: deletes dynamically allocated arrays + ~Miniball(); + + private: + void mtf_mb (Sit n); + void mtf_move_to_front (Sit j); + void pivot_mb (Pit n); + void pivot_move_to_front (Pit j); + NT excess (Pit pit) const; + void pop (); + bool push (Pit pit); + NT suboptimality () const; + void create_arrays(); + void delete_arrays(); + }; + + // Class Definition + // ================ + template + Miniball::Miniball (int d_, Pit begin, Pit end, + CoordAccessor ca) + : d (d_), + points_begin (begin), + points_end (end), + coord_accessor (ca), + time (clock()), + nt0 (NT(0)), + L(), + support_end (L.begin()), + fsize(0), + ssize(0), + current_c (NULL), + current_sqr_r (NT(-1)), + c (NULL), + sqr_r (NULL), + q0 (NULL), + z (NULL), + f (NULL), + v (NULL), + a (NULL) + { + assert (points_begin != points_end); + create_arrays(); + + // set initial center + for (int j=0; j + Miniball::~Miniball() + { + delete_arrays(); + } + + template + void Miniball::create_arrays() + { + c = new NT*[d+1]; + v = new NT*[d+1]; + a = new NT*[d+1]; + for (int i=0; i + void Miniball::delete_arrays() + { + delete[] f; + delete[] z; + delete[] q0; + delete[] sqr_r; + for (int i=0; i + const typename Miniball::NT* + Miniball::center () const + { + return current_c; + } + + template + typename Miniball::NT + Miniball::squared_radius () const + { + return current_sqr_r; + } + + template + int Miniball::nr_support_points () const + { + assert (ssize < d+2); + return ssize; + } + + template + typename Miniball::SupportPointIterator + Miniball::support_points_begin () const + { + return L.begin(); + } + + template + typename Miniball::SupportPointIterator + Miniball::support_points_end () const + { + return support_end; + } + + template + typename Miniball::NT + Miniball::relative_error (NT& subopt) const + { + NT e, max_e = nt0; + // compute maximum absolute excess of support points + for (SupportPointIterator it = support_points_begin(); + it != support_points_end(); ++it) { + e = excess (*it); + if (e < nt0) e = -e; + if (e > max_e) { + max_e = e; + } + } + // compute maximum excess of any point + for (Pit i = points_begin; i != points_end; ++i) + if ((e = excess (i)) > max_e) + max_e = e; + + subopt = suboptimality(); + assert (current_sqr_r > nt0 || max_e == nt0); + return (current_sqr_r == nt0 ? nt0 : max_e / current_sqr_r); + } + + template + bool Miniball::is_valid (NT tol) const + { + NT suboptimality; + return ( (relative_error (suboptimality) <= tol) && (suboptimality == 0) ); + } + + template + double Miniball::get_time() const + { + return time; + } + + template + void Miniball::mtf_mb (Sit n) + { + // Algorithm 1: mtf_mb (L_{n-1}, B), where L_{n-1} = [L.begin, n) + // B: the set of forced points, defining the current ball + // S: the superset of support points computed by the algorithm + // -------------------------------------------------------------- + // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, + // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf + + // PRE: B = S + assert (fsize == ssize); + + support_end = L.begin(); + if ((fsize) == d+1) return; + + // incremental construction + for (Sit i = L.begin(); i != n;) + { + // INV: (support_end - L.begin() == |S|-|B|) + assert (std::distance (L.begin(), support_end) == ssize - fsize); + + Sit j = i++; + if (excess(*j) > nt0) + if (push(*j)) { // B := B + p_i + mtf_mb (j); // mtf_mb (L_{i-1}, B + p_i) + pop(); // B := B - p_i + mtf_move_to_front(j); + } + } + // POST: the range [L.begin(), support_end) stores the set S\B + } + + template + void Miniball::mtf_move_to_front (Sit j) + { + if (support_end == j) + support_end++; + L.splice (L.begin(), L, j); + } + + template + void Miniball::pivot_mb (Pit n) + { + // Algorithm 2: pivot_mb (L_{n-1}), where L_{n-1} = [L.begin, n) + // -------------------------------------------------------------- + // from B. Gaertner, Fast and Robust Smallest Enclosing Balls, ESA 1999, + // http://www.inf.ethz.ch/personal/gaertner/texts/own_work/esa99_final.pdf + NT old_sqr_r; + const NT* c; + Pit pivot, k; + NT e, max_e, sqr_r; + Cit p; + do { + old_sqr_r = current_sqr_r; + sqr_r = current_sqr_r; + + pivot = points_begin; + max_e = nt0; + for (k = points_begin; k != n; ++k) { + p = coord_accessor(k); + e = -sqr_r; + c = current_c; + for (int j=0; j(*p++-*c++); + if (e > max_e) { + max_e = e; + pivot = k; + } + } + + if (max_e > nt0) { + // check if the pivot is already contained in the support set + if (std::find(L.begin(), support_end, pivot) == support_end) { + assert (fsize == 0); + if (push (pivot)) { + mtf_mb(support_end); + pop(); + pivot_move_to_front(pivot); + } + } + } + } while (old_sqr_r < current_sqr_r); + } + + template + void Miniball::pivot_move_to_front (Pit j) + { + L.push_front(j); + if (std::distance(L.begin(), support_end) == d+2) + support_end--; + } + + template + inline typename Miniball::NT + Miniball::excess (Pit pit) const + { + Cit p = coord_accessor(pit); + NT e = -current_sqr_r; + NT* c = current_c; + for (int k=0; k(*p++-*c++); + } + return e; + } + + template + void Miniball::pop () + { + --fsize; + } + + template + bool Miniball::push (Pit pit) + { + int i, j; + NT eps = mb_sqr(std::numeric_limits::epsilon()); + + Cit cit = coord_accessor(pit); + Cit p = cit; + + if (fsize==0) { + for (i=0; i(v[fsize][j]); + z[fsize]*=2; + + // reject push if z_fsize too small + if (z[fsize](*p++-c[fsize-1][i]); + f[fsize]=e/z[fsize]; + + for (i=0; i + typename Miniball::NT + Miniball::suboptimality () const + { + NT* l = new NT[d+1]; + NT min_l = nt0; + l[0] = NT(1); + for (int i=ssize-1; i>0; --i) { + l[i] = f[i]; + for (int k=ssize-1; k>i; --k) + l[i]-=a[k][i]*l[k]; + if (l[i] < min_l) min_l = l[i]; + l[0] -= l[i]; + } + if (l[0] < min_l) min_l = l[0]; + delete[] l; + if (min_l < nt0) + return -min_l; + return nt0; + } +} // namespace Miniball + +} // namespace Gudhi + +#endif // MINIBALL_HPP_ diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index 8cbfe431..4aa85057 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -36,8 +36,7 @@ #include #include #include - -#include +#include // Type definitions using Simplex_tree = Gudhi::Simplex_tree<>; @@ -49,7 +48,7 @@ using Cech_complex = Gudhi::cech_complex::Cech_complex>; +using Min_sphere = Gudhi::Miniball::Miniball>; BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { // ---------------------------------------------------------------------------- diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 7749b98e..93956a69 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -25,7 +25,7 @@ #include -#include +#include #include -- cgit v1.2.3 -- cgit v1.2.3 From 1f3716292673a56413d3501b4b98b54416d193ed Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Mar 2018 10:10:08 +0000 Subject: code review : Rename Radius_distance Minimal_enclosing_ball_radius git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3304 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 204aa7a7098773b2d290e35a12a1c92449743d7d --- .../benchmark/cech_complex_benchmark.cpp | 32 ++++++++++++---------- .../example/cech_complex_step_by_step.cpp | 4 +-- src/Cech_complex/include/gudhi/Cech_complex.h | 11 ++++---- .../include/gudhi/Cech_complex_blocker.h | 4 +-- src/Cech_complex/test/test_cech_complex.cpp | 4 +-- src/common/include/gudhi/distance_functions.h | 8 +++--- 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp index 6ba52419..2fa255ed 100644 --- a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp +++ b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp @@ -46,7 +46,7 @@ using Rips_complex = Gudhi::rips_complex::Rips_complex; using Cech_complex = Gudhi::cech_complex::Cech_complex; -class Radius_distance { +class Minimal_enclosing_ball_radius { public: // boost::range_value is not SFINAE-friendly so we cannot use it in the return type template< typename Point > @@ -80,24 +80,26 @@ int main(int argc, char * argv[]) { Gudhi::Clock euclidean_clock("Gudhi::Euclidean_distance"); // Compute the proximity graph of the points Proximity_graph euclidean_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Gudhi::Euclidean_distance()); + threshold, + Gudhi::Euclidean_distance()); std::cout << euclidean_clock << std::endl; - Gudhi::Clock radius_clock("Radius_distance"); + Gudhi::Clock miniball_clock("Minimal_enclosing_ball_radius"); // Compute the proximity graph of the points - Proximity_graph radius_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Radius_distance()); - std::cout << radius_clock << std::endl; + Proximity_graph miniball_prox_graph = + Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Minimal_enclosing_ball_radius()); + std::cout << miniball_clock << std::endl; - Gudhi::Clock common_radius_clock("Gudhi::Radius_distance()"); + Gudhi::Clock common_miniball_clock("Gudhi::Minimal_enclosing_ball_radius()"); // Compute the proximity graph of the points - Proximity_graph sq_radius_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Gudhi::Radius_distance()); - std::cout << common_radius_clock << std::endl; + Proximity_graph common_miniball_prox_graph = + Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), + threshold, + Gudhi::Minimal_enclosing_ball_radius()); + std::cout << common_miniball_clock << std::endl; boost::filesystem::path full_path(boost::filesystem::current_path()); @@ -121,7 +123,9 @@ int main(int argc, char * argv[]) { std::cout << itr->path().stem() << ";"; std::cout << radius << ";"; Gudhi::Clock rips_clock("Rips computation"); - Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), radius, Gudhi::Radius_distance()); + Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), + radius, + Gudhi::Minimal_enclosing_ball_radius()); Simplex_tree rips_stree; rips_complex_from_points.create_complex(rips_stree, p0.size() - 1); // ------------------------------------------ diff --git a/src/Cech_complex/example/cech_complex_step_by_step.cpp b/src/Cech_complex/example/cech_complex_step_by_step.cpp index 0e7c4bbd..760b53dc 100644 --- a/src/Cech_complex/example/cech_complex_step_by_step.cpp +++ b/src/Cech_complex/example/cech_complex_step_by_step.cpp @@ -65,7 +65,7 @@ class Cech_blocker { std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES } - Filtration_value radius = Gudhi::Radius_distance()(points); + Filtration_value radius = Gudhi::Minimal_enclosing_ball_radius()(points); #ifdef DEBUG_TRACES std::cout << "radius = " << radius << " - " << (radius > max_radius_) << std::endl; #endif // DEBUG_TRACES @@ -105,7 +105,7 @@ int main(int argc, char * argv[]) { // Compute the proximity graph of the points Proximity_graph prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), max_radius, - Gudhi::Radius_distance()); + Gudhi::Minimal_enclosing_ball_radius()); // Construct the Rips complex in a Simplex Tree Simplex_tree st; diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 612c73c3..8b1a9221 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -23,7 +23,7 @@ #ifndef CECH_COMPLEX_H_ #define CECH_COMPLEX_H_ -#include // for Gudhi::Radius_distance +#include // for Gudhi::Minimal_enclosing_ball_radius #include // for Gudhi::Proximity_graph #include // for GUDHI_CHECK #include // for Gudhi::cech_complex::Cech_blocker @@ -43,7 +43,7 @@ namespace cech_complex { * * \details * The data structure is a proximity graph, containing edges when the edge length is less or equal - * to a given max_radius. Edge length is computed from `Gudhi::Radius_distance` distance function. + * to a given max_radius. Edge length is computed from `Gudhi::Minimal_enclosing_ball_radius` distance function. * * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. @@ -71,9 +71,10 @@ class Cech_complex { Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) : max_radius_(max_radius), point_cloud_(points) { - cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, - max_radius_, - Gudhi::Radius_distance()); + cech_skeleton_graph_ = + Gudhi::compute_proximity_graph(point_cloud_, + max_radius_, + Gudhi::Minimal_enclosing_ball_radius()); } /** \brief Initializes the simplicial complex from the proximity graph and expands it until a given maximal diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 5ba17c51..c082815d 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -24,7 +24,7 @@ #define CECH_COMPLEX_BLOCKER_H_ #include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex -#include // for Gudhi::Radius_distance +#include // for Gudhi::Minimal_enclosing_ball_radius #include #include @@ -75,7 +75,7 @@ class Cech_blocker { std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES } - Filtration_value radius = Gudhi::Radius_distance()(points); + Filtration_value radius = Gudhi::Minimal_enclosing_ball_radius()(points); #ifdef DEBUG_TRACES if (radius > cc_ptr_->max_radius()) std::cout << "radius > max_radius => expansion is blocked\n"; diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index 4aa85057..8658729b 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -111,10 +111,10 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { std::cout << vertex << ","; vp.push_back(points.at(vertex)); } - std::cout << ") - distance =" << Gudhi::Radius_distance()(vp.at(0), vp.at(1)) << + std::cout << ") - distance =" << Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1)) << " - filtration =" << st.filtration(f_simplex) << std::endl; BOOST_CHECK(vp.size() == 2); - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Radius_distance()(vp.at(0), vp.at(1))); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1))); } } diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 93956a69..429a5fa7 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -70,9 +70,9 @@ class Euclidean_distance { } }; -/** @brief Compute the squared radius between Points given by a range of coordinates. The points are assumed to - * have the same dimension. */ -class Radius_distance { +/** @brief Compute the radius of the minimal enclosing ball between Points given by a range of coordinates. + * The points are assumed to have the same dimension. */ +class Minimal_enclosing_ball_radius { public: // boost::range_value is not SFINAE-friendly so we cannot use it in the return type template< typename Point > @@ -92,7 +92,7 @@ class Radius_distance { Min_sphere ms(point_cloud.begin()->end() - point_cloud.begin()->begin(), point_cloud.begin(),point_cloud.end()); #ifdef DEBUG_TRACES - std::cout << "Radius_distance = " << std::sqrt(ms.squared_radius()) << " | nb points = " + std::cout << "Minimal_enclosing_ball_radius = " << std::sqrt(ms.squared_radius()) << " | nb points = " << point_cloud.end() - point_cloud.begin() << " | dimension = " << point_cloud.begin()->end() - point_cloud.begin()->begin() << std::endl; #endif // DEBUG_TRACES -- cgit v1.2.3 From b69cc713465675a9bab998cb0688eb91390978a6 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Mar 2018 15:12:17 +0000 Subject: code review : use std::begin, std::end and boost::size git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3305 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: e59699bc13ae66476001ef5f648759fef68ee76a --- src/Cech_complex/include/gudhi/Cech_complex.h | 12 ++++++------ src/common/include/gudhi/distance_functions.h | 9 ++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 8b1a9221..bfad8b77 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -48,8 +48,8 @@ namespace cech_complex { * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. * - * \tparam ForwardPointRange furnishes `.size()`, `.begin()` and `.end()` methods, and a `const_iterator` type - * definition. + * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input + * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. */ template class Cech_complex { @@ -64,8 +64,8 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] max_radius Maximal radius value. * - * \tparam ForwardPointRange must be a range for which `.size()`, `.begin()` and `.end()` methods return input - * iterators on a point. `.begin()` and `.end()` methods are required for a point. + * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input + * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. * */ Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) @@ -107,9 +107,9 @@ class Cech_complex { * @exception std::out_of_range In debug mode, if point position in the range is out. */ typename ForwardPointRange::const_iterator point_iterator(std::size_t vertex) const { - GUDHI_CHECK((point_cloud_.begin() + vertex) < point_cloud_.end(), + GUDHI_CHECK((std::begin(point_cloud_) + vertex) < std::end(point_cloud_), std::out_of_range("Cech_complex::point - simplicial complex is not empty")); - return (point_cloud_.begin() + vertex); + return (std::begin(point_cloud_) + vertex); } private: diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 429a5fa7..20b04000 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -28,6 +28,7 @@ #include #include +#include #include // for std::sqrt #include // for std::decay @@ -74,13 +75,11 @@ class Euclidean_distance { * The points are assumed to have the same dimension. */ class Minimal_enclosing_ball_radius { public: - // boost::range_value is not SFINAE-friendly so we cannot use it in the return type template< typename Point > typename std::iterator_traits::type>::value_type operator()(const Point& p1, const Point& p2) const { return Euclidean_distance()(p1, p2) / 2.; } - // boost::range_value is not SFINAE-friendly so we cannot use it in the return type template< typename Point_cloud, typename Point_iterator = typename boost::range_const_iterator::type, typename Point= typename std::iterator_traits::value_type, @@ -90,11 +89,11 @@ class Minimal_enclosing_ball_radius { operator()(const Point_cloud& point_cloud) const { using Min_sphere = Miniball::Miniball>; - Min_sphere ms(point_cloud.begin()->end() - point_cloud.begin()->begin(), point_cloud.begin(),point_cloud.end()); + Min_sphere ms(boost::size(*point_cloud.begin()), point_cloud.begin(),point_cloud.end()); #ifdef DEBUG_TRACES std::cout << "Minimal_enclosing_ball_radius = " << std::sqrt(ms.squared_radius()) << " | nb points = " - << point_cloud.end() - point_cloud.begin() << " | dimension = " - << point_cloud.begin()->end() - point_cloud.begin()->begin() << std::endl; + << boost::size(point_cloud) << " | dimension = " + << boost::size(*point_cloud.begin()) << std::endl; #endif // DEBUG_TRACES return std::sqrt(ms.squared_radius()); -- cgit v1.2.3 From 90ea210d07afa9c48a19cdad0621d607b4ebd54b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Mar 2018 17:08:54 +0000 Subject: code review : no more ForwardPointRange copy. Use of a vector instead. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3306 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: f848c18595303bfb802998746ee6fe2a308c68df --- src/Cech_complex/include/gudhi/Cech_complex.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index bfad8b77..7c2e31ac 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -57,6 +57,9 @@ class Cech_complex { using Vertex_handle = typename SimplicialComplexForProximityGraph::Vertex_handle; using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value; using Proximity_graph = Gudhi::Proximity_graph; + using Point_iterator = typename boost::range_const_iterator::type; + using Point= typename std::iterator_traits::value_type; + using Point_cloud = std::vector; public: /** \brief Cech_complex constructor from a list of points. @@ -70,7 +73,7 @@ class Cech_complex { */ Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) : max_radius_(max_radius), - point_cloud_(points) { + point_cloud_(std::begin(points), std::end(points)) { cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, max_radius_, @@ -115,7 +118,7 @@ class Cech_complex { private: Proximity_graph cech_skeleton_graph_; Filtration_value max_radius_; - ForwardPointRange point_cloud_; + Point_cloud point_cloud_; }; } // namespace cech_complex -- cgit v1.2.3 From 7e3cfb3aad5ad38779e48f77dc2ba24014814dc9 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 27 Mar 2018 14:01:50 +0000 Subject: No more deep copy of the simplicial complex in the Cech Blocker, just use the pointer git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3307 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 026cd5491d8e3030fce63beabd6e77bddebb05cc --- src/Cech_complex/include/gudhi/Cech_complex.h | 2 +- src/Cech_complex/include/gudhi/Cech_complex_blocker.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 7c2e31ac..1cae7b0b 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -97,7 +97,7 @@ class Cech_complex { complex.insert_graph(cech_skeleton_graph_); // expand the graph until dimension dim_max complex.expansion_with_blockers(dim_max, - Cech_blocker(complex, this)); + Cech_blocker(&complex, this)); } /** @return max_radius value given at construction. */ diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index c082815d..6755c826 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -68,7 +68,7 @@ class Cech_blocker { * \return true if the simplex radius is greater than the Cech_complex max_radius*/ bool operator()(Simplex_handle sh) { Point_cloud points; - for (auto vertex : simplicial_complex_.simplex_vertex_range(sh)) { + for (auto vertex : sc_ptr_->simplex_vertex_range(sh)) { points.push_back(Point(cc_ptr_->point_iterator(vertex)->begin(), cc_ptr_->point_iterator(vertex)->end())); #ifdef DEBUG_TRACES @@ -80,17 +80,17 @@ class Cech_blocker { if (radius > cc_ptr_->max_radius()) std::cout << "radius > max_radius => expansion is blocked\n"; #endif // DEBUG_TRACES - simplicial_complex_.assign_filtration(sh, radius); + sc_ptr_->assign_filtration(sh, radius); return (radius > cc_ptr_->max_radius()); } /** \internal \brief Cech complex blocker constructor. */ - Cech_blocker(SimplicialComplexForCech& simplicial_complex, Cech_complex* cc_ptr) - : simplicial_complex_(simplicial_complex), + Cech_blocker(SimplicialComplexForCech* sc_ptr, Cech_complex* cc_ptr) + : sc_ptr_(sc_ptr), cc_ptr_(cc_ptr) { } private: - SimplicialComplexForCech simplicial_complex_; + SimplicialComplexForCech* sc_ptr_; Cech_complex* cc_ptr_; }; -- cgit v1.2.3 From df00c318bacd58ee48ddea6cdf161c35f0568873 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 9 Apr 2018 08:39:02 +0000 Subject: Add Miniball file changes for Gudhi requirements inside Miniball.README git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3353 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 099bc9ed544e5a81a5dc3a8dea3ce93afbfef82b --- src/Cech_complex/include/gudhi/Miniball.README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Cech_complex/include/gudhi/Miniball.README b/src/Cech_complex/include/gudhi/Miniball.README index 86a96f08..033d8953 100644 --- a/src/Cech_complex/include/gudhi/Miniball.README +++ b/src/Cech_complex/include/gudhi/Miniball.README @@ -21,3 +21,6 @@ Main Features: Easily integrates into your code. You can freely choose the coordinate type of your points and the container to store the points. If you still need to adapt the code, the header is small and readable and contains documentation for all major methods. +Changes done for the GUDHI version of MiniBall: + - Add include guard + - Move Miniball namespace inside a new Gudhi namespace -- cgit v1.2.3 From 1648030e27e828f92c6ae109c96190f986cdec8b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 9 Apr 2018 08:53:50 +0000 Subject: Doc review: Fix main page cech complex explaination git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3354 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0871ae5a851c40e880625a08f470277f93476864 --- src/common/doc/main_page.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h index 3851dde7..30d4e71b 100644 --- a/src/common/doc/main_page.h +++ b/src/common/doc/main_page.h @@ -42,8 +42,8 @@ - \subsection CechComplexDataStructure Cech complex - \image html "cech_complex_representation.png" "Cech complex representation" + \subsection CechComplexDataStructure Čech complex + \image html "cech_complex_representation.png" "Čech complex representation" -- cgit v1.2.3 From 9fe2e4671b2f1564a65a590702718100a9b93b8c Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 9 Apr 2018 09:13:56 +0000 Subject: Doc review : Fix links to Gudhi::Minimal_enclosing_ball_radius Improve the doc git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3356 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 886022b4addfe0b0993fbe2675adb527a0f57700 --- src/Cech_complex/doc/Intro_cech_complex.h | 15 +++++++-------- src/Cech_complex/utilities/cechcomplex.md | 17 +++++++++++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index ec0d35e2..a1d6f5dd 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -33,7 +33,7 @@ namespace cech_complex { * * @{ * - * \section cechdefinition Cech complex definition + * \section cechdefinition Čech complex definition * * Cech_complex * (Wikipedia) is a @@ -42,7 +42,8 @@ namespace cech_complex { * from it. * The input shall be a point cloud in an Euclidean space. * - * The filtration value of each edge of the `Gudhi::Proximity_graph` is computed from `Gudhi::Radius_distance` function. + * The filtration value of each edge of the `Gudhi::Proximity_graph` is computed from + * `Gudhi::Minimal_enclosing_ball_radius` function. * * All edges that have a filtration value strictly greater than a user given maximal radius value, \f$max\_radius\f$, * are not inserted into the complex. @@ -51,8 +52,8 @@ namespace cech_complex { * * \image html "cech_one_skeleton.png" "Cech complex proximity graph representation" * - * When creating a simplicial complex from this proximity graph, Cech inserts the proximity graph into the simplicial - * complex data structure, and then expands the simplicial complex when required. + * When creating a simplicial complex from this proximity graph, Cech_complex inserts the proximity graph into the + * simplicial complex data structure, and then expands the simplicial complex when required. * * On this example, as edges \f$(x,y)\f$, \f$(y,z)\f$ and \f$(z,y)\f$ are in the complex, the minimal ball radius * containing the points \f$(x,y,z)\f$ is computed. @@ -62,7 +63,7 @@ namespace cech_complex { * * And so on for higher dimensions. * - * \image html "cech_complex_representation.png" "Cech complex expansion" + * \image html "cech_complex_representation.png" "Čech complex expansion" * * The minimal ball radius computation is insured by * @@ -78,8 +79,6 @@ namespace cech_complex { * * cech_complex_step_by_step.cpp example, where the graph construction over the Simplex_tree is more detailed. * - * \section cechpointsdistance Point cloud - * * \subsection cechpointscloudexample Example from a point cloud * * This example builds the proximity graph from the given points, and maximal radius values. @@ -89,7 +88,7 @@ namespace cech_complex { * * \include Cech_complex/cech_complex_example_from_points.cpp * - * When launching (Cech maximal distance between 2 points is 1., is expanded until dimension 2): + * When launching (maximal enclosing ball radius is 1., is expanded until dimension 2): * * \code $> ./Cech_complex_example_from_points * \endcode diff --git a/src/Cech_complex/utilities/cechcomplex.md b/src/Cech_complex/utilities/cechcomplex.md index 6330727a..f7817dbb 100644 --- a/src/Cech_complex/utilities/cechcomplex.md +++ b/src/Cech_complex/utilities/cechcomplex.md @@ -1,13 +1,18 @@ -# Cech complex # +# Čech complex # ## cech_persistence ## -This program computes the persistent homology with coefficient field *Z/pZ* of a Cech complex defined on a set of input points, using Euclidean distance. The output diagram contains one bar per line, written with the convention: +This program computes the persistent homology with coefficient field *Z/pZ* of +a Čech complex defined on a set of input points, using Euclidean distance. The +output diagram contains one bar per line, written with the convention: `p dim birth death` -where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature, and `p` is the characteristic of the field *Z/pZ* used for homology coefficients (`p` must be a prime number). +where `dim` is the dimension of the homological feature, `birth` and `death` +are respectively the birth and death of the feature, and `p` is the +characteristic of the field *Z/pZ* used for homology coefficients (`p` must be +a prime number). **Usage** @@ -17,9 +22,9 @@ where `dim` is the dimension of the homological feature, `birth` and `death` are * `-h [ --help ]` Produce help message * `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output. -* `-r [ --max-edge-length ]` (default = inf) Maximal length of an edge for the Cech complex construction. -* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Cech complex we want to compute. -* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology. +* `-r [ --max-edge-length ]` (default = inf) Maximal length of an edge for the Čech complex construction. +* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Čech complex we want to compute. +* `-p [ --field-charac ]` (default = 11) Characteristic p of the 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. Beware: this program may use a lot of RAM and take a lot of time if `max-edge-length` is set to a large value. -- cgit v1.2.3 From f81e76fc676f79660cc47fbe96f5ee591cb169c9 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 9 Apr 2018 09:21:49 +0000 Subject: Add an algorithm section git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3357 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 17324da3ced1ff07a46b1c0d2abe782b5e706279 --- src/Cech_complex/doc/Intro_cech_complex.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index a1d6f5dd..244609a9 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -40,8 +40,11 @@ namespace cech_complex { * proximity graph that allows to construct a * simplicial complex * from it. + * * The input shall be a point cloud in an Euclidean space. * + * \subsection cechalgorithm Algorithm + * * The filtration value of each edge of the `Gudhi::Proximity_graph` is computed from * `Gudhi::Minimal_enclosing_ball_radius` function. * @@ -50,7 +53,7 @@ namespace cech_complex { * * Vertex name correspond to the index of the point in the given range (aka. the point cloud). * - * \image html "cech_one_skeleton.png" "Cech complex proximity graph representation" + * \image html "cech_one_skeleton.png" "Čech complex proximity graph representation" * * When creating a simplicial complex from this proximity graph, Cech_complex inserts the proximity graph into the * simplicial complex data structure, and then expands the simplicial complex when required. -- cgit v1.2.3 From a80c1adb219494f909e55ea274b39355218a5138 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 9 Apr 2018 12:14:26 +0000 Subject: Code review : Rename ForwardPointIterator with InputPointRange git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3358 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 6f90e228c4c546b28b9fe610e5f59bbab047cd27 --- src/Cech_complex/include/gudhi/Cech_complex.h | 14 +++++++------- src/Cech_complex/include/gudhi/Cech_complex_blocker.h | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 1cae7b0b..52f03d6b 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -48,16 +48,16 @@ namespace cech_complex { * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. * - * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input + * \tparam InputPointRange must be a range for which `std::begin()` and `std::end()` methods return input * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. */ -template +template class Cech_complex { private: using Vertex_handle = typename SimplicialComplexForProximityGraph::Vertex_handle; using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value; using Proximity_graph = Gudhi::Proximity_graph; - using Point_iterator = typename boost::range_const_iterator::type; + using Point_iterator = typename boost::range_const_iterator::type; using Point= typename std::iterator_traits::value_type; using Point_cloud = std::vector; @@ -67,11 +67,11 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] max_radius Maximal radius value. * - * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input + * \tparam InputPointRange must be a range for which `std::begin()` and `std::end()` methods return input * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. * */ - Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) + Cech_complex(const InputPointRange& points, Filtration_value max_radius) : max_radius_(max_radius), point_cloud_(std::begin(points), std::end(points)) { cech_skeleton_graph_ = @@ -97,7 +97,7 @@ class Cech_complex { complex.insert_graph(cech_skeleton_graph_); // expand the graph until dimension dim_max complex.expansion_with_blockers(dim_max, - Cech_blocker(&complex, this)); + Cech_blocker(&complex, this)); } /** @return max_radius value given at construction. */ @@ -109,7 +109,7 @@ class Cech_complex { * @return A const iterator on the point. * @exception std::out_of_range In debug mode, if point position in the range is out. */ - typename ForwardPointRange::const_iterator point_iterator(std::size_t vertex) const { + typename InputPointRange::const_iterator point_iterator(std::size_t vertex) const { GUDHI_CHECK((std::begin(point_cloud_) + vertex) < std::end(point_cloud_), std::out_of_range("Cech_complex::point - simplicial complex is not empty")); return (std::begin(point_cloud_) + vertex); diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 6755c826..ab56c10d 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -35,7 +35,7 @@ namespace Gudhi { namespace cech_complex { // Just declaring Cech_complex class because used and not yet defined. -template +template class Cech_complex; /** \internal @@ -50,16 +50,16 @@ class Cech_complex; * \tparam SimplicialComplexForProximityGraph furnishes `Simplex_handle` and `Filtration_value` type definition, * `simplex_vertex_range(Simplex_handle sh)`and `assign_filtration(Simplex_handle sh, Filtration_value filt)` methods. * - * \tparam ForwardPointRange is required by the pointer on Chech_complex for type definition. + * \tparam InputPointRange is required by the pointer on Chech_complex for type definition. */ -template +template class Cech_blocker { private: using Point = std::vector; using Point_cloud = std::vector; using Simplex_handle = typename SimplicialComplexForCech::Simplex_handle; using Filtration_value = typename SimplicialComplexForCech::Filtration_value; - using Cech_complex = Gudhi::cech_complex::Cech_complex; + using Cech_complex = Gudhi::cech_complex::Cech_complex; public: /** \internal \brief Cech complex blocker operator() - the oracle - assigns the filtration value from the simplex -- cgit v1.2.3 From 97460e6058ab032fefb13289eb29c97d4d106bf8 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 10 Apr 2018 07:30:38 +0000 Subject: Doc review : Separate global definition and a new section algorithm. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3360 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 88289d011e416c3b3d66faffbcaa3e07b910314c --- src/Cech_complex/doc/Intro_cech_complex.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index 244609a9..4d88a1e9 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -35,16 +35,16 @@ namespace cech_complex { * * \section cechdefinition Čech complex definition * - * Cech_complex + * Čech complex * (Wikipedia) is a - * proximity graph that allows to construct a - * simplicial complex - * from it. + * simplicial complex constructed + * from a proximity graph. The set of all simplices is filtered by the radius of their minimal enclosing ball. * * The input shall be a point cloud in an Euclidean space. * * \subsection cechalgorithm Algorithm * + * Cech_complex first builds a proximity graph from a point cloud. * The filtration value of each edge of the `Gudhi::Proximity_graph` is computed from * `Gudhi::Minimal_enclosing_ball_radius` function. * -- cgit v1.2.3 From 51ce9b513116f5fed2b4dc109f0b52595a2cd538 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 10 Apr 2018 14:53:20 +0000 Subject: Code review : Cech_blocker was hardcoding double replace point_iterator function in a get_point const function that returns a Point InputPointRange description Cech blocker is now templated with Cech complex, which is no more included. Deep copy of the point cloud on Cech complex ctor git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3365 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 93e3cf3fe61290b88a0714b9e55ad80e01a34f36 --- .../example/cech_complex_example_from_points.cpp | 1 - src/Cech_complex/include/gudhi/Cech_complex.h | 39 ++++++++++++++-------- .../include/gudhi/Cech_complex_blocker.h | 15 +++------ src/Cech_complex/test/test_cech_complex.cpp | 26 +++++---------- 4 files changed, 38 insertions(+), 43 deletions(-) diff --git a/src/Cech_complex/example/cech_complex_example_from_points.cpp b/src/Cech_complex/example/cech_complex_example_from_points.cpp index 3b889d56..2b36e33c 100644 --- a/src/Cech_complex/example/cech_complex_example_from_points.cpp +++ b/src/Cech_complex/example/cech_complex_example_from_points.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index 52f03d6b..abad0c21 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -54,11 +54,20 @@ namespace cech_complex { template class Cech_complex { private: + // Required by compute_proximity_graph using Vertex_handle = typename SimplicialComplexForProximityGraph::Vertex_handle; using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value; using Proximity_graph = Gudhi::Proximity_graph; - using Point_iterator = typename boost::range_const_iterator::type; - using Point= typename std::iterator_traits::value_type; + + // Retrieve Coordinate type from InputPointRange + using Point_from_range_iterator = typename boost::range_const_iterator::type; + using Point_from_range = typename std::iterator_traits::value_type; + using Coordinate_iterator = typename boost::range_const_iterator::type; + using Coordinate= typename std::iterator_traits::value_type; + + public: + // Point and Point_cloud type definition + using Point = std::vector; using Point_cloud = std::vector; public: @@ -67,13 +76,20 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] max_radius Maximal radius value. * - * \tparam InputPointRange must be a range for which `std::begin()` and `std::end()` methods return input - * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. + * \tparam InputPointRange must be a range of Point. Point must be a range of copyable Cartesian coordinates. * */ Cech_complex(const InputPointRange& points, Filtration_value max_radius) - : max_radius_(max_radius), - point_cloud_(std::begin(points), std::end(points)) { + : max_radius_(max_radius) { + // Point cloud deep copy + auto points_begin_itr = std::begin(points); + auto points_end_itr = std::end(points); + + point_cloud_.reserve(points_end_itr - points_begin_itr); + for (auto point_itr = points_begin_itr; point_itr < points_end_itr; point_itr++) { + point_cloud_.push_back(Point(std::begin(*point_itr), std::end(*point_itr))); + } + cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, max_radius_, @@ -97,7 +113,7 @@ class Cech_complex { complex.insert_graph(cech_skeleton_graph_); // expand the graph until dimension dim_max complex.expansion_with_blockers(dim_max, - Cech_blocker(&complex, this)); + Cech_blocker(&complex, this)); } /** @return max_radius value given at construction. */ @@ -106,13 +122,10 @@ class Cech_complex { } /** @param[in] vertex Point position in the range. - * @return A const iterator on the point. - * @exception std::out_of_range In debug mode, if point position in the range is out. + * @return The point. */ - typename InputPointRange::const_iterator point_iterator(std::size_t vertex) const { - GUDHI_CHECK((std::begin(point_cloud_) + vertex) < std::end(point_cloud_), - std::out_of_range("Cech_complex::point - simplicial complex is not empty")); - return (std::begin(point_cloud_) + vertex); + const Point& get_point(Vertex_handle vertex) const{ + return point_cloud_[vertex]; } private: diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index ab56c10d..2ecef9cf 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -23,7 +23,6 @@ #ifndef CECH_COMPLEX_BLOCKER_H_ #define CECH_COMPLEX_BLOCKER_H_ -#include // Cech_blocker is using a pointer on Gudhi::cech_complex::Cech_complex #include // for Gudhi::Minimal_enclosing_ball_radius #include @@ -34,10 +33,6 @@ namespace Gudhi { namespace cech_complex { -// Just declaring Cech_complex class because used and not yet defined. -template -class Cech_complex; - /** \internal * \class Cech_blocker * \brief Cech complex blocker. @@ -52,14 +47,13 @@ class Cech_complex; * * \tparam InputPointRange is required by the pointer on Chech_complex for type definition. */ -template +template class Cech_blocker { private: - using Point = std::vector; - using Point_cloud = std::vector; + using Point_cloud = typename Cech_complex::Point_cloud; + using Simplex_handle = typename SimplicialComplexForCech::Simplex_handle; using Filtration_value = typename SimplicialComplexForCech::Filtration_value; - using Cech_complex = Gudhi::cech_complex::Cech_complex; public: /** \internal \brief Cech complex blocker operator() - the oracle - assigns the filtration value from the simplex @@ -69,8 +63,7 @@ class Cech_blocker { bool operator()(Simplex_handle sh) { Point_cloud points; for (auto vertex : sc_ptr_->simplex_vertex_range(sh)) { - points.push_back(Point(cc_ptr_->point_iterator(vertex)->begin(), - cc_ptr_->point_iterator(vertex)->end())); + points.push_back(cc_ptr_->get_point(vertex)); #ifdef DEBUG_TRACES std::cout << "#(" << vertex << ")#"; #endif // DEBUG_TRACES diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index 8658729b..5ca25db4 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -78,11 +78,8 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(cech_complex_for_doc.max_radius(), max_radius); std::size_t i = 0; for (; i < points.size(); i++) { - BOOST_CHECK(points[i] == *(cech_complex_for_doc.point_iterator(i))); + BOOST_CHECK(points[i] == cech_complex_for_doc.get_point(i)); } -#ifdef GUDHI_DEBUG - BOOST_CHECK_THROW (cech_complex_for_doc.point_iterator(i+1), std::out_of_range); -#endif // GUDHI_DEBUG const int DIMENSION_1 = 1; Simplex_tree st; @@ -137,8 +134,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { Point_cloud points012; for (std::size_t vertex = 0; vertex <= 2; vertex++) { - points012.push_back(Point(cech_complex_for_doc.point_iterator(vertex)->begin(), - cech_complex_for_doc.point_iterator(vertex)->end())); + points012.push_back(cech_complex_for_doc.get_point(vertex)); } std::size_t dimension = points[0].end() - points[0].begin(); Min_sphere ms012(dimension, points012.begin(),points012.end()); @@ -149,12 +145,9 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(f012, std::sqrt(ms012.squared_radius())); Point_cloud points1410; - points1410.push_back(Point(cech_complex_for_doc.point_iterator(1)->begin(), - cech_complex_for_doc.point_iterator(1)->end())); - points1410.push_back(Point(cech_complex_for_doc.point_iterator(4)->begin(), - cech_complex_for_doc.point_iterator(4)->end())); - points1410.push_back(Point(cech_complex_for_doc.point_iterator(10)->begin(), - cech_complex_for_doc.point_iterator(10)->end())); + points1410.push_back(cech_complex_for_doc.get_point(1)); + points1410.push_back(cech_complex_for_doc.get_point(4)); + points1410.push_back(cech_complex_for_doc.get_point(10)); Min_sphere ms1410(dimension, points1410.begin(),points1410.end()); Simplex_tree::Filtration_value f1410 = st2.filtration(st2.find({1, 4, 10})); @@ -163,12 +156,9 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { GUDHI_TEST_FLOAT_EQUALITY_CHECK(f1410, std::sqrt(ms1410.squared_radius())); Point_cloud points469; - points469.push_back(Point(cech_complex_for_doc.point_iterator(4)->begin(), - cech_complex_for_doc.point_iterator(4)->end())); - points469.push_back(Point(cech_complex_for_doc.point_iterator(6)->begin(), - cech_complex_for_doc.point_iterator(6)->end())); - points469.push_back(Point(cech_complex_for_doc.point_iterator(9)->begin(), - cech_complex_for_doc.point_iterator(9)->end())); + points469.push_back(cech_complex_for_doc.get_point(4)); + points469.push_back(cech_complex_for_doc.get_point(6)); + points469.push_back(cech_complex_for_doc.get_point(9)); Min_sphere ms469(dimension, points469.begin(),points469.end()); Simplex_tree::Filtration_value f469 = st2.filtration(st2.find({4, 6, 9})); -- cgit v1.2.3 From f70b243734ccc904f75937b90a90db45203ba8ec Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 10 Apr 2018 15:03:41 +0000 Subject: Change tparam doc from Chech_complex_blocker git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3367 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 717baf604d7c639eabed28f4ad5639c4eac15dc1 --- src/Cech_complex/include/gudhi/Cech_complex_blocker.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 2ecef9cf..697d2246 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -35,17 +35,17 @@ namespace cech_complex { /** \internal * \class Cech_blocker - * \brief Cech complex blocker. + * \brief Čech complex blocker. * * \ingroup cech_complex * * \details - * Cech blocker is an oracle constructed from a Cech_complex and a simplicial complex. + * Čech blocker is an oracle constructed from a Cech_complex and a simplicial complex. * * \tparam SimplicialComplexForProximityGraph furnishes `Simplex_handle` and `Filtration_value` type definition, * `simplex_vertex_range(Simplex_handle sh)`and `assign_filtration(Simplex_handle sh, Filtration_value filt)` methods. * - * \tparam InputPointRange is required by the pointer on Chech_complex for type definition. + * \tparam Chech_complex is required by the blocker. */ template class Cech_blocker { @@ -56,7 +56,7 @@ class Cech_blocker { using Filtration_value = typename SimplicialComplexForCech::Filtration_value; public: - /** \internal \brief Cech complex blocker operator() - the oracle - assigns the filtration value from the simplex + /** \internal \brief Čech complex blocker operator() - the oracle - assigns the filtration value from the simplex * radius and returns if the simplex expansion must be blocked. * \param[in] sh The Simplex_handle. * \return true if the simplex radius is greater than the Cech_complex max_radius*/ @@ -77,7 +77,7 @@ class Cech_blocker { return (radius > cc_ptr_->max_radius()); } - /** \internal \brief Cech complex blocker constructor. */ + /** \internal \brief Čech complex blocker constructor. */ Cech_blocker(SimplicialComplexForCech* sc_ptr, Cech_complex* cc_ptr) : sc_ptr_(sc_ptr), cc_ptr_(cc_ptr) { -- cgit v1.2.3 From 9afff26c8f15121aa58eb1a1beacffc2a38cd477 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 10 Apr 2018 15:44:18 +0000 Subject: Doc review : Add explanation when to use Alpha or Cech. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3369 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 4b6cf58478a7dbe1825491681507d4304d8f3584 --- src/Alpha_complex/doc/Intro_alpha_complex.h | 8 ++++++-- src/Cech_complex/doc/Intro_cech_complex.h | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index a08663ca..a1092068 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -57,9 +57,13 @@ namespace alpha_complex { * href="http://doc.cgal.org/latest/Kernel_d/index.html#Chapter_dD_Geometry_Kernel">dD Geometry Kernel * \cite cgal:s-gkd-15b from CGAL as template parameter. * - * \remark When the simplicial complex is constructed with an infinite value of alpha, the complex is a Delaunay + * \remark + * - When the simplicial complex is constructed with an infinite value of alpha, the complex is a Delaunay * complex. - * + * - For people only interested in the topology of the \ref alpha_complex (for instance persistence), + * \ref alpha_complex is equivalent to the \ref cech_complex and much smaller if you do not bound the radii. + * \ref cech_complex can still make sense in higher dimension precisely because you can bound the radii. + * * \section pointsexample Example from points * * This example builds the Delaunay triangulation from the given points in a 2D static kernel, and creates a diff --git a/src/Cech_complex/doc/Intro_cech_complex.h b/src/Cech_complex/doc/Intro_cech_complex.h index 4d88a1e9..c2844bac 100644 --- a/src/Cech_complex/doc/Intro_cech_complex.h +++ b/src/Cech_complex/doc/Intro_cech_complex.h @@ -27,7 +27,7 @@ namespace Gudhi { namespace cech_complex { -/** \defgroup cech_complex Cech complex +/** \defgroup cech_complex Čech complex * * \author Vincent Rouvreau * @@ -42,6 +42,10 @@ namespace cech_complex { * * The input shall be a point cloud in an Euclidean space. * + * \remark For people only interested in the topology of the \ref cech_complex (for instance persistence), + * \ref alpha_complex is equivalent to the \ref cech_complex and much smaller if you do not bound the radii. + * \ref cech_complex can still make sense in higher dimension precisely because you can bound the radii. + * * \subsection cechalgorithm Algorithm * * Cech_complex first builds a proximity graph from a point cloud. -- cgit v1.2.3 From be6997e1cb3b7e6feeb3ece37437f02e6c60a18b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 10 Apr 2018 16:06:27 +0000 Subject: Doc review : Gudhi::Proximity_graph and Gudhi::Radius_distance must be links in the doc git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3370 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: fc57faf137316ae07e06491482e0756fbacaf479 --- src/common/include/gudhi/distance_functions.h | 22 ++++++++++++++++++++-- .../include/gudhi/graph_simplicial_complex.h | 6 ++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index 20b04000..9ab35fb1 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -75,11 +75,29 @@ class Euclidean_distance { * The points are assumed to have the same dimension. */ class Minimal_enclosing_ball_radius { public: + /** \brief Minimal_enclosing_ball_radius from two points. + * + * @param[in] point_1 First point. + * @param[in] point_2 second point. + * @return The minimal enclosing ball radius for the two points (aka. Euclidean distance / 2.). + * + * \tparam Point must be a range of Cartesian coordinates. + * + */ template< typename Point > typename std::iterator_traits::type>::value_type - operator()(const Point& p1, const Point& p2) const { - return Euclidean_distance()(p1, p2) / 2.; + operator()(const Point& point_1, const Point& point_2) const { + return Euclidean_distance()(point_1, point_2) / 2.; } + /** \brief Minimal_enclosing_ball_radius from a point cloud. + * + * @param[in] point_cloud The points. + * @return The minimal enclosing ball radius for the points. + * + * \tparam Point_cloud must be a range of points with Cartesian coordinates. + * Point_cloud is a range over a range of Coordinate. + * + */ template< typename Point_cloud, typename Point_iterator = typename boost::range_const_iterator::type, typename Point= typename std::iterator_traits::value_type, diff --git a/src/common/include/gudhi/graph_simplicial_complex.h b/src/common/include/gudhi/graph_simplicial_complex.h index d84421b2..a6126182 100644 --- a/src/common/include/gudhi/graph_simplicial_complex.h +++ b/src/common/include/gudhi/graph_simplicial_complex.h @@ -42,6 +42,12 @@ struct vertex_filtration_t { typedef boost::vertex_property_tag kind; }; +/** \brief Proximity_graph contains the vertices and edges with their filtration values in order to store the result + * of `Gudhi::compute_proximity_graph` function. + * + * \tparam SimplicialComplexForProximityGraph furnishes `Filtration_value` type definition. + * + */ template using Proximity_graph = typename boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS , boost::property < vertex_filtration_t, typename SimplicialComplexForProximityGraph::Filtration_value > -- cgit v1.2.3 -- cgit v1.2.3 From 3ce013afc21df5d05d663dd17a6640cec9af4aed Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 24 Apr 2018 12:31:44 +0000 Subject: Fix Python tangential complex version git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3392 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: f0d9e008229a6cd7868f4afd11eaf3c566e81adf --- src/cython/CMakeLists.txt | 2 +- src/cython/cython/tangential_complex.pyx | 15 +++++++++------ src/cython/doc/tangential_complex_user.rst | 7 ++++--- ...ential_complex_plain_homology_from_off_file_example.py | 5 +++-- src/cython/include/Tangential_complex_interface.h | 13 ++++--------- src/cython/test/test_tangential_complex.py | 2 +- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/cython/CMakeLists.txt b/src/cython/CMakeLists.txt index b19cc550..f9721b46 100644 --- a/src/cython/CMakeLists.txt +++ b/src/cython/CMakeLists.txt @@ -183,7 +183,7 @@ if(CYTHON_FOUND) WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}" ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/tangential_complex_plain_homology_from_off_file_example.py" - --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off) + --no-diagram -i 2 -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off) add_gudhi_py_test(test_tangential_complex) diff --git a/src/cython/cython/tangential_complex.pyx b/src/cython/cython/tangential_complex.pyx index d55bb050..44a3a96a 100644 --- a/src/cython/cython/tangential_complex.pyx +++ b/src/cython/cython/tangential_complex.pyx @@ -33,9 +33,9 @@ __license__ = "GPL v3" cdef extern from "Tangential_complex_interface.h" namespace "Gudhi": cdef cppclass Tangential_complex_interface "Gudhi::tangential_complex::Tangential_complex_interface": - Tangential_complex_interface(vector[vector[double]] points) + Tangential_complex_interface(int intrisic_dim, vector[vector[double]] points) # bool from_file is a workaround for cython to find the correct signature - Tangential_complex_interface(string off_file, bool from_file) + Tangential_complex_interface(int intrisic_dim, string off_file, bool from_file) vector[double] get_point(unsigned vertex) unsigned number_of_vertices() unsigned number_of_simplices() @@ -54,9 +54,12 @@ cdef class TangentialComplex: cdef Tangential_complex_interface * thisptr # Fake constructor that does nothing but documenting the constructor - def __init__(self, points=None, off_file=''): + def __init__(self, intrisic_dim, points=None, off_file=''): """TangentialComplex constructor. + :param intrisic_dim: Intrinsic dimension of the manifold. + :type intrisic_dim: integer + :param points: A list of points in d-Dimension. :type points: list of list of double @@ -67,17 +70,17 @@ cdef class TangentialComplex: """ # The real cython constructor - def __cinit__(self, points=None, off_file=''): + def __cinit__(self, intrisic_dim, points=None, off_file=''): if off_file is not '': if os.path.isfile(off_file): - self.thisptr = new Tangential_complex_interface(str.encode(off_file), True) + self.thisptr = new Tangential_complex_interface(intrisic_dim, str.encode(off_file), True) else: print("file " + off_file + " not found.") else: if points is None: # Empty tangential construction points=[] - self.thisptr = new Tangential_complex_interface(points) + self.thisptr = new Tangential_complex_interface(intrisic_dim, points) def __dealloc__(self): diff --git a/src/cython/doc/tangential_complex_user.rst b/src/cython/doc/tangential_complex_user.rst index efa6d7ce..fafb3193 100644 --- a/src/cython/doc/tangential_complex_user.rst +++ b/src/cython/doc/tangential_complex_user.rst @@ -122,8 +122,8 @@ This example builds the Tangential complex of point set read in an OFF file. .. testcode:: import gudhi - tc = gudhi.TangentialComplex(off_file=gudhi.__root_source_dir__ + \ - '/data/points/alphacomplexdoc.off') + tc = gudhi.TangentialComplex(intrisic_dim = 1, + off_file=gudhi.__root_source_dir__ + '/data/points/alphacomplexdoc.off') result_str = 'Tangential contains ' + repr(tc.num_simplices()) + \ ' simplices - ' + repr(tc.num_vertices()) + ' vertices.' print(result_str) @@ -169,7 +169,8 @@ simplices. .. testcode:: import gudhi - tc = gudhi.TangentialComplex(points=[[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]) + tc = gudhi.TangentialComplex(intrisic_dim = 1, + points=[[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]) result_str = 'Tangential contains ' + repr(tc.num_vertices()) + ' vertices.' print(result_str) diff --git a/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py b/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py index 6145e7f2..08ae5d07 100755 --- a/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py +++ b/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py @@ -33,10 +33,11 @@ parser = argparse.ArgumentParser(description='TangentialComplex creation from ' 'points read in a OFF file.', epilog='Example: ' 'example/tangential_complex_plain_homology_from_off_file_example.py ' - '-f ../data/points/tore3D_300.off' + '-f ../data/points/tore3D_300.off -i 3' '- Constructs a tangential complex with the ' 'points from the given OFF file') parser.add_argument("-f", "--file", type=str, required=True) +parser.add_argument("-i", "--intrisic_dim", type=int, required=True) parser.add_argument("-b", "--band_boot", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') @@ -48,7 +49,7 @@ with open(args.file, 'r') as f: print("#####################################################################") print("TangentialComplex creation from points read in a OFF file") - tc = gudhi.TangentialComplex(off_file=args.file) + tc = gudhi.TangentialComplex(intrisic_dim = args.intrisic_dim, off_file=args.file) st = tc.create_simplex_tree() message = "Number of simplices=" + repr(st.num_simplices()) diff --git a/src/cython/include/Tangential_complex_interface.h b/src/cython/include/Tangential_complex_interface.h index 0c3a510e..aef50424 100644 --- a/src/cython/include/Tangential_complex_interface.h +++ b/src/cython/include/Tangential_complex_interface.h @@ -45,24 +45,19 @@ class Tangential_complex_interface { using TC = Tangential_complex; public: - Tangential_complex_interface(const std::vector>& points) { + Tangential_complex_interface(int intrisic_dim, const std::vector>& points) { Dynamic_kernel k; - unsigned intrisic_dim = 0; - if (points.size() > 0) - intrisic_dim = points[0].size() - 1; tangential_complex_ = new TC(points, intrisic_dim, k); tangential_complex_->compute_tangential_complex(); num_inconsistencies_ = tangential_complex_->number_of_inconsistent_simplices(); } - Tangential_complex_interface(const std::string& off_file_name, bool from_file = true) { - Gudhi::Points_off_reader off_reader(off_file_name); + Tangential_complex_interface(int intrisic_dim, const std::string& off_file_name, bool from_file = true) { Dynamic_kernel k; - unsigned intrisic_dim = 0; + + Gudhi::Points_off_reader off_reader(off_file_name); std::vector points = off_reader.get_point_cloud(); - if (points.size() > 0) - intrisic_dim = points[0].size() - 1; tangential_complex_ = new TC(points, intrisic_dim, k); tangential_complex_->compute_tangential_complex(); diff --git a/src/cython/test/test_tangential_complex.py b/src/cython/test/test_tangential_complex.py index 8aa4023c..ca9d936d 100755 --- a/src/cython/test/test_tangential_complex.py +++ b/src/cython/test/test_tangential_complex.py @@ -29,7 +29,7 @@ __license__ = "GPL v3" def test_tangential(): point_list = [[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]] - tc = TangentialComplex(points=point_list) + tc = TangentialComplex(intrisic_dim = 1, points=point_list) assert tc.__is_defined() == True assert tc.num_vertices() == 4 -- cgit v1.2.3 From 62861adfd2de672d3d90e2fbade499fe76e5bca7 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 25 Apr 2018 06:50:12 +0000 Subject: persistence_pairs Python version git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3393 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 5ee633545ca5754b605cdd789ca9720f5936998a --- src/cython/cython/simplex_tree.pyx | 20 +++++++++++++++++ .../include/Persistent_cohomology_interface.h | 26 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/cython/cython/simplex_tree.pyx b/src/cython/cython/simplex_tree.pyx index 0cb575d2..755cdc02 100644 --- a/src/cython/cython/simplex_tree.pyx +++ b/src/cython/cython/simplex_tree.pyx @@ -64,6 +64,7 @@ cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi": vector[int] persistent_betti_numbers(double from_value, double to_value) vector[pair[double,double]] intervals_in_dimension(int dimension) void write_output_diagram(string diagram_file_name) + vector[pair[vector[int], vector[int]]] persistence_pairs() # SimplexTree python interface cdef class SimplexTree: @@ -486,6 +487,25 @@ cdef class SimplexTree: " to be launched first.") return intervals_result + def persistence_pairs(self): + """This function returns the persistence pairs of the simplicial + complex. + + :returns: The persistence intervals. + :rtype: list of pair of list of int + + :note: intervals_in_dim function requires + :func:`persistence()` + function to be launched first. + """ + cdef vector[pair[vector[int],vector[int]]] persistence_pairs_result + if self.pcohptr != NULL: + persistence_pairs_result = self.pcohptr.persistence_pairs() + else: + print("persistence_pairs function requires persistence function" + " to be launched first.") + return persistence_pairs_result + def write_persistence_diagram(self, persistence_file=''): """This function writes the persistence intervals of the simplicial complex in a user given file name. diff --git a/src/cython/include/Persistent_cohomology_interface.h b/src/cython/include/Persistent_cohomology_interface.h index 55028fd0..e8889444 100644 --- a/src/cython/include/Persistent_cohomology_interface.h +++ b/src/cython/include/Persistent_cohomology_interface.h @@ -85,6 +85,32 @@ persistent_cohomology::Persistent_cohomology, std::vector>> persistence_pairs() { + auto pairs = persistent_cohomology::Persistent_cohomology::get_persistent_pairs(); + + std::vector, std::vector>> persistence_pairs; + persistence_pairs.reserve(pairs.size()); + for (auto pair : pairs) { + std::vector birth; + if (get<0>(pair) != stptr_->null_simplex()) { + for (auto vertex : stptr_->simplex_vertex_range(get<0>(pair))) { + birth.push_back(vertex); + } + } + + std::vector death; + if (get<1>(pair) != stptr_->null_simplex()) { + for (auto vertex : stptr_->simplex_vertex_range(get<1>(pair))) { + death.push_back(vertex); + } + } + + persistence_pairs.push_back(std::make_pair(birth,death)); + } + return persistence_pairs; + } + private: // A copy FilteredComplex* stptr_; -- cgit v1.2.3 From 7ac3c086c6c794ac8c493a2c3abbd59624e81c06 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 27 Apr 2018 13:00:38 +0000 Subject: Code and doc review with IFPEN : plot_*: c'est quoi ce paramètre alpha ? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit band_boot: Renommer en 'band', sans référence au bootstrap. Ne pas l'utiliser dans la majorité des exemples / tutos. max_plots: mettre une valeur par défaut, pour éviter qu'on se retrouve trop facilement coincé à attendre 1h qu'il affiche des points. Éventuellement afficher un message indiquant que certains points n'ont pas été affichés et comment changer ça. barcode: trier les barres par date de naissance (le faire tout le temps ou avoir une option et le faire par défaut). git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3404 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: cfa775e425fbf12da1758d601ccbd80a2c7d3bc9 --- src/cython/cython/persistence_graphical_tools.py | 41 +++++++++++++--------- .../doc/persistence_graphical_tools_user.rst | 4 +-- src/cython/doc/pyplots/diagram_persistence.py | 2 +- ...ex_diagram_persistence_from_off_file_example.py | 4 +-- ...ex_diagram_persistence_from_off_file_example.py | 4 +-- ...ex_diagram_persistence_from_off_file_example.py | 4 +-- .../example/gudhi_graphical_tools_example.py | 2 +- ...istence_from_correlation_matrix_file_example.py | 4 +-- ...ersistence_from_distance_matrix_file_example.py | 4 +-- ...ex_diagram_persistence_from_off_file_example.py | 4 +-- ...complex_plain_homology_from_off_file_example.py | 4 +-- 11 files changed, 42 insertions(+), 35 deletions(-) diff --git a/src/cython/cython/persistence_graphical_tools.py b/src/cython/cython/persistence_graphical_tools.py index fb837e29..f7dadb53 100755 --- a/src/cython/cython/persistence_graphical_tools.py +++ b/src/cython/cython/persistence_graphical_tools.py @@ -28,13 +28,13 @@ __author__ = "Vincent Rouvreau, Bertrand Michel" __copyright__ = "Copyright (C) 2016 INRIA" __license__ = "GPL v3" -def __min_birth_max_death(persistence, band_boot=0.): +def __min_birth_max_death(persistence, band=0.): """This function returns (min_birth, max_death) from the persistence. :param persistence: The persistence to plot. :type persistence: list of tuples(dimension, tuple(birth, death)). - :param band_boot: bootstrap band - :type band_boot: float. + :param band: band + :type band: float. :returns: (float, float) -- (min_birth, max_death). """ # Look for minimum birth date and maximum death date for plot optimisation @@ -48,8 +48,8 @@ def __min_birth_max_death(persistence, band_boot=0.): max_death = float(interval[1][0]) if float(interval[1][0]) < min_birth: min_birth = float(interval[1][0]) - if band_boot > 0.: - max_death += band_boot + if band > 0.: + max_death += band return (min_birth, max_death) """ @@ -77,16 +77,17 @@ def show_palette_values(alpha=0.6): plt.title('Dimension palette values') return plt -def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max_barcodes=0): +def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max_barcodes=1000): """This function plots the persistence bar code. :param persistence: The persistence to plot. :type persistence: list of tuples(dimension, tuple(birth, death)). :param persistence_file: A persistence file style name (reset persistence if both are set). :type persistence_file: string - :param alpha: alpha value in [0.0, 1.0] for horizontal bars (default is 0.6). + :param alpha: barcode transparency value (0.0 transparent through 1.0 opaque - default is 0.6). :type alpha: float. - :param max_barcodes: number of maximal barcodes to be displayed + :param max_barcodes: number of maximal barcodes to be displayed. + Set it to 0 to see all, Default value is 1000. (persistence will be sorted by life time if max_barcodes is set) :type max_barcodes: int. :returns: plot -- An horizontal bar plot of persistence. @@ -107,6 +108,8 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max # Sort by life time, then takes only the max_plots elements persistence = sorted(persistence, key=lambda life_time: life_time[1][1]-life_time[1][0], reverse=True)[:max_barcodes] + persistence = sorted(persistence, key=lambda birth: birth[1][0]) + (min_birth, max_death) = __min_birth_max_death(persistence) ind = 0 delta = ((max_death - min_birth) / 10.0) @@ -120,12 +123,14 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max # Finite death case plt.barh(ind, (interval[1][1] - interval[1][0]), height=0.8, left = interval[1][0], alpha=alpha, - color = palette[interval[0]]) + color = palette[interval[0]], + linewidth=0) else: # Infinite death case for diagram to be nicer plt.barh(ind, (infinity - interval[1][0]), height=0.8, left = interval[1][0], alpha=alpha, - color = palette[interval[0]]) + color = palette[interval[0]], + linewidth=0) ind = ind + 1 plt.title('Persistence barcode') @@ -133,18 +138,20 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max plt.axis([axis_start, infinity, 0, ind]) return plt -def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, band_boot=0., max_plots=0): +def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, band=0., max_plots=1000): """This function plots the persistence diagram with an optional confidence band. :param persistence: The persistence to plot. :type persistence: list of tuples(dimension, tuple(birth, death)). :param persistence_file: A persistence file style name (reset persistence if both are set). :type persistence_file: string - :param alpha: alpha value in [0.0, 1.0] for points and horizontal infinity line (default is 0.6). + :param alpha: plot transparency value (0.0 transparent through 1.0 opaque - default is 0.6). :type alpha: float. - :param band_boot: bootstrap band (not displayed if :math:`\leq` 0.) - :type band_boot: float. + :param band: band (not displayed if :math:`\leq` 0. - default is 0.) + :type band: float. :param max_plots: number of maximal plots to be displayed + Set it to 0 to see all, Default value is 1000. + (persistence will be sorted by life time if max_plots is set) :type max_plots: int. :returns: plot -- A diagram plot of persistence. """ @@ -164,7 +171,7 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban # Sort by life time, then takes only the max_plots elements persistence = sorted(persistence, key=lambda life_time: life_time[1][1]-life_time[1][0], reverse=True)[:max_plots] - (min_birth, max_death) = __min_birth_max_death(persistence, band_boot) + (min_birth, max_death) = __min_birth_max_death(persistence, band) ind = 0 delta = ((max_death - min_birth) / 10.0) # Replace infinity values with max_death + delta for diagram to be more @@ -179,8 +186,8 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban plt.plot(x, [infinity] * len(x), linewidth=1.0, color='k', alpha=alpha) plt.text(axis_start, infinity, r'$\infty$', color='k', alpha=alpha) # bootstrap band - if band_boot > 0.: - plt.fill_between(x, x, x+band_boot, alpha=alpha, facecolor='red') + if band > 0.: + plt.fill_between(x, x, x+band, alpha=alpha, facecolor='red') # Draw points in loop for interval in reversed(persistence): diff --git a/src/cython/doc/persistence_graphical_tools_user.rst b/src/cython/doc/persistence_graphical_tools_user.rst index a5523d23..290b13c3 100644 --- a/src/cython/doc/persistence_graphical_tools_user.rst +++ b/src/cython/doc/persistence_graphical_tools_user.rst @@ -62,7 +62,7 @@ This function can display the persistence result as a diagram: rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() - plt = gudhi.plot_persistence_diagram(diag, band_boot=0.13) + plt = gudhi.plot_persistence_diagram(diag) plt.show() .. plot:: @@ -73,5 +73,5 @@ This function can display the persistence result as a diagram: rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() - plt = gudhi.plot_persistence_diagram(diag, band_boot=0.13) + plt = gudhi.plot_persistence_diagram(diag) plt.show() diff --git a/src/cython/doc/pyplots/diagram_persistence.py b/src/cython/doc/pyplots/diagram_persistence.py index ac20bf47..5abf52b9 100755 --- a/src/cython/doc/pyplots/diagram_persistence.py +++ b/src/cython/doc/pyplots/diagram_persistence.py @@ -5,5 +5,5 @@ point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + \ rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() -plt = gudhi.plot_persistence_diagram(diag, band_boot=0.13) +plt = gudhi.plot_persistence_diagram(diag) plt.show() diff --git a/src/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py b/src/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py index b4487be4..10d4867a 100755 --- a/src/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py +++ b/src/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py @@ -38,7 +38,7 @@ parser = argparse.ArgumentParser(description='AlphaComplex creation from ' 'points from the given OFF file.') parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-a", "--max_alpha_square", type=float, default=0.5) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -64,7 +64,7 @@ with open(args.file, 'r') as f: print(simplex_tree.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() else: print(args.file, "is not a valid OFF file") diff --git a/src/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py b/src/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py index e3f362dc..28a8599c 100755 --- a/src/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py +++ b/src/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py @@ -40,7 +40,7 @@ parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-a", "--max_alpha_square", type=float, required=True) parser.add_argument("-n", "--number_of_landmarks", type=int, required=True) parser.add_argument("-d", "--limit_dimension", type=int, required=True) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -71,7 +71,7 @@ with open(args.file, 'r') as f: print(simplex_tree.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() else: print(args.file, "is not a valid OFF file") diff --git a/src/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py b/src/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py index c236d992..b19d7d8c 100755 --- a/src/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py +++ b/src/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py @@ -40,7 +40,7 @@ parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-a", "--max_alpha_square", type=float, required=True) parser.add_argument("-n", "--number_of_landmarks", type=int, required=True) parser.add_argument("-d", "--limit_dimension", type=int, required=True) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -71,7 +71,7 @@ with open(args.file, 'r') as f: print(simplex_tree.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() else: print(args.file, "is not a valid OFF file") diff --git a/src/cython/example/gudhi_graphical_tools_example.py b/src/cython/example/gudhi_graphical_tools_example.py index ed87806b..97983262 100755 --- a/src/cython/example/gudhi_graphical_tools_example.py +++ b/src/cython/example/gudhi_graphical_tools_example.py @@ -50,5 +50,5 @@ pplot.show() print("#####################################################################") print("Show diagram persistence example with a confidence band") -pplot = gudhi.plot_persistence_diagram(persistence, band_boot=0.2) +pplot = gudhi.plot_persistence_diagram(persistence, band=0.2) pplot.show() diff --git a/src/cython/example/rips_complex_diagram_persistence_from_correlation_matrix_file_example.py b/src/cython/example/rips_complex_diagram_persistence_from_correlation_matrix_file_example.py index aa82ef71..0af4397a 100755 --- a/src/cython/example/rips_complex_diagram_persistence_from_correlation_matrix_file_example.py +++ b/src/cython/example/rips_complex_diagram_persistence_from_correlation_matrix_file_example.py @@ -40,7 +40,7 @@ parser = argparse.ArgumentParser(description='RipsComplex creation from ' parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-c", "--min_edge_correlation", type=float, default=0.5) parser.add_argument("-d", "--max_dimension", type=int, default=1) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -80,5 +80,5 @@ print(simplex_tree.betti_numbers()) invert_diag = [(diag[pers][0],(1.-diag[pers][1][0], 1.-diag[pers][1][1])) for pers in range(len(diag))] if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(invert_diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(invert_diag, band=args.band) pplot.show() diff --git a/src/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py b/src/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py index c8aac240..266c09ca 100755 --- a/src/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py +++ b/src/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py @@ -39,7 +39,7 @@ parser = argparse.ArgumentParser(description='RipsComplex creation from ' parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-e", "--max_edge_length", type=float, default=0.5) parser.add_argument("-d", "--max_dimension", type=int, default=1) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -63,5 +63,5 @@ print("betti_numbers()=") print(simplex_tree.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() diff --git a/src/cython/example/rips_complex_diagram_persistence_from_off_file_example.py b/src/cython/example/rips_complex_diagram_persistence_from_off_file_example.py index 544b68c9..fede920c 100755 --- a/src/cython/example/rips_complex_diagram_persistence_from_off_file_example.py +++ b/src/cython/example/rips_complex_diagram_persistence_from_off_file_example.py @@ -39,7 +39,7 @@ parser = argparse.ArgumentParser(description='RipsComplex creation from ' parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-e", "--max_edge_length", type=float, default=0.5) parser.add_argument("-d", "--max_dimension", type=int, default=1) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -66,7 +66,7 @@ with open(args.file, 'r') as f: print(simplex_tree.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() else: print(args.file, "is not a valid OFF file") diff --git a/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py b/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py index 08ae5d07..1f562b5c 100755 --- a/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py +++ b/src/cython/example/tangential_complex_plain_homology_from_off_file_example.py @@ -38,7 +38,7 @@ parser = argparse.ArgumentParser(description='TangentialComplex creation from ' 'points from the given OFF file') parser.add_argument("-f", "--file", type=str, required=True) parser.add_argument("-i", "--intrisic_dim", type=int, required=True) -parser.add_argument("-b", "--band_boot", type=float, default=0.) +parser.add_argument("-b", "--band", type=float, default=0.) parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams') args = parser.parse_args() @@ -61,7 +61,7 @@ with open(args.file, 'r') as f: print(st.betti_numbers()) if args.no_diagram == False: - pplot = gudhi.plot_persistence_diagram(diag, band_boot=args.band_boot) + pplot = gudhi.plot_persistence_diagram(diag, band=args.band) pplot.show() else: print(args.file, "is not a valid OFF file") -- cgit v1.2.3 From 50bff0fced63e298ae9952a192f8e1b70d9abfb8 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 27 Apr 2018 14:46:06 +0000 Subject: persistence_graphical_tools documentation clarification git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3405 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 5b38ba745e20585c35263e2880b8511299e11129 --- src/cython/cython/persistence_graphical_tools.py | 25 +++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/cython/cython/persistence_graphical_tools.py b/src/cython/cython/persistence_graphical_tools.py index f7dadb53..98e875b0 100755 --- a/src/cython/cython/persistence_graphical_tools.py +++ b/src/cython/cython/persistence_graphical_tools.py @@ -64,7 +64,8 @@ def show_palette_values(alpha=0.6): :param alpha: alpha value in [0.0, 1.0] for horizontal bars (default is 0.6). :type alpha: float. - :returns: plot the dimension palette values. + :returns: A matplotlib object containing dimension palette values (launch + `show()` method on it to display it). """ colors = [] for color in palette: @@ -78,11 +79,13 @@ def show_palette_values(alpha=0.6): return plt def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max_barcodes=1000): - """This function plots the persistence bar code. + """This function plots the persistence bar code from persistence values list + or from a :doc:`persistence file `. - :param persistence: The persistence to plot. + :param persistence: Persistence values list. :type persistence: list of tuples(dimension, tuple(birth, death)). - :param persistence_file: A persistence file style name (reset persistence if both are set). + :param persistence_file: A :doc:`persistence file ` style name + (reset persistence if both are set). :type persistence_file: string :param alpha: barcode transparency value (0.0 transparent through 1.0 opaque - default is 0.6). :type alpha: float. @@ -90,7 +93,8 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max Set it to 0 to see all, Default value is 1000. (persistence will be sorted by life time if max_barcodes is set) :type max_barcodes: int. - :returns: plot -- An horizontal bar plot of persistence. + :returns: A matplotlib object containing horizontal bar plot of persistence + (launch `show()` method on it to display it). """ if persistence_file is not '': if os.path.isfile(persistence_file): @@ -139,11 +143,13 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max return plt def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, band=0., max_plots=1000): - """This function plots the persistence diagram with an optional confidence band. + """This function plots the persistence diagram from persistence values list + or from a :doc:`persistence file `. - :param persistence: The persistence to plot. + :param persistence: Persistence values list. :type persistence: list of tuples(dimension, tuple(birth, death)). - :param persistence_file: A persistence file style name (reset persistence if both are set). + :param persistence_file: A :doc:`persistence file ` style name + (reset persistence if both are set). :type persistence_file: string :param alpha: plot transparency value (0.0 transparent through 1.0 opaque - default is 0.6). :type alpha: float. @@ -153,7 +159,8 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban Set it to 0 to see all, Default value is 1000. (persistence will be sorted by life time if max_plots is set) :type max_plots: int. - :returns: plot -- A diagram plot of persistence. + :returns: A matplotlib object containing diagram plot of persistence + (launch `show()` method on it to display it). """ if persistence_file is not '': if os.path.isfile(persistence_file): -- cgit v1.2.3 From 0902c35ad4701d78a91b30e2d055a529f4de01d5 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 27 Apr 2018 16:03:43 +0000 Subject: Remove show_palette_values Add legend flag to display the legend Set rips threshold to 0.3 for users not to be surprised when playing with threshold git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3406 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 03999711eafb81748a82b5725482a9f0d4307861 --- src/cython/cython/persistence_graphical_tools.py | 43 ++++++++++------------ src/cython/doc/persistence_graphical_tools_ref.rst | 1 - .../doc/persistence_graphical_tools_user.rst | 22 +---------- src/cython/doc/pyplots/diagram_persistence.py | 2 +- src/cython/doc/pyplots/show_palette_values.py | 3 -- .../example/gudhi_graphical_tools_example.py | 5 --- 6 files changed, 23 insertions(+), 53 deletions(-) delete mode 100755 src/cython/doc/pyplots/show_palette_values.py diff --git a/src/cython/cython/persistence_graphical_tools.py b/src/cython/cython/persistence_graphical_tools.py index 98e875b0..118fdd1a 100755 --- a/src/cython/cython/persistence_graphical_tools.py +++ b/src/cython/cython/persistence_graphical_tools.py @@ -1,4 +1,5 @@ import matplotlib.pyplot as plt +import matplotlib.patches as mpatches import numpy as np import os @@ -59,26 +60,8 @@ palette = ['#ff0000', '#00ff00', '#0000ff', '#00ffff', '#ff00ff', '#ffff00', '#000000', '#880000', '#008800', '#000088', '#888800', '#880088', '#008888'] -def show_palette_values(alpha=0.6): - """This function shows palette color values in function of the dimension. - - :param alpha: alpha value in [0.0, 1.0] for horizontal bars (default is 0.6). - :type alpha: float. - :returns: A matplotlib object containing dimension palette values (launch - `show()` method on it to display it). - """ - colors = [] - for color in palette: - colors.append(color) - - y_pos = np.arange(len(palette)) - - plt.barh(y_pos, y_pos + 1, align='center', alpha=alpha, color=colors) - plt.ylabel('Dimension') - plt.title('Dimension palette values') - return plt - -def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max_barcodes=1000): +def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, + max_barcodes=1000, inf_delta=0.1, legend=False): """This function plots the persistence bar code from persistence values list or from a :doc:`persistence file `. @@ -93,6 +76,9 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max Set it to 0 to see all, Default value is 1000. (persistence will be sorted by life time if max_barcodes is set) :type max_barcodes: int. + :param inf_delta: Infinity is placed at ((max_death - min_birth) x inf_delta). + A reasonable value is between 0.05 and 0.5 - default is 0.1. + :type inf_delta: float. :returns: A matplotlib object containing horizontal bar plot of persistence (launch `show()` method on it to display it). """ @@ -116,7 +102,7 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max (min_birth, max_death) = __min_birth_max_death(persistence) ind = 0 - delta = ((max_death - min_birth) / 10.0) + delta = ((max_death - min_birth) * inf_delta) # Replace infinity values with max_death + delta for bar code to be more # readable infinity = max_death + delta @@ -137,12 +123,16 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, max linewidth=0) ind = ind + 1 + if legend: + dimensions = list(set(item[0] for item in persistence)) + plt.legend(handles=[mpatches.Patch(color=palette[dim], label=str(dim)) for dim in dimensions]) plt.title('Persistence barcode') # Ends plot on infinity value and starts a little bit before min_birth plt.axis([axis_start, infinity, 0, ind]) return plt -def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, band=0., max_plots=1000): +def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, + band=0., max_plots=1000, inf_delta=0.1, legend=False): """This function plots the persistence diagram from persistence values list or from a :doc:`persistence file `. @@ -159,6 +149,9 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban Set it to 0 to see all, Default value is 1000. (persistence will be sorted by life time if max_plots is set) :type max_plots: int. + :param inf_delta: Infinity is placed at ((max_death - min_birth) x inf_delta). + A reasonable value is between 0.05 and 0.5 - default is 0.1. + :type inf_delta: float. :returns: A matplotlib object containing diagram plot of persistence (launch `show()` method on it to display it). """ @@ -180,7 +173,7 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban (min_birth, max_death) = __min_birth_max_death(persistence, band) ind = 0 - delta = ((max_death - min_birth) / 10.0) + delta = ((max_death - min_birth) * inf_delta) # Replace infinity values with max_death + delta for diagram to be more # readable infinity = max_death + delta @@ -208,6 +201,10 @@ def plot_persistence_diagram(persistence=[], persistence_file='', alpha=0.6, ban color = palette[interval[0]]) ind = ind + 1 + if legend: + dimensions = list(set(item[0] for item in persistence)) + plt.legend(handles=[mpatches.Patch(color=palette[dim], label=str(dim)) for dim in dimensions]) + plt.title('Persistence diagram') plt.xlabel('Birth') plt.ylabel('Death') diff --git a/src/cython/doc/persistence_graphical_tools_ref.rst b/src/cython/doc/persistence_graphical_tools_ref.rst index 27c2f68a..a69c8ba2 100644 --- a/src/cython/doc/persistence_graphical_tools_ref.rst +++ b/src/cython/doc/persistence_graphical_tools_ref.rst @@ -3,6 +3,5 @@ Persistence graphical tools reference manual ============================================ .. autofunction:: gudhi.__min_birth_max_death -.. autofunction:: gudhi.show_palette_values .. autofunction:: gudhi.plot_persistence_barcode .. autofunction:: gudhi.plot_persistence_diagram diff --git a/src/cython/doc/persistence_graphical_tools_user.rst b/src/cython/doc/persistence_graphical_tools_user.rst index 290b13c3..46f871c7 100644 --- a/src/cython/doc/persistence_graphical_tools_user.rst +++ b/src/cython/doc/persistence_graphical_tools_user.rst @@ -5,24 +5,6 @@ Definition .. include:: persistence_graphical_tools_sum.rst -Show palette values -------------------- - -This function is useful to show the color palette values of dimension: - - -.. testcode:: - - import gudhi - plt = gudhi.show_palette_values(alpha=1.0) - plt.show() - -.. plot:: - - import gudhi - plt = gudhi.show_palette_values(alpha=1.0) - plt.show() - Show persistence as a barcode ----------------------------- @@ -59,7 +41,7 @@ This function can display the persistence result as a diagram: import gudhi point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + '/data/points/tore3D_1307.off') - rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) + rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() plt = gudhi.plot_persistence_diagram(diag) @@ -70,7 +52,7 @@ This function can display the persistence result as a diagram: import gudhi point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + '/data/points/tore3D_1307.off') - rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) + rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() plt = gudhi.plot_persistence_diagram(diag) diff --git a/src/cython/doc/pyplots/diagram_persistence.py b/src/cython/doc/pyplots/diagram_persistence.py index 5abf52b9..3bab0ca1 100755 --- a/src/cython/doc/pyplots/diagram_persistence.py +++ b/src/cython/doc/pyplots/diagram_persistence.py @@ -2,7 +2,7 @@ import gudhi point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + \ '/data/points/tore3D_1307.off') -rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.2) +rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) diag = simplex_tree.persistence() plt = gudhi.plot_persistence_diagram(diag) diff --git a/src/cython/doc/pyplots/show_palette_values.py b/src/cython/doc/pyplots/show_palette_values.py deleted file mode 100755 index fdf9645f..00000000 --- a/src/cython/doc/pyplots/show_palette_values.py +++ /dev/null @@ -1,3 +0,0 @@ -import gudhi -plt = gudhi.show_palette_values(alpha=1.0) -plt.show() diff --git a/src/cython/example/gudhi_graphical_tools_example.py b/src/cython/example/gudhi_graphical_tools_example.py index 97983262..d21d44c2 100755 --- a/src/cython/example/gudhi_graphical_tools_example.py +++ b/src/cython/example/gudhi_graphical_tools_example.py @@ -28,11 +28,6 @@ __author__ = "Vincent Rouvreau" __copyright__ = "Copyright (C) 2016 INRIA" __license__ = "GPL v3" -print("#####################################################################") -print("Show palette colors values for dimension") - -gudhi.show_palette_values() - print("#####################################################################") print("Show barcode persistence example") -- cgit v1.2.3 From 71840751fcd4771d126c0ebe2f63a02c14e67186 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 2 May 2018 08:00:44 +0000 Subject: Add Python Simplex_tree make_filtration_non_decreasing interface and its tests git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3409 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 6a3af66b3d90c6114886e54c5c34287a13f4b863 --- src/cython/cython/simplex_tree.pyx | 23 +++++++++++++++++++ src/cython/test/test_simplex_tree.py | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/cython/cython/simplex_tree.pyx b/src/cython/cython/simplex_tree.pyx index 755cdc02..38740f4f 100644 --- a/src/cython/cython/simplex_tree.pyx +++ b/src/cython/cython/simplex_tree.pyx @@ -55,6 +55,7 @@ cdef extern from "Simplex_tree_interface.h" namespace "Gudhi": void expansion(int max_dim) void remove_maximal_simplex(vector[int] simplex) bool prune_above_filtration(double filtration) + bool make_filtration_non_decreasing() cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi": cdef cppclass Simplex_tree_persistence_interface "Gudhi::Persistent_cohomology_interface>": @@ -400,6 +401,28 @@ cdef class SimplexTree: """ self.thisptr.expansion(max_dim) + def make_filtration_non_decreasing(self): + """Browse the simplex tree to ensure the filtration is not decreasing. + The simplex tree is browsed starting from the root until the leaf, and + the filtration values are set with their parent value (increased), in + case the values are decreasing. + + :returns: The filtration modification information. + :rtype: bint + + + .. note:: + + Some simplex tree functions require the filtration to be valid. + make_filtration_non_decreasing function is not launching + :func:`initialize_filtration()` + but returns the filtration modification + information. If the complex has changed , please call + :func:`initialize_filtration()` + to recompute it. + """ + return self.thisptr.make_filtration_non_decreasing() + def persistence(self, homology_coeff_field=11, min_persistence=0, persistence_dim_max = False): """This function returns the persistence of the simplicial complex. diff --git a/src/cython/test/test_simplex_tree.py b/src/cython/test/test_simplex_tree.py index 6dec5d94..bc16183a 100755 --- a/src/cython/test/test_simplex_tree.py +++ b/src/cython/test/test_simplex_tree.py @@ -161,3 +161,47 @@ def test_automatic_dimension(): assert st.upper_bound_dimension() == 2 assert st.dimension() == 1 assert st.upper_bound_dimension() == 1 + +def test_make_filtration_non_decreasing(): + st = SimplexTree() + assert st.__is_defined() == True + assert st.__is_persistence_defined() == False + + # Inserted simplex: + # 1 + # o + # /X\ + # o---o---o---o + # 2 0 3\X/4 + # o + # 5 + assert st.insert([2, 1, 0], filtration=2.0) == True + assert st.insert([3, 0], filtration=2.0) == True + assert st.insert([3, 4, 5], filtration=2.0) == True + + assert st.make_filtration_non_decreasing() == False + + # Because of non decreasing property of simplex tree, { 0 } , { 1 } and + # { 0, 1 } are going to be set from value 2.0 to 1.0 + st.insert([0, 1, 6, 7], filtration=1.0); + + assert st.make_filtration_non_decreasing() == False + + # Modify specific values to test make_filtration_non_decreasing + st.assign_filtration([0,1,6,7], 0.8); + st.assign_filtration([0,1,6], 0.9); + st.assign_filtration([0,6], 0.6); + st.assign_filtration([3,4,5], 1.2); + st.assign_filtration([3,4], 1.1); + st.assign_filtration([4,5], 1.99); + + assert st.make_filtration_non_decreasing() == True + + assert st.filtration([0,1,6,7]) == 1. + assert st.filtration([0,1,6]) == 1. + assert st.filtration([0,1]) == 1. + assert st.filtration([0]) == 1. + assert st.filtration([1]) == 1. + assert st.filtration([3,4,5]) == 2. + assert st.filtration([3,4]) == 2. + assert st.filtration([4,5]) == 2. -- cgit v1.2.3 From 153686a6c0a103fc90924eacc954b4a1691a0c9f Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 14 May 2018 05:53:16 +0000 Subject: Fix CGAL 4.12 build errors - include missing git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3435 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 59e1e78f26032154a8b81146b0f4d5b4ecead992 --- src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp | 2 ++ src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp | 2 ++ src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp | 2 ++ src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp | 2 ++ .../utilities/weighted_periodic_alpha_complex_3d_persistence.cpp | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp index efa20db9..8cda0b70 100644 --- a/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp +++ b/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include #include diff --git a/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp index 54c074c4..cbe003ff 100644 --- a/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp +++ b/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include #include diff --git a/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp index 7c6e1583..11010701 100644 --- a/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp +++ b/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include diff --git a/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp index 54483819..cdeeabfc 100644 --- a/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp +++ b/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include // For CGAL < 4.11 diff --git a/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp index f03f29a7..d030c88c 100644 --- a/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp +++ b/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include -- cgit v1.2.3 -- cgit v1.2.3 From 00a3424bd68ced3e2d159acf8b2e73f515a3d88b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 15 May 2018 19:55:31 +0000 Subject: CMake minimal version is now 3.1 Compilation flags are now externalized in cmake/modules Add NO_POLICY_SCOPE for GUDHI_third_parties to fix warnings Try to fix CGAL 4.12 that is no more setting CGAL_LIBRARIES git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cmake_v3_vincent@3445 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0ac7613f016e28cc634606f76e85ecaf5bacb2d4 --- CMakeLists.txt | 29 ++++------------ src/Alpha_complex/example/CMakeLists.txt | 1 - src/Alpha_complex/test/CMakeLists.txt | 1 - src/Alpha_complex/utilities/CMakeLists.txt | 1 - src/Bitmap_cubical_complex/example/CMakeLists.txt | 1 - src/Bitmap_cubical_complex/test/CMakeLists.txt | 1 - .../utilities/CMakeLists.txt | 1 - src/Bottleneck_distance/benchmark/CMakeLists.txt | 1 - src/Bottleneck_distance/example/CMakeLists.txt | 1 - src/Bottleneck_distance/test/CMakeLists.txt | 1 - src/Bottleneck_distance/utilities/CMakeLists.txt | 1 - src/CMakeLists.txt | 39 ++++++---------------- src/Contraction/example/CMakeLists.txt | 1 - src/GudhUI/CMakeLists.txt | 3 +- src/Nerve_GIC/example/CMakeLists.txt | 7 ++-- src/Nerve_GIC/test/CMakeLists.txt | 1 - src/Nerve_GIC/utilities/CMakeLists.txt | 1 - .../example/CMakeLists.txt | 1 - .../test/CMakeLists.txt | 1 - .../utilities/persistence_heat_maps/CMakeLists.txt | 1 - .../utilities/persistence_intervals/CMakeLists.txt | 1 - .../persistence_landscapes/CMakeLists.txt | 1 - .../persistence_landscapes_on_grid/CMakeLists.txt | 1 - .../utilities/persistence_vectors/CMakeLists.txt | 1 - src/Persistent_cohomology/benchmark/CMakeLists.txt | 2 -- src/Persistent_cohomology/example/CMakeLists.txt | 1 - src/Persistent_cohomology/test/CMakeLists.txt | 1 - src/Rips_complex/example/CMakeLists.txt | 1 - src/Rips_complex/test/CMakeLists.txt | 1 - src/Rips_complex/utilities/CMakeLists.txt | 1 - src/Simplex_tree/example/CMakeLists.txt | 1 - src/Simplex_tree/test/CMakeLists.txt | 1 - src/Skeleton_blocker/example/CMakeLists.txt | 1 - src/Skeleton_blocker/test/CMakeLists.txt | 1 - src/Spatial_searching/example/CMakeLists.txt | 1 - src/Spatial_searching/test/CMakeLists.txt | 1 - src/Subsampling/example/CMakeLists.txt | 1 - src/Subsampling/test/CMakeLists.txt | 1 - src/Tangential_complex/benchmark/CMakeLists.txt | 1 - src/Tangential_complex/example/CMakeLists.txt | 1 - src/Tangential_complex/test/CMakeLists.txt | 1 - src/Witness_complex/example/CMakeLists.txt | 1 - src/Witness_complex/test/CMakeLists.txt | 1 - src/Witness_complex/utilities/CMakeLists.txt | 1 - src/cmake/modules/GUDHI_compilation_flags.cmake | 36 ++++++++++++++++++++ src/common/example/CMakeLists.txt | 1 - src/common/test/CMakeLists.txt | 1 - src/common/utilities/CMakeLists.txt | 1 - src/cython/CMakeLists.txt | 6 ++-- 49 files changed, 60 insertions(+), 104 deletions(-) create mode 100644 src/cmake/modules/GUDHI_compilation_flags.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 10373f75..08291b54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,35 +1,18 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.1) + project(GUDHIdev) include(CMakeGUDHIVersion.txt) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/") -enable_testing() - -# This variable is used by Cython CMakeLists.txt to know its path +# This variable is used by Cython CMakeLists.txt and by GUDHI_third_party_libraries to know its path set(GUDHI_CYTHON_PATH "src/cython") -# For third parties libraries management - To be done last as CGAL updates CMAKE_MODULE_PATH -include(GUDHI_third_party_libraries) - -if(MSVC) - # Turn off some VC++ warnings - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018") -else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic") -endif() -if(CMAKE_BUILD_TYPE MATCHES Debug) - message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") -else() - message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") -endif() +# For third parties libraries management - To be done last as CGAL updates CMAKE_MODULE_PATH +include(GUDHI_third_party_libraries NO_POLICY_SCOPE) -if (DEBUG_TRACES) - # For programs to be more verbose - message(STATUS "DEBUG_TRACES are activated") - add_definitions(-DDEBUG_TRACES) -endif() +include(GUDHI_compilation_flags) # Add your new module in the list, order is not important include(GUDHI_modules) diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt index 5bf553e9..2fc62452 100644 --- a/src/Alpha_complex/example/CMakeLists.txt +++ b/src/Alpha_complex/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Alpha_complex_examples) # need CGAL 4.7 diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt index 9e0b3b3c..9255d3db 100644 --- a/src/Alpha_complex/test/CMakeLists.txt +++ b/src/Alpha_complex/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Alpha_complex_tests) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0) diff --git a/src/Alpha_complex/utilities/CMakeLists.txt b/src/Alpha_complex/utilities/CMakeLists.txt index a2dfac20..7ace6064 100644 --- a/src/Alpha_complex/utilities/CMakeLists.txt +++ b/src/Alpha_complex/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Alpha_complex_utilities) if(CGAL_FOUND) diff --git a/src/Bitmap_cubical_complex/example/CMakeLists.txt b/src/Bitmap_cubical_complex/example/CMakeLists.txt index 99304aa4..dc659f2d 100644 --- a/src/Bitmap_cubical_complex/example/CMakeLists.txt +++ b/src/Bitmap_cubical_complex/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bitmap_cubical_complex_examples) add_executable ( Random_bitmap_cubical_complex Random_bitmap_cubical_complex.cpp ) diff --git a/src/Bitmap_cubical_complex/test/CMakeLists.txt b/src/Bitmap_cubical_complex/test/CMakeLists.txt index 02b026f2..8b43632a 100644 --- a/src/Bitmap_cubical_complex/test/CMakeLists.txt +++ b/src/Bitmap_cubical_complex/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bitmap_cubical_complex_tests) include(GUDHI_test_coverage) diff --git a/src/Bitmap_cubical_complex/utilities/CMakeLists.txt b/src/Bitmap_cubical_complex/utilities/CMakeLists.txt index 676a730a..416db67f 100644 --- a/src/Bitmap_cubical_complex/utilities/CMakeLists.txt +++ b/src/Bitmap_cubical_complex/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bitmap_cubical_complex_utilities) add_executable ( cubical_complex_persistence cubical_complex_persistence.cpp ) diff --git a/src/Bottleneck_distance/benchmark/CMakeLists.txt b/src/Bottleneck_distance/benchmark/CMakeLists.txt index 20a4e47b..3105a1d5 100644 --- a/src/Bottleneck_distance/benchmark/CMakeLists.txt +++ b/src/Bottleneck_distance/benchmark/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bottleneck_distance_benchmark) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) diff --git a/src/Bottleneck_distance/example/CMakeLists.txt b/src/Bottleneck_distance/example/CMakeLists.txt index 6095d6eb..c6f10127 100644 --- a/src/Bottleneck_distance/example/CMakeLists.txt +++ b/src/Bottleneck_distance/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bottleneck_distance_examples) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) diff --git a/src/Bottleneck_distance/test/CMakeLists.txt b/src/Bottleneck_distance/test/CMakeLists.txt index 2676b82c..bb739280 100644 --- a/src/Bottleneck_distance/test/CMakeLists.txt +++ b/src/Bottleneck_distance/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bottleneck_distance_tests) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) diff --git a/src/Bottleneck_distance/utilities/CMakeLists.txt b/src/Bottleneck_distance/utilities/CMakeLists.txt index d19e3b1c..2f35885c 100644 --- a/src/Bottleneck_distance/utilities/CMakeLists.txt +++ b/src/Bottleneck_distance/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Bottleneck_distance_utilities) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 94587044..5d543018 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,12 +1,19 @@ -cmake_minimum_required(VERSION 2.6) -project(GUDHI) +cmake_minimum_required(VERSION 3.1) -include("CMakeGUDHIVersion.txt") +project(GUDHI) -enable_testing() +include(CMakeGUDHIVersion.txt) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/") +# This variable is used by Cython CMakeLists.txt and by GUDHI_third_party_libraries to know its path +set(GUDHI_CYTHON_PATH "cython") + +# For third parties libraries management - To be done last as CGAL updates CMAKE_MODULE_PATH +include(GUDHI_third_party_libraries NO_POLICY_SCOPE) + +include(GUDHI_compilation_flags) + # Add your new module in the list, order is not important include(GUDHI_modules) @@ -33,30 +40,6 @@ message("++ GUDHI_MODULES list is:\"${GUDHI_MODULES}\"") set(GUDHI_USER_VERSION_DIR ${CMAKE_SOURCE_DIR}) include(GUDHI_doxygen_target) -# This variable is used by Cython CMakeLists.txt to know its path -set(GUDHI_CYTHON_PATH "cython") -# For third parties libraries management - To be done last as CGAL updates CMAKE_MODULE_PATH -include(GUDHI_third_party_libraries) - -if(MSVC) - # Turn off some VC++ warnings - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018") -else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic") -endif() - -if(CMAKE_BUILD_TYPE MATCHES Debug) - message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") -else() - message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") -endif() - -if (DEBUG_TRACES) - message(STATUS "DEBUG_TRACES are activated") - # For programs to be more verbose - add_definitions(-DDEBUG_TRACES) -endif() - #--------------------------------------------------------------------------------------- # Gudhi compilation part include_directories(include) diff --git a/src/Contraction/example/CMakeLists.txt b/src/Contraction/example/CMakeLists.txt index a92d1685..582b7ab8 100644 --- a/src/Contraction/example/CMakeLists.txt +++ b/src/Contraction/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Contraction_examples) add_executable(RipsContraction Rips_contraction.cpp) diff --git a/src/GudhUI/CMakeLists.txt b/src/GudhUI/CMakeLists.txt index 2503a03e..b357b8f7 100644 --- a/src/GudhUI/CMakeLists.txt +++ b/src/GudhUI/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.8) project(GudhUI) # Need to find OpenGL first as find_package(Qt5) tries to #include"GL/gl.h" on some platforms @@ -38,4 +37,4 @@ if (OPENGL_FOUND) install(TARGETS GudhUI DESTINATION bin) endif() -endif(OPENGL_FOUND) \ No newline at end of file +endif(OPENGL_FOUND) diff --git a/src/Nerve_GIC/example/CMakeLists.txt b/src/Nerve_GIC/example/CMakeLists.txt index 542c6af4..fdecf86e 100644 --- a/src/Nerve_GIC/example/CMakeLists.txt +++ b/src/Nerve_GIC/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Nerve_GIC_examples) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) @@ -17,11 +16,11 @@ if (NOT CGAL_VERSION VERSION_LESS 4.8.1) file(COPY "${CMAKE_SOURCE_DIR}/data/points/COIL_database/lucky_cat_PCA1" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) add_test(NAME Nerve_GIC_example_CoordGIC COMMAND $ - "tore3D_1307.off" "0") + "${CMAKE_CURRENT_BINARY_DIR}/tore3D_1307.off" "0") add_test(NAME Nerve_GIC_example_FuncGIC COMMAND $ - "lucky_cat.off" - "lucky_cat_PCA1") + "${CMAKE_CURRENT_BINARY_DIR}/lucky_cat.off" + "${CMAKE_CURRENT_BINARY_DIR}/lucky_cat_PCA1") install(TARGETS CoordGIC DESTINATION bin) install(TARGETS FuncGIC DESTINATION bin) diff --git a/src/Nerve_GIC/test/CMakeLists.txt b/src/Nerve_GIC/test/CMakeLists.txt index c35cdff7..99263ea0 100644 --- a/src/Nerve_GIC/test/CMakeLists.txt +++ b/src/Nerve_GIC/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Graph_induced_complex_tests) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) diff --git a/src/Nerve_GIC/utilities/CMakeLists.txt b/src/Nerve_GIC/utilities/CMakeLists.txt index 7a838a8c..215f9dfd 100644 --- a/src/Nerve_GIC/utilities/CMakeLists.txt +++ b/src/Nerve_GIC/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Nerve_GIC_examples) if (NOT CGAL_VERSION VERSION_LESS 4.8.1) diff --git a/src/Persistence_representations/example/CMakeLists.txt b/src/Persistence_representations/example/CMakeLists.txt index 54d719ac..33558df3 100644 --- a/src/Persistence_representations/example/CMakeLists.txt +++ b/src/Persistence_representations/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_example) add_executable ( Persistence_representations_example_landscape_on_grid persistence_landscape_on_grid.cpp ) diff --git a/src/Persistence_representations/test/CMakeLists.txt b/src/Persistence_representations/test/CMakeLists.txt index 335a71ef..5e2b6910 100644 --- a/src/Persistence_representations/test/CMakeLists.txt +++ b/src/Persistence_representations/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_test) include(GUDHI_test_coverage) diff --git a/src/Persistence_representations/utilities/persistence_heat_maps/CMakeLists.txt b/src/Persistence_representations/utilities/persistence_heat_maps/CMakeLists.txt index 386e9fa5..89ef232f 100644 --- a/src/Persistence_representations/utilities/persistence_heat_maps/CMakeLists.txt +++ b/src/Persistence_representations/utilities/persistence_heat_maps/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_heat_maps_utilities) add_persistence_representation_creation_utility(create_pssk "10" "-1" "-1" "4" "-1") diff --git a/src/Persistence_representations/utilities/persistence_intervals/CMakeLists.txt b/src/Persistence_representations/utilities/persistence_intervals/CMakeLists.txt index 875ff45e..649b72cb 100644 --- a/src/Persistence_representations/utilities/persistence_intervals/CMakeLists.txt +++ b/src/Persistence_representations/utilities/persistence_intervals/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_intervals_utilities) diff --git a/src/Persistence_representations/utilities/persistence_landscapes/CMakeLists.txt b/src/Persistence_representations/utilities/persistence_landscapes/CMakeLists.txt index d7087ed8..6b24d032 100644 --- a/src/Persistence_representations/utilities/persistence_landscapes/CMakeLists.txt +++ b/src/Persistence_representations/utilities/persistence_landscapes/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_landscapes_utilities) add_persistence_representation_creation_utility(create_landscapes "-1") diff --git a/src/Persistence_representations/utilities/persistence_landscapes_on_grid/CMakeLists.txt b/src/Persistence_representations/utilities/persistence_landscapes_on_grid/CMakeLists.txt index c5ea4bbf..36f3196b 100644 --- a/src/Persistence_representations/utilities/persistence_landscapes_on_grid/CMakeLists.txt +++ b/src/Persistence_representations/utilities/persistence_landscapes_on_grid/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_representations_lanscapes_on_grid_utilities) # Need to set grid min and max for further average, distance and scalar_product diff --git a/src/Persistence_representations/utilities/persistence_vectors/CMakeLists.txt b/src/Persistence_representations/utilities/persistence_vectors/CMakeLists.txt index a401c955..bc982094 100644 --- a/src/Persistence_representations/utilities/persistence_vectors/CMakeLists.txt +++ b/src/Persistence_representations/utilities/persistence_vectors/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistence_vectors_utilities) add_persistence_representation_creation_utility(create_persistence_vectors "-1") diff --git a/src/Persistent_cohomology/benchmark/CMakeLists.txt b/src/Persistent_cohomology/benchmark/CMakeLists.txt index 8b135ba1..2bb3b0c7 100644 --- a/src/Persistent_cohomology/benchmark/CMakeLists.txt +++ b/src/Persistent_cohomology/benchmark/CMakeLists.txt @@ -1,6 +1,4 @@ -cmake_minimum_required(VERSION 2.6) project(Persistent_cohomology_benchmark) - if(GMP_FOUND) if(GMPXX_FOUND) diff --git a/src/Persistent_cohomology/example/CMakeLists.txt b/src/Persistent_cohomology/example/CMakeLists.txt index 18e2913b..0f731519 100644 --- a/src/Persistent_cohomology/example/CMakeLists.txt +++ b/src/Persistent_cohomology/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistent_cohomology_examples) add_executable(plain_homology plain_homology.cpp) diff --git a/src/Persistent_cohomology/test/CMakeLists.txt b/src/Persistent_cohomology/test/CMakeLists.txt index 45f53eb9..f8baf861 100644 --- a/src/Persistent_cohomology/test/CMakeLists.txt +++ b/src/Persistent_cohomology/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Persistent_cohomology_tests) include(GUDHI_test_coverage) diff --git a/src/Rips_complex/example/CMakeLists.txt b/src/Rips_complex/example/CMakeLists.txt index af86636b..e7772bdb 100644 --- a/src/Rips_complex/example/CMakeLists.txt +++ b/src/Rips_complex/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Rips_complex_examples) # Point cloud diff --git a/src/Rips_complex/test/CMakeLists.txt b/src/Rips_complex/test/CMakeLists.txt index 3da9c90d..745d953c 100644 --- a/src/Rips_complex/test/CMakeLists.txt +++ b/src/Rips_complex/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Rips_complex_tests) include(GUDHI_test_coverage) diff --git a/src/Rips_complex/utilities/CMakeLists.txt b/src/Rips_complex/utilities/CMakeLists.txt index deb73ff0..4b565628 100644 --- a/src/Rips_complex/utilities/CMakeLists.txt +++ b/src/Rips_complex/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Rips_complex_utilities) add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp) diff --git a/src/Simplex_tree/example/CMakeLists.txt b/src/Simplex_tree/example/CMakeLists.txt index b33b2d05..857e8518 100644 --- a/src/Simplex_tree/example/CMakeLists.txt +++ b/src/Simplex_tree/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Simplex_tree_examples) add_executable ( Simplex_tree_example_from_cliques_of_graph simplex_tree_from_cliques_of_graph.cpp ) diff --git a/src/Simplex_tree/test/CMakeLists.txt b/src/Simplex_tree/test/CMakeLists.txt index 8684ad2a..c63d8532 100644 --- a/src/Simplex_tree/test/CMakeLists.txt +++ b/src/Simplex_tree/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Simplex_tree_tests) include(GUDHI_test_coverage) diff --git a/src/Skeleton_blocker/example/CMakeLists.txt b/src/Skeleton_blocker/example/CMakeLists.txt index de70f089..0e5d2f11 100644 --- a/src/Skeleton_blocker/example/CMakeLists.txt +++ b/src/Skeleton_blocker/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Skeleton_blocker_examples) add_executable(Skeleton_blocker_example_from_simplices Skeleton_blocker_from_simplices.cpp) diff --git a/src/Skeleton_blocker/test/CMakeLists.txt b/src/Skeleton_blocker/test/CMakeLists.txt index 4a363294..19c65871 100644 --- a/src/Skeleton_blocker/test/CMakeLists.txt +++ b/src/Skeleton_blocker/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Skeleton_blocker_tests) include(GUDHI_test_coverage) diff --git a/src/Spatial_searching/example/CMakeLists.txt b/src/Spatial_searching/example/CMakeLists.txt index 4cf3d863..0f799987 100644 --- a/src/Spatial_searching/example/CMakeLists.txt +++ b/src/Spatial_searching/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Spatial_searching_examples) if(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Spatial_searching/test/CMakeLists.txt b/src/Spatial_searching/test/CMakeLists.txt index b9da7b4e..b60ab1e3 100644 --- a/src/Spatial_searching/test/CMakeLists.txt +++ b/src/Spatial_searching/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Spatial_searching_tests) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Subsampling/example/CMakeLists.txt b/src/Subsampling/example/CMakeLists.txt index 34400b1e..f26d107f 100644 --- a/src/Subsampling/example/CMakeLists.txt +++ b/src/Subsampling/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Subsampling_examples) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Subsampling/test/CMakeLists.txt b/src/Subsampling/test/CMakeLists.txt index dbf97db3..924f0925 100644 --- a/src/Subsampling/test/CMakeLists.txt +++ b/src/Subsampling/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Subsampling_tests) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Tangential_complex/benchmark/CMakeLists.txt b/src/Tangential_complex/benchmark/CMakeLists.txt index 8729e394..f136ab27 100644 --- a/src/Tangential_complex/benchmark/CMakeLists.txt +++ b/src/Tangential_complex/benchmark/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Tangential_complex_benchmark) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Tangential_complex/example/CMakeLists.txt b/src/Tangential_complex/example/CMakeLists.txt index 16d1339d..af0dac51 100644 --- a/src/Tangential_complex/example/CMakeLists.txt +++ b/src/Tangential_complex/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Tangential_complex_examples) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Tangential_complex/test/CMakeLists.txt b/src/Tangential_complex/test/CMakeLists.txt index 1948c8f6..902f19af 100644 --- a/src/Tangential_complex/test/CMakeLists.txt +++ b/src/Tangential_complex/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Tangential_complex_tests) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1) diff --git a/src/Witness_complex/example/CMakeLists.txt b/src/Witness_complex/example/CMakeLists.txt index a8231392..3d838c0d 100644 --- a/src/Witness_complex/example/CMakeLists.txt +++ b/src/Witness_complex/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Witness_complex_examples) add_executable ( Witness_complex_example_nearest_landmark_table example_nearest_landmark_table.cpp ) diff --git a/src/Witness_complex/test/CMakeLists.txt b/src/Witness_complex/test/CMakeLists.txt index 0b523eaf..58ac60c5 100644 --- a/src/Witness_complex/test/CMakeLists.txt +++ b/src/Witness_complex/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Witness_complex_tests) include(GUDHI_test_coverage) diff --git a/src/Witness_complex/utilities/CMakeLists.txt b/src/Witness_complex/utilities/CMakeLists.txt index 125a41ff..ce5e29f2 100644 --- a/src/Witness_complex/utilities/CMakeLists.txt +++ b/src/Witness_complex/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Witness_complex_utilities) # CGAL and Eigen3 are required for Euclidean version of Witness diff --git a/src/cmake/modules/GUDHI_compilation_flags.cmake b/src/cmake/modules/GUDHI_compilation_flags.cmake new file mode 100644 index 00000000..614d3812 --- /dev/null +++ b/src/cmake/modules/GUDHI_compilation_flags.cmake @@ -0,0 +1,36 @@ +# This files manage compilation flags required by GUDHI + +include(TestCXXAcceptsFlag) + +# add a compiler flag only if it is accepted +macro(add_cxx_compiler_flag _flag) + string(REPLACE "-" "_" _flag_var ${_flag}) + check_cxx_accepts_flag("${_flag}" CXX_COMPILER_${_flag_var}_OK) + if(CXX_COMPILER_${_flag_var}_OK) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}") + endif() +endmacro() + +set (CMAKE_CXX_STANDARD 11) + +enable_testing() + +if(MSVC) + # Turn off some VC++ warnings + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018") +endif() + +add_cxx_compiler_flag("-Wall") +add_cxx_compiler_flag("-pedantic") + +if(CMAKE_BUILD_TYPE MATCHES Debug) + message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") +else() + message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") +endif() + +if (DEBUG_TRACES) + # For programs to be more verbose + message(STATUS "DEBUG_TRACES are activated") + add_definitions(-DDEBUG_TRACES) +endif() diff --git a/src/common/example/CMakeLists.txt b/src/common/example/CMakeLists.txt index 1273c699..04015cdc 100644 --- a/src/common/example/CMakeLists.txt +++ b/src/common/example/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Common_examples) add_executable ( vector_double_off_reader example_vector_double_points_off_reader.cpp ) diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt index de3e765a..0b49fa1e 100644 --- a/src/common/test/CMakeLists.txt +++ b/src/common/test/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(Common_tests) include(GUDHI_test_coverage) diff --git a/src/common/utilities/CMakeLists.txt b/src/common/utilities/CMakeLists.txt index b3e4b436..7f1d1cd7 100644 --- a/src/common/utilities/CMakeLists.txt +++ b/src/common/utilities/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.6) project(off_file_from_shape_generator) if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0) diff --git a/src/cython/CMakeLists.txt b/src/cython/CMakeLists.txt index b19cc550..2c21d158 100644 --- a/src/cython/CMakeLists.txt +++ b/src/cython/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.8) project(Cython) include(CheckCXXSourceCompiles) @@ -100,12 +99,13 @@ if(CYTHON_FOUND) add_gudhi_cython_lib(${Boost_THREAD_LIBRARY}) set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${Boost_LIBRARY_DIRS}', ") endif() - + message("*** ${CGAL_HEADER_ONLY}") # Add CGAL compilation args if(CGAL_HEADER_ONLY) set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_HEADER_ONLY', ") else(CGAL_HEADER_ONLY) - add_gudhi_cython_lib(${CGAL_LIBRARIES}) + message("*** ${CGAL_LIBRARY}") + add_gudhi_cython_lib(${CGAL_LIBRARY}) set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${CGAL_LIBRARIES_DIR}', ") # If CGAL is not header only, CGAL library may link with boost system, add_gudhi_cython_lib(${Boost_SYSTEM_LIBRARY}) -- cgit v1.2.3 From a135db991a6c7a49659b77660796c99c7cddb1dc Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 15 May 2018 20:56:53 +0000 Subject: Seems to be fixed. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cmake_v3_vincent@3446 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 01f10ae61484982dc99fd67573d9ca61ffbbec0a --- src/cython/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cython/CMakeLists.txt b/src/cython/CMakeLists.txt index 2c21d158..1b953648 100644 --- a/src/cython/CMakeLists.txt +++ b/src/cython/CMakeLists.txt @@ -99,12 +99,10 @@ if(CYTHON_FOUND) add_gudhi_cython_lib(${Boost_THREAD_LIBRARY}) set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${Boost_LIBRARY_DIRS}', ") endif() - message("*** ${CGAL_HEADER_ONLY}") # Add CGAL compilation args if(CGAL_HEADER_ONLY) set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_HEADER_ONLY', ") else(CGAL_HEADER_ONLY) - message("*** ${CGAL_LIBRARY}") add_gudhi_cython_lib(${CGAL_LIBRARY}) set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${CGAL_LIBRARIES_DIR}', ") # If CGAL is not header only, CGAL library may link with boost system, -- cgit v1.2.3 From 843a6603e27a55062133ec53f7719c27da6614eb Mon Sep 17 00:00:00 2001 From: glisse Date: Fri, 18 May 2018 17:09:51 +0000 Subject: Try once more to clarify what 'keys' do in the FilteredComplex concept. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3447 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 59ba4649eb53b4da2b24e4a147196c2a93641aec --- .../concept/FilteredComplex.h | 34 +++++++++++++--------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/Persistent_cohomology/concept/FilteredComplex.h b/src/Persistent_cohomology/concept/FilteredComplex.h index 178503c9..62b9002f 100644 --- a/src/Persistent_cohomology/concept/FilteredComplex.h +++ b/src/Persistent_cohomology/concept/FilteredComplex.h @@ -29,10 +29,6 @@ struct FilteredComplex { /** Handle to specify a simplex. */ typedef unspecified Simplex_handle; -/** \brief Key associated to each simplex. - * - * Must be an integer type. */ - typedef unspecified Simplex_key; /** \brief Type for the value of the filtration function. * * Must be comparable with <. */ @@ -58,20 +54,10 @@ struct FilteredComplex * filtration function on the complex. */ Filtration_value filtration(Simplex_handle sh); -/** \brief Returns a key that is different from the keys associated - * to the simplices. */ - Simplex_key null_key (); -/** \brief Returns the key associated to a simplex. - * - * This is never called on null_simplex(). */ - Simplex_key key ( Simplex_handle sh ); /** \brief Returns the simplex that has index idx in the filtration. * * This is only called on valid indices. */ Simplex_handle simplex ( size_t idx ); -/** \brief Assign a key to a simplex. */ - void assign_key(Simplex_handle sh, Simplex_key key); - /** \brief Iterator on the simplices belonging to the * boundary of a simplex. * @@ -115,6 +101,26 @@ typedef unspecified Filtration_simplex_range; * .begin() and .end() return type Filtration_simplex_iterator.*/ Filtration_simplex_range filtration_simplex_range(); +/** \name Map interface + * Conceptually a `std::unordered_map`. + * @{ */ +/** \brief Data stored for each simplex. + * + * Must be an integer type. */ + typedef unspecified Simplex_key; +/** \brief Returns a constant dummy number that is either negative, + * or at least as large as `num_simplices()`. Suggested value: -1. */ + Simplex_key null_key (); +/** \brief Returns the number stored for a simplex by `assign_key`. + * + * This is never called on null_simplex(). */ + Simplex_key key ( Simplex_handle sh ); +/** \brief Store a number for a simplex, which can later be retrieved with `key(sh)`. + * + * This is never called on null_simplex(). */ + void assign_key(Simplex_handle sh, Simplex_key n); +/** @} */ + /* \brief Iterator over the simplices of the complex, * in an arbitrary order. -- cgit v1.2.3 From f8e33c3e6e73efe8290de3c4712b720cedfb4138 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 22 May 2018 12:47:49 +0000 Subject: -pedantic is only for developpers Bug fix in gudhi_patches mechanism git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cmake_v3_vincent@3448 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0ecb0da6e6c63733a800a2f30b0f50d2c7e29441 --- CMakeLists.txt | 2 ++ src/cmake/modules/GUDHI_compilation_flags.cmake | 1 - src/cmake/modules/GUDHI_third_party_libraries.cmake | 4 ++-- src/cmake/modules/GUDHI_user_version_target.cmake | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08291b54..d3474681 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ set(GUDHI_CYTHON_PATH "src/cython") include(GUDHI_third_party_libraries NO_POLICY_SCOPE) include(GUDHI_compilation_flags) +# Only for dev version +add_cxx_compiler_flag("-pedantic") # Add your new module in the list, order is not important include(GUDHI_modules) diff --git a/src/cmake/modules/GUDHI_compilation_flags.cmake b/src/cmake/modules/GUDHI_compilation_flags.cmake index 614d3812..394f1f42 100644 --- a/src/cmake/modules/GUDHI_compilation_flags.cmake +++ b/src/cmake/modules/GUDHI_compilation_flags.cmake @@ -21,7 +21,6 @@ if(MSVC) endif() add_cxx_compiler_flag("-Wall") -add_cxx_compiler_flag("-pedantic") if(CMAKE_BUILD_TYPE MATCHES Debug) message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") diff --git a/src/cmake/modules/GUDHI_third_party_libraries.cmake b/src/cmake/modules/GUDHI_third_party_libraries.cmake index a008dd0a..7433f2f3 100644 --- a/src/cmake/modules/GUDHI_third_party_libraries.cmake +++ b/src/cmake/modules/GUDHI_third_party_libraries.cmake @@ -54,12 +54,12 @@ if(CGAL_FOUND) endforeach(CGAL_INCLUDE_DIR ${CGAL_INCLUDE_DIRS}) endif(NOT CGAL_VERSION VERSION_GREATER 4.9.0) - if (NOT CGAL_VERSION VERSION_GREATER 4.11.0) + if (CGAL_VERSION VERSION_LESS 4.11.0) # For dev version include_directories(BEFORE "src/common/include/gudhi_patches") # For user version include_directories(BEFORE "include/gudhi_patches") - endif (NOT CGAL_VERSION VERSION_GREATER 4.11.0) + endif () endif() endif() diff --git a/src/cmake/modules/GUDHI_user_version_target.cmake b/src/cmake/modules/GUDHI_user_version_target.cmake index 4abc2574..0d1220cf 100644 --- a/src/cmake/modules/GUDHI_user_version_target.cmake +++ b/src/cmake/modules/GUDHI_user_version_target.cmake @@ -48,7 +48,7 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11) copy_directory ${CMAKE_SOURCE_DIR}/src/GudhUI ${GUDHI_USER_VERSION_DIR}/GudhUI) set(GUDHI_DIRECTORIES "doc;example;concept;utilities") - if (NOT CGAL_VERSION VERSION_GREATER 4.11.0) + if (CGAL_VERSION VERSION_LESS 4.11.0) set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/gudhi_patches") else () set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi") -- cgit v1.2.3 From e996b0fd0a0aecfa3b77e0ff3780f31b1b8bab4a Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 22 May 2018 20:59:45 +0000 Subject: Add CMake 3.1 in installation requirements. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3450 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: bae61cf108841dae3ff1be5953eb9f87f1713e41 --- src/common/doc/installation.h | 5 +++-- src/cython/doc/installation.rst | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/doc/installation.h b/src/common/doc/installation.h index 25675cc5..12407c18 100644 --- a/src/common/doc/installation.h +++ b/src/common/doc/installation.h @@ -5,8 +5,9 @@ * Examples of GUDHI headers inclusion can be found in \ref demos. * * \section compiling Compiling - * The library uses c++11 and requires Boost with version 1.48.0 or - * more recent. It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015. + * The library uses c++11 and requires Boost ≥ 1.48.0 + * and CMake ≥ 3.1. + * It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015. * * \subsection demos Demos and examples * To build the demos and examples, run the following commands in a terminal: diff --git a/src/cython/doc/installation.rst b/src/cython/doc/installation.rst index c182f176..52c5eb49 100644 --- a/src/cython/doc/installation.rst +++ b/src/cython/doc/installation.rst @@ -3,10 +3,10 @@ Installation Compiling ********* - -The library uses c++11 and requires `Boost `_ with -version 1.48.0 or more recent. It is a multi-platform library and compiles on -Linux, Mac OSX and Visual Studio 2015. +The library uses c++11 and requires `Boost `_ ≥ 1.48.0 +and `CMake `_ ≥ 3.1. +It is a multi-platform library and compiles on Linux, Mac OSX and Visual +Studio 2015. It also requires cmake to generate makefiles, and cython to compile the library. -- cgit v1.2.3 From 90bb34c0e81b57ed85131ccaa638f457338c9219 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 23 May 2018 08:22:35 +0000 Subject: Modify documentation for Simplex_tree make_filtration_non_decreasing git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3452 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 304779c7952985d651750aded78cb32c6e583555 --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 5 ++--- src/cython/cython/simplex_tree.pyx | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 7456cb1f..d9e2d73e 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -1238,9 +1238,8 @@ class Simplex_tree { } public: - /** \brief Browse the simplex tree to ensure the filtration is not decreasing. - * The simplex tree is browsed starting from the root until the leaf, and the filtration values are set with their - * parent value (increased), in case the values are decreasing. + /** \brief This function ensures that each simplex has a higher filtration value than its faces by increasing the + * filtration values. * @return The filtration modification information. * \post Some simplex tree functions require the filtration to be valid. `make_filtration_non_decreasing()` * function is not launching `initialize_filtration()` but returns the filtration modification information. If the diff --git a/src/cython/cython/simplex_tree.pyx b/src/cython/cython/simplex_tree.pyx index 38740f4f..667fd40b 100644 --- a/src/cython/cython/simplex_tree.pyx +++ b/src/cython/cython/simplex_tree.pyx @@ -402,10 +402,8 @@ cdef class SimplexTree: self.thisptr.expansion(max_dim) def make_filtration_non_decreasing(self): - """Browse the simplex tree to ensure the filtration is not decreasing. - The simplex tree is browsed starting from the root until the leaf, and - the filtration values are set with their parent value (increased), in - case the values are decreasing. + """This function ensures that each simplex has a higher filtration + value than its faces by increasing the filtration values. :returns: The filtration modification information. :rtype: bint -- cgit v1.2.3 From 4b6d52d1a1b16f4026b9eb98495ac6fe1aa95281 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 23 May 2018 08:45:19 +0000 Subject: Legend in the right bottom corner git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3453 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 221e39777dd55397a0260a2c83f590db610fdb76 --- src/cython/cython/persistence_graphical_tools.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cython/cython/persistence_graphical_tools.py b/src/cython/cython/persistence_graphical_tools.py index 118fdd1a..4629018c 100755 --- a/src/cython/cython/persistence_graphical_tools.py +++ b/src/cython/cython/persistence_graphical_tools.py @@ -125,7 +125,9 @@ def plot_persistence_barcode(persistence=[], persistence_file='', alpha=0.6, if legend: dimensions = list(set(item[0] for item in persistence)) - plt.legend(handles=[mpatches.Patch(color=palette[dim], label=str(dim)) for dim in dimensions]) + plt.legend(handles=[mpatches.Patch(color=palette[dim], + label=str(dim)) for dim in dimensions], + loc='lower right') plt.title('Persistence barcode') # Ends plot on infinity value and starts a little bit before min_birth plt.axis([axis_start, infinity, 0, ind]) -- cgit v1.2.3 From 2745d59751e862701d675470994978ca460ac870 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 25 May 2018 13:21:43 +0000 Subject: Fix bug on Cubical reported by user. Add test on Python level. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3461 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: fffa8df624f81427d0feef6ddc3f8a567aa2d366 --- .../include/gudhi/Bitmap_cubical_complex_base.h | 4 ++-- ...Bitmap_cubical_complex_periodic_boundary_conditions_base.h | 2 +- src/cython/test/test_cubical_complex.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h index 47e71f8a..e06d198b 100644 --- a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h +++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h @@ -492,7 +492,7 @@ class Bitmap_cubical_complex_base { this->multipliers.push_back(multiplier); multiplier *= 2 * sizes[i] + 1; } - this->data = std::vector(multiplier, std::numeric_limits::max()); + this->data = std::vector(multiplier, std::numeric_limits::infinity()); this->total_number_of_cells = multiplier; } @@ -562,7 +562,7 @@ void Bitmap_cubical_complex_base::put_data_to_bins(T diameter_of_bin) { template std::pair Bitmap_cubical_complex_base::min_max_filtration() { - std::pair min_max(std::numeric_limits::max(), std::numeric_limits::min()); + std::pair min_max(std::numeric_limits::infinity(), std::numeric_limits::min()); for (std::size_t i = 0; i != this->data.size(); ++i) { if (this->data[i] < min_max.first) min_max.first = this->data[i]; if (this->data[i] > min_max.second) min_max.second = this->data[i]; diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h index 97070cda..8c35f590 100644 --- a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h @@ -177,7 +177,7 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c } } // std::reverse( this->sizes.begin() , this->sizes.end() ); - this->data = std::vector(multiplier, std::numeric_limits::max()); + this->data = std::vector(multiplier, std::numeric_limits::infinity()); this->total_number_of_cells = multiplier; } Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector& sizes); diff --git a/src/cython/test/test_cubical_complex.py b/src/cython/test/test_cubical_complex.py index 79d39aa8..92e591e9 100755 --- a/src/cython/test/test_cubical_complex.py +++ b/src/cython/test/test_cubical_complex.py @@ -72,6 +72,17 @@ def test_dimension_simple_constructor(): assert cub.betti_numbers() == [1, 0, 0] assert cub.persistent_betti_numbers(0, 1000) == [0, 0, 0] +def test_user_case_simple_constructor(): + cub = CubicalComplex(dimensions=[3, 3], + top_dimensional_cells = [float('inf'), 0.,0.,0.,1.,0.,0.,0.,0.]) + assert cub.__is_defined() == True + assert cub.__is_persistence_defined() == False + assert cub.persistence() == [(1, (0.0, 1.0)), (0, (0.0, float('inf')))] + assert cub.__is_persistence_defined() == True + other_cub = CubicalComplex(dimensions=[3, 3], + top_dimensional_cells = [1000., 0.,0.,0.,1.,0.,0.,0.,0.]) + assert other_cub.persistence() == [(1, (0.0, 1.0)), (0, (0.0, float('inf')))] + def test_dimension_file_constructor(): # Create test file test_file = open('CubicalOneSphere.txt', 'w') -- cgit v1.2.3 From a4cc98d569c63d04729242e1cabe7a0e49ed3908 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 25 May 2018 14:02:08 +0000 Subject: forgot -inf from patch sent by Marc git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3462 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 8e7fe4acb33ee785ef918052f3111d2845542450 --- src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h index e06d198b..9b74e267 100644 --- a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h +++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h @@ -562,7 +562,7 @@ void Bitmap_cubical_complex_base::put_data_to_bins(T diameter_of_bin) { template std::pair Bitmap_cubical_complex_base::min_max_filtration() { - std::pair min_max(std::numeric_limits::infinity(), std::numeric_limits::min()); + std::pair min_max(std::numeric_limits::infinity(), -std::numeric_limits::infinity()); for (std::size_t i = 0; i != this->data.size(); ++i) { if (this->data[i] < min_max.first) min_max.first = this->data[i]; if (this->data[i] > min_max.second) min_max.second = this->data[i]; -- cgit v1.2.3 From 5fd7f8f63704131228a57c6292743295a25db11e Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 28 May 2018 15:31:55 +0000 Subject: Code review: ForwardPointRange instead of InputPointRange Point cloud deep copy git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3478 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 29e77a605f85552bc5b31f2907e26b7e5a9da92f --- src/Cech_complex/benchmark/CMakeLists.txt | 4 ++-- src/Cech_complex/include/gudhi/Cech_complex.h | 22 +++++++++------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Cech_complex/benchmark/CMakeLists.txt b/src/Cech_complex/benchmark/CMakeLists.txt index 2a65865b..b7697764 100644 --- a/src/Cech_complex/benchmark/CMakeLists.txt +++ b/src/Cech_complex/benchmark/CMakeLists.txt @@ -2,10 +2,10 @@ 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}/) +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_LIBRARY}) +target_link_libraries(cech_complex_benchmark ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}) if (TBB_FOUND) target_link_libraries(cech_complex_benchmark ${TBB_LIBRARIES}) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index abad0c21..def46c79 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -48,10 +48,10 @@ namespace cech_complex { * \tparam SimplicialComplexForProximityGraph furnishes `Vertex_handle` and `Filtration_value` type definition required * by `Gudhi::Proximity_graph`. * - * \tparam InputPointRange must be a range for which `std::begin()` and `std::end()` methods return input + * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. */ -template +template class Cech_complex { private: // Required by compute_proximity_graph @@ -59,8 +59,8 @@ class Cech_complex { using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value; using Proximity_graph = Gudhi::Proximity_graph; - // Retrieve Coordinate type from InputPointRange - using Point_from_range_iterator = typename boost::range_const_iterator::type; + // Retrieve Coordinate type from ForwardPointRange + using Point_from_range_iterator = typename boost::range_const_iterator::type; using Point_from_range = typename std::iterator_traits::value_type; using Coordinate_iterator = typename boost::range_const_iterator::type; using Coordinate= typename std::iterator_traits::value_type; @@ -76,19 +76,15 @@ class Cech_complex { * @param[in] points Range of points. * @param[in] max_radius Maximal radius value. * - * \tparam InputPointRange must be a range of Point. Point must be a range of copyable Cartesian coordinates. + * \tparam ForwardPointRange must be a range of Point. Point must be a range of copyable Cartesian coordinates. * */ - Cech_complex(const InputPointRange& points, Filtration_value max_radius) + Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) : max_radius_(max_radius) { // Point cloud deep copy - auto points_begin_itr = std::begin(points); - auto points_end_itr = std::end(points); - - point_cloud_.reserve(points_end_itr - points_begin_itr); - for (auto point_itr = points_begin_itr; point_itr < points_end_itr; point_itr++) { - point_cloud_.push_back(Point(std::begin(*point_itr), std::end(*point_itr))); - } + point_cloud_.reserve(boost::size(points)); + for (auto&& point : points) + point_cloud_.emplace_back(std::begin(point), std::end(point)); cech_skeleton_graph_ = Gudhi::compute_proximity_graph(point_cloud_, -- cgit v1.2.3 From cfe5c6b05435cb7d8cbd1d615e0c402f4a5e1674 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 29 May 2018 19:49:30 +0000 Subject: Clang format files git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cechcomplex_vincent@3488 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 7d1da847f4c39a191afd5d8e56fe34ee79ade495 --- .../benchmark/cech_complex_benchmark.cpp | 58 ++++++++------------ .../example/cech_complex_example_from_points.cpp | 33 ++++++------ .../example/cech_complex_step_by_step.cpp | 51 +++++++----------- src/Cech_complex/include/gudhi/Cech_complex.h | 30 ++++------- .../include/gudhi/Cech_complex_blocker.h | 9 ++-- src/Cech_complex/test/test_cech_complex.cpp | 63 +++++++++++----------- 6 files changed, 104 insertions(+), 140 deletions(-) diff --git a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp index 2fa255ed..86314930 100644 --- a/src/Cech_complex/benchmark/cech_complex_benchmark.cpp +++ b/src/Cech_complex/benchmark/cech_complex_benchmark.cpp @@ -29,12 +29,11 @@ #include #include -#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations +#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations #include #include - // Types definition using Simplex_tree = Gudhi::Simplex_tree<>; using Filtration_value = Simplex_tree::Filtration_value; @@ -45,32 +44,31 @@ using Proximity_graph = Gudhi::Proximity_graph; using Rips_complex = Gudhi::rips_complex::Rips_complex; using Cech_complex = Gudhi::cech_complex::Cech_complex; - class Minimal_enclosing_ball_radius { public: // boost::range_value is not SFINAE-friendly so we cannot use it in the return type - template< typename Point > - typename std::iterator_traits::type>::value_type - operator()(const Point& p1, const Point& p2) const { + template + typename std::iterator_traits::type>::value_type operator()( + const Point& p1, const Point& p2) const { // Type def using Point_cloud = std::vector; using Point_iterator = typename Point_cloud::const_iterator; using Coordinate_iterator = typename Point::const_iterator; - using Min_sphere = typename Gudhi::Miniball::Miniball>; + using Min_sphere = + typename Gudhi::Miniball::Miniball>; Point_cloud point_cloud; point_cloud.push_back(p1); point_cloud.push_back(p2); - GUDHI_CHECK((p1.end()-p1.begin()) != (p2.end()-p2.begin()), "inconsistent point dimensions"); - Min_sphere min_sphere(p1.end()-p1.begin(), point_cloud.begin(),point_cloud.end()); + GUDHI_CHECK((p1.end() - p1.begin()) != (p2.end() - p2.begin()), "inconsistent point dimensions"); + Min_sphere min_sphere(p1.end() - p1.begin(), point_cloud.begin(), point_cloud.end()); return std::sqrt(min_sphere.squared_radius()); } }; - -int main(int argc, char * argv[]) { +int main(int argc, char* argv[]) { std::string off_file_points = "tore3D_1307.off"; Filtration_value threshold = 1e20; @@ -79,42 +77,32 @@ int main(int argc, char * argv[]) { Gudhi::Clock euclidean_clock("Gudhi::Euclidean_distance"); // Compute the proximity graph of the points - Proximity_graph euclidean_prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Gudhi::Euclidean_distance()); + Proximity_graph euclidean_prox_graph = Gudhi::compute_proximity_graph( + off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance()); std::cout << euclidean_clock << std::endl; Gudhi::Clock miniball_clock("Minimal_enclosing_ball_radius"); // Compute the proximity graph of the points - Proximity_graph miniball_prox_graph = - Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Minimal_enclosing_ball_radius()); + Proximity_graph miniball_prox_graph = Gudhi::compute_proximity_graph( + off_reader.get_point_cloud(), threshold, Minimal_enclosing_ball_radius()); std::cout << miniball_clock << std::endl; Gudhi::Clock common_miniball_clock("Gudhi::Minimal_enclosing_ball_radius()"); // Compute the proximity graph of the points - Proximity_graph common_miniball_prox_graph = - Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - threshold, - Gudhi::Minimal_enclosing_ball_radius()); + Proximity_graph common_miniball_prox_graph = Gudhi::compute_proximity_graph( + off_reader.get_point_cloud(), threshold, Gudhi::Minimal_enclosing_ball_radius()); std::cout << common_miniball_clock << std::endl; - boost::filesystem::path full_path(boost::filesystem::current_path()); std::cout << "Current path is : " << full_path << std::endl; - - std::cout << "File name;Radius;Rips time;Cech time; Ratio Rips/Cech time;Rips nb simplices;Cech nb simplices;" << std::endl; - boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end - for ( boost::filesystem::directory_iterator itr( boost::filesystem::current_path() ); - itr != end_itr; - ++itr ) - { - if ( ! boost::filesystem::is_directory(itr->status()) ) - { - if ( itr->path().extension() == ".off" ) // see below + std::cout << "File name;Radius;Rips time;Cech time; Ratio Rips/Cech time;Rips nb simplices;Cech nb simplices;" + << std::endl; + boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end + for (boost::filesystem::directory_iterator itr(boost::filesystem::current_path()); itr != end_itr; ++itr) { + if (!boost::filesystem::is_directory(itr->status())) { + if (itr->path().extension() == ".off") // see below { Points_off_reader off_reader(itr->path().string()); Point p0 = off_reader.get_point_cloud()[0]; @@ -123,8 +111,7 @@ int main(int argc, char * argv[]) { std::cout << itr->path().stem() << ";"; std::cout << radius << ";"; Gudhi::Clock rips_clock("Rips computation"); - Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), - radius, + Rips_complex rips_complex_from_points(off_reader.get_point_cloud(), radius, Gudhi::Minimal_enclosing_ball_radius()); Simplex_tree rips_stree; rips_complex_from_points.create_complex(rips_stree, p0.size() - 1); @@ -153,6 +140,5 @@ int main(int argc, char * argv[]) { } } - return 0; } diff --git a/src/Cech_complex/example/cech_complex_example_from_points.cpp b/src/Cech_complex/example/cech_complex_example_from_points.cpp index 2b36e33c..3cc5a4df 100644 --- a/src/Cech_complex/example/cech_complex_example_from_points.cpp +++ b/src/Cech_complex/example/cech_complex_example_from_points.cpp @@ -14,17 +14,17 @@ int main() { using Cech_complex = Gudhi::cech_complex::Cech_complex; Point_cloud points; - points.push_back({1., 0.}); // 0 - points.push_back({0., 1.}); // 1 - points.push_back({2., 1.}); // 2 - points.push_back({3., 2.}); // 3 - points.push_back({0., 3.}); // 4 - points.push_back({3. + std::sqrt(3.), 3.}); // 5 - points.push_back({1., 4.}); // 6 - points.push_back({3., 4.}); // 7 - points.push_back({2., 4. + std::sqrt(3.)}); // 8 - points.push_back({0., 4.}); // 9 - points.push_back({-0.5, 2.}); // 10 + points.push_back({1., 0.}); // 0 + points.push_back({0., 1.}); // 1 + points.push_back({2., 1.}); // 2 + points.push_back({3., 2.}); // 3 + points.push_back({0., 3.}); // 4 + points.push_back({3. + std::sqrt(3.), 3.}); // 5 + points.push_back({1., 4.}); // 6 + points.push_back({3., 4.}); // 7 + points.push_back({2., 4. + std::sqrt(3.)}); // 8 + points.push_back({0., 4.}); // 9 + points.push_back({-0.5, 2.}); // 10 // ---------------------------------------------------------------------------- // Init of a Cech complex from points @@ -37,18 +37,17 @@ int main() { // ---------------------------------------------------------------------------- // Display information about the one skeleton Cech complex // ---------------------------------------------------------------------------- - std::cout << "Cech complex is of dimension " << stree.dimension() << - " - " << stree.num_simplices() << " simplices - " << - stree.num_vertices() << " vertices." << std::endl; + std::cout << "Cech complex is of dimension " << stree.dimension() << " - " << stree.num_simplices() << " simplices - " + << stree.num_vertices() << " vertices." << std::endl; - std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << - std::endl; + std::cout << "Iterator on Cech complex simplices in the filtration order, with [filtration value]:" << std::endl; for (auto f_simplex : stree.filtration_simplex_range()) { std::cout << " ( "; for (auto vertex : stree.simplex_vertex_range(f_simplex)) { std::cout << vertex << " "; } - std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] "; + std::cout << ") -> " + << "[" << stree.filtration(f_simplex) << "] "; std::cout << std::endl; } return 0; diff --git a/src/Cech_complex/example/cech_complex_step_by_step.cpp b/src/Cech_complex/example/cech_complex_step_by_step.cpp index 760b53dc..d2dc8b65 100644 --- a/src/Cech_complex/example/cech_complex_step_by_step.cpp +++ b/src/Cech_complex/example/cech_complex_step_by_step.cpp @@ -31,7 +31,7 @@ #include #include -#include // infinity +#include // infinity #include // for pair #include @@ -55,7 +55,8 @@ class Cech_blocker { using Point_cloud = std::vector; using Point_iterator = Point_cloud::const_iterator; using Coordinate_iterator = Point::const_iterator; - using Min_sphere = Gudhi::Miniball::Miniball >; + using Min_sphere = Gudhi::Miniball::Miniball>; + public: bool operator()(Simplex_handle sh) { std::vector points; @@ -73,11 +74,10 @@ class Cech_blocker { return (radius > max_radius_); } Cech_blocker(Simplex_tree& simplex_tree, Filtration_value max_radius, const std::vector& point_cloud) - : simplex_tree_(simplex_tree), - max_radius_(max_radius), - point_cloud_(point_cloud) { + : simplex_tree_(simplex_tree), max_radius_(max_radius), point_cloud_(point_cloud) { dimension_ = point_cloud_[0].size(); } + private: Simplex_tree simplex_tree_; Filtration_value max_radius_; @@ -85,14 +85,9 @@ class Cech_blocker { int dimension_; }; +void program_options(int argc, char* argv[], std::string& off_file_points, Filtration_value& max_radius, int& dim_max); -void program_options(int argc, char * argv[] - , std::string & off_file_points - , Filtration_value & max_radius - , int & dim_max); - - -int main(int argc, char * argv[]) { +int main(int argc, char* argv[]) { std::string off_file_points; Filtration_value max_radius; int dim_max; @@ -103,8 +98,7 @@ int main(int argc, char * argv[]) { Points_off_reader off_reader(off_file_points); // Compute the proximity graph of the points - Proximity_graph prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), - max_radius, + Proximity_graph prox_graph = Gudhi::compute_proximity_graph(off_reader.get_point_cloud(), max_radius, Gudhi::Minimal_enclosing_ball_radius()); // Construct the Rips complex in a Simplex Tree @@ -125,7 +119,8 @@ int main(int argc, char * argv[]) { std::cout << "* The complex contains " << st.num_simplices() << " simplices - dimension=" << st.dimension() << "\n"; std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n"; for (auto f_simplex : st.filtration_simplex_range()) { - std::cout << " " << "[" << st.filtration(f_simplex) << "] "; + std::cout << " " + << "[" << st.filtration(f_simplex) << "] "; for (auto vertex : st.simplex_vertex_range(f_simplex)) { std::cout << static_cast(vertex) << " "; } @@ -136,24 +131,19 @@ int main(int argc, char * argv[]) { return 0; } -void program_options(int argc, char * argv[] - , std::string & off_file_points - , Filtration_value & max_radius - , int & dim_max) { +void program_options(int argc, char* argv[], std::string& off_file_points, Filtration_value& max_radius, int& dim_max) { namespace po = boost::program_options; po::options_description hidden("Hidden options"); - hidden.add_options() - ("input-file", po::value(&off_file_points), - "Name of an OFF file containing a point set.\n"); + hidden.add_options()("input-file", po::value(&off_file_points), + "Name of an OFF file containing a point set.\n"); po::options_description visible("Allowed options", 100); - visible.add_options() - ("help,h", "produce help message") - ("max-radius,r", - po::value(&max_radius)->default_value(std::numeric_limits::infinity()), - "Maximal length of an edge for the Rips complex construction.") - ("cpx-dimension,d", po::value(&dim_max)->default_value(1), - "Maximal dimension of the Rips complex we want to compute."); + visible.add_options()("help,h", "produce help message")( + "max-radius,r", + po::value(&max_radius)->default_value(std::numeric_limits::infinity()), + "Maximal length of an edge for the Rips complex construction.")( + "cpx-dimension,d", po::value(&dim_max)->default_value(1), + "Maximal dimension of the Rips complex we want to compute."); po::positional_options_description pos; pos.add("input-file", 1); @@ -162,8 +152,7 @@ void program_options(int argc, char * argv[] all.add(visible).add(hidden); po::variables_map vm; - po::store(po::command_line_parser(argc, argv). - options(all).positional(pos).run(), vm); + po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm); po::notify(vm); if (vm.count("help") || !vm.count("input-file")) { diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index def46c79..f4fb4288 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -38,9 +38,9 @@ namespace cech_complex { /** * \class Cech_complex * \brief Cech complex data structure. - * + * * \ingroup cech_complex - * + * * \details * The data structure is a proximity graph, containing edges when the edge length is less or equal * to a given max_radius. Edge length is computed from `Gudhi::Minimal_enclosing_ball_radius` distance function. @@ -51,7 +51,7 @@ namespace cech_complex { * \tparam ForwardPointRange must be a range for which `std::begin()` and `std::end()` methods return input * iterators on a point. `std::begin()` and `std::end()` methods are also required for a point. */ -template +template class Cech_complex { private: // Required by compute_proximity_graph @@ -63,7 +63,7 @@ class Cech_complex { using Point_from_range_iterator = typename boost::range_const_iterator::type; using Point_from_range = typename std::iterator_traits::value_type; using Coordinate_iterator = typename boost::range_const_iterator::type; - using Coordinate= typename std::iterator_traits::value_type; + using Coordinate = typename std::iterator_traits::value_type; public: // Point and Point_cloud type definition @@ -79,17 +79,13 @@ class Cech_complex { * \tparam ForwardPointRange must be a range of Point. Point must be a range of copyable Cartesian coordinates. * */ - Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) - : max_radius_(max_radius) { + Cech_complex(const ForwardPointRange& points, Filtration_value max_radius) : max_radius_(max_radius) { // Point cloud deep copy point_cloud_.reserve(boost::size(points)); - for (auto&& point : points) - point_cloud_.emplace_back(std::begin(point), std::end(point)); + for (auto&& point : points) point_cloud_.emplace_back(std::begin(point), std::end(point)); - cech_skeleton_graph_ = - Gudhi::compute_proximity_graph(point_cloud_, - max_radius_, - Gudhi::Minimal_enclosing_ball_radius()); + cech_skeleton_graph_ = Gudhi::compute_proximity_graph( + point_cloud_, max_radius_, Gudhi::Minimal_enclosing_ball_radius()); } /** \brief Initializes the simplicial complex from the proximity graph and expands it until a given maximal @@ -100,7 +96,7 @@ class Cech_complex { * @exception std::invalid_argument In debug mode, if `complex.num_vertices()` does not return 0. * */ - template + template void create_complex(SimplicialComplexForCechComplex& complex, int dim_max) { GUDHI_CHECK(complex.num_vertices() == 0, std::invalid_argument("Cech_complex::create_complex - simplicial complex is not empty")); @@ -113,16 +109,12 @@ class Cech_complex { } /** @return max_radius value given at construction. */ - Filtration_value max_radius() const { - return max_radius_; - } + Filtration_value max_radius() const { return max_radius_; } /** @param[in] vertex Point position in the range. * @return The point. */ - const Point& get_point(Vertex_handle vertex) const{ - return point_cloud_[vertex]; - } + const Point& get_point(Vertex_handle vertex) const { return point_cloud_[vertex]; } private: Proximity_graph cech_skeleton_graph_; diff --git a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h index 697d2246..b0d347b1 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex_blocker.h +++ b/src/Cech_complex/include/gudhi/Cech_complex_blocker.h @@ -70,18 +70,15 @@ class Cech_blocker { } Filtration_value radius = Gudhi::Minimal_enclosing_ball_radius()(points); #ifdef DEBUG_TRACES - if (radius > cc_ptr_->max_radius()) - std::cout << "radius > max_radius => expansion is blocked\n"; + if (radius > cc_ptr_->max_radius()) std::cout << "radius > max_radius => expansion is blocked\n"; #endif // DEBUG_TRACES sc_ptr_->assign_filtration(sh, radius); return (radius > cc_ptr_->max_radius()); } /** \internal \brief Čech complex blocker constructor. */ - Cech_blocker(SimplicialComplexForCech* sc_ptr, Cech_complex* cc_ptr) - : sc_ptr_(sc_ptr), - cc_ptr_(cc_ptr) { - } + Cech_blocker(SimplicialComplexForCech* sc_ptr, Cech_complex* cc_ptr) : sc_ptr_(sc_ptr), cc_ptr_(cc_ptr) {} + private: SimplicialComplexForCech* sc_ptr_; Cech_complex* cc_ptr_; diff --git a/src/Cech_complex/test/test_cech_complex.cpp b/src/Cech_complex/test/test_cech_complex.cpp index 5b35735b..9039169c 100644 --- a/src/Cech_complex/test/test_cech_complex.cpp +++ b/src/Cech_complex/test/test_cech_complex.cpp @@ -28,7 +28,7 @@ #include #include #include -#include // std::max +#include // std::max #include // to construct Cech_complex from a OFF file of points @@ -57,21 +57,21 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { // // ---------------------------------------------------------------------------- Point_cloud points; - points.push_back({1., 0.}); // 0 - points.push_back({0., 1.}); // 1 - points.push_back({2., 1.}); // 2 - points.push_back({3., 2.}); // 3 - points.push_back({0., 3.}); // 4 - points.push_back({3. + std::sqrt(3.), 3.}); // 5 - points.push_back({1., 4.}); // 6 - points.push_back({3., 4.}); // 7 - points.push_back({2., 4. + std::sqrt(3.)}); // 8 - points.push_back({0., 4.}); // 9 - points.push_back({-0.5, 2.}); // 10 + points.push_back({1., 0.}); // 0 + points.push_back({0., 1.}); // 1 + points.push_back({2., 1.}); // 2 + points.push_back({3., 2.}); // 3 + points.push_back({0., 3.}); // 4 + points.push_back({3. + std::sqrt(3.), 3.}); // 5 + points.push_back({1., 4.}); // 6 + points.push_back({3., 4.}); // 7 + points.push_back({2., 4. + std::sqrt(3.)}); // 8 + points.push_back({0., 4.}); // 9 + points.push_back({-0.5, 2.}); // 10 Filtration_value max_radius = 1.0; - std::cout << "========== NUMBER OF POINTS = " << points.size() << " - Cech max_radius = " << - max_radius << "==========" << std::endl; + std::cout << "========== NUMBER OF POINTS = " << points.size() << " - Cech max_radius = " << max_radius + << "==========" << std::endl; Cech_complex cech_complex_for_doc(points, max_radius); @@ -108,24 +108,25 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { std::cout << vertex << ","; vp.push_back(points.at(vertex)); } - std::cout << ") - distance =" << Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1)) << - " - filtration =" << st.filtration(f_simplex) << std::endl; + std::cout << ") - distance =" << Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1)) + << " - filtration =" << st.filtration(f_simplex) << std::endl; BOOST_CHECK(vp.size() == 2); - GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1))); + GUDHI_TEST_FLOAT_EQUALITY_CHECK(st.filtration(f_simplex), + Gudhi::Minimal_enclosing_ball_radius()(vp.at(0), vp.at(1))); } } const int DIMENSION_2 = 2; #ifdef GUDHI_DEBUG - BOOST_CHECK_THROW (cech_complex_for_doc.create_complex(st, DIMENSION_2), std::invalid_argument); + BOOST_CHECK_THROW(cech_complex_for_doc.create_complex(st, DIMENSION_2), std::invalid_argument); #endif Simplex_tree st2; cech_complex_for_doc.create_complex(st2, DIMENSION_2); std::cout << "st2.dimension()=" << st2.dimension() << std::endl; BOOST_CHECK(st2.dimension() == DIMENSION_2); - + std::cout << "st2.num_vertices()=" << st2.num_vertices() << std::endl; BOOST_CHECK(st2.num_vertices() == NUMBER_OF_VERTICES); @@ -137,7 +138,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { points012.push_back(cech_complex_for_doc.get_point(vertex)); } std::size_t dimension = points[0].end() - points[0].begin(); - Min_sphere ms012(dimension, points012.begin(),points012.end()); + Min_sphere ms012(dimension, points012.begin(), points012.end()); Simplex_tree::Filtration_value f012 = st2.filtration(st2.find({0, 1, 2})); std::cout << "f012= " << f012 << " | ms012_radius= " << std::sqrt(ms012.squared_radius()) << std::endl; @@ -148,7 +149,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { points1410.push_back(cech_complex_for_doc.get_point(1)); points1410.push_back(cech_complex_for_doc.get_point(4)); points1410.push_back(cech_complex_for_doc.get_point(10)); - Min_sphere ms1410(dimension, points1410.begin(),points1410.end()); + Min_sphere ms1410(dimension, points1410.begin(), points1410.end()); Simplex_tree::Filtration_value f1410 = st2.filtration(st2.find({1, 4, 10})); std::cout << "f1410= " << f1410 << " | ms1410_radius= " << std::sqrt(ms1410.squared_radius()) << std::endl; @@ -159,7 +160,7 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { points469.push_back(cech_complex_for_doc.get_point(4)); points469.push_back(cech_complex_for_doc.get_point(6)); points469.push_back(cech_complex_for_doc.get_point(9)); - Min_sphere ms469(dimension, points469.begin(),points469.end()); + Min_sphere ms469(dimension, points469.begin(), points469.end()); Simplex_tree::Filtration_value f469 = st2.filtration(st2.find({4, 6, 9})); std::cout << "f469= " << f469 << " | ms469_radius= " << std::sqrt(ms469.squared_radius()) << std::endl; @@ -168,7 +169,6 @@ BOOST_AUTO_TEST_CASE(Cech_complex_for_documentation) { BOOST_CHECK((st2.find({6, 7, 8}) == st2.null_simplex())); BOOST_CHECK((st2.find({3, 5, 7}) == st2.null_simplex())); - } BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { @@ -176,13 +176,13 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { // Init of a list of points // ---------------------------------------------------------------------------- Point_cloud points; - std::vector coords = { 0.0, 0.0, 0.0, 1.0 }; + std::vector coords = {0.0, 0.0, 0.0, 1.0}; points.push_back(Point(coords.begin(), coords.end())); - coords = { 0.0, 0.0, 1.0, 0.0 }; + coords = {0.0, 0.0, 1.0, 0.0}; points.push_back(Point(coords.begin(), coords.end())); - coords = { 0.0, 1.0, 0.0, 0.0 }; + coords = {0.0, 1.0, 0.0, 0.0}; points.push_back(Point(coords.begin(), coords.end())); - coords = { 1.0, 0.0, 0.0, 0.0 }; + coords = {1.0, 0.0, 0.0, 0.0}; points.push_back(Point(coords.begin(), coords.end())); // ---------------------------------------------------------------------------- @@ -204,7 +204,8 @@ BOOST_AUTO_TEST_CASE(Cech_complex_from_points) { for (auto vertex : st.simplex_vertex_range(f_simplex)) { std::cout << vertex << " "; } - std::cout << ") -> " << "[" << st.filtration(f_simplex) << "] "; + std::cout << ") -> " + << "[" << st.filtration(f_simplex) << "] "; std::cout << std::endl; } BOOST_CHECK(num_simplices == 15); @@ -247,8 +248,8 @@ BOOST_AUTO_TEST_CASE(Cech_create_complex_throw) { // ---------------------------------------------------------------------------- std::string off_file_name("alphacomplexdoc.off"); double max_radius = 12.0; - std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech max_radius=" << - max_radius << "==========" << std::endl; + std::cout << "========== OFF FILE NAME = " << off_file_name << " - Cech max_radius=" << max_radius + << "==========" << std::endl; Gudhi::Points_off_reader off_reader(off_file_name); Cech_complex cech_complex_from_file(off_reader.get_point_cloud(), max_radius); @@ -258,6 +259,6 @@ BOOST_AUTO_TEST_CASE(Cech_create_complex_throw) { stree.insert_simplex_and_subfaces(simplex); std::cout << "Check exception throw in debug mode" << std::endl; // throw excpt because stree is not empty - BOOST_CHECK_THROW (cech_complex_from_file.create_complex(stree, 1), std::invalid_argument); + BOOST_CHECK_THROW(cech_complex_from_file.create_complex(stree, 1), std::invalid_argument); } #endif -- cgit v1.2.3 From d0aa6ea5b543c4692f6e42d12252b03d5e43a255 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 30 May 2018 20:53:45 +0000 Subject: Add install requires matplotlib and numpy in setup.py Add Python test fail explanation git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3494 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 1bac18228a22ea718bb8c77d38efdf84f9b228eb --- src/cython/doc/installation.rst | 3 +++ src/cython/setup.py.in | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/cython/doc/installation.rst b/src/cython/doc/installation.rst index c182f176..28d9dba2 100644 --- a/src/cython/doc/installation.rst +++ b/src/cython/doc/installation.rst @@ -43,6 +43,9 @@ following command in a terminal: export PYTHONPATH='$PYTHONPATH:/path-to-gudhi/build/cython' ctest -R py_test +If tests fail, please try to :code:`import gudhi` and check the errors. +The problem can come from a third-party library bad link or installation. + Documentation ============= diff --git a/src/cython/setup.py.in b/src/cython/setup.py.in index c767e93d..eda1ee04 100644 --- a/src/cython/setup.py.in +++ b/src/cython/setup.py.in @@ -46,4 +46,11 @@ setup( version='@GUDHI_VERSION@', url='http://gudhi.gforge.inria.fr/', ext_modules = cythonize(gudhi), + + #install_requires = required, + install_requires = [ + "matplotlib", + "numpy", + "cython", + ], ) -- cgit v1.2.3 From ef31bf2f968299589e9668e3b00ab90228ad08bf Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 5 Jun 2018 16:05:54 +0000 Subject: Add author name on main page git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3536 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 7fc4d6de9bc65d51f4f0fb263b01a88adcab77d3 --- src/common/doc/main_page.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h index 30d4e71b..db1e80ce 100644 --- a/src/common/doc/main_page.h +++ b/src/common/doc/main_page.h @@ -79,7 +79,7 @@
@@ -52,8 +52,8 @@ Copyright: GPL v3
- The Cech complex is a proximity graph that allows to construct a simplicial complex from it. - It guarantees the simplices inserted are inside a ball of a given radius.
+ The Čech complex is a simplicial complex constructed from a proximity graph.
+ The set of all simplices is filtered by the radius of their minimal enclosing ball.
User manual: \ref cech_complex - Reference manual: Gudhi::cech_complex::Cech_complex
-- cgit v1.2.3 From 8079f0a538d0747fffe7f1a9d9f1b29dbb988ac2 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 5 Jun 2018 16:10:17 +0000 Subject: Fix warning from branch warning_fix_vincent git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3537 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 830cd74dcec65ed8944639732acd9e72d4a19632 --- .../include/gudhi/Simplex_tree/Simplex_tree_iterators.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 335bac1e..02c8bb64 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 @@ -101,7 +101,9 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade< // any end() iterator explicit Simplex_tree_boundary_simplex_iterator(SimplexTree * st) - : sib_(nullptr), + : last_(st->null_vertex()), + next_(st->null_vertex()), + sib_(nullptr), sh_(st->null_simplex()), st_(st) { } @@ -109,7 +111,9 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade< template Simplex_tree_boundary_simplex_iterator(SimplexTree * st, SimplexHandle sh) : last_(sh->first), + next_(st->null_vertex()), sib_(nullptr), + sh_(st->null_simplex()), st_(st) { // Only check once at the beginning instead of for every increment, as this is expensive. if (SimplexTree::Options::contiguous_vertices) @@ -123,9 +127,7 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade< sh_ = sib_->members_.begin()+next_; else sh_ = sib_->find(next_); - } else { - sh_ = st->null_simplex(); - } // vertex: == end() + } } private: -- cgit v1.2.3 From dde12ef73a36913c06d33ff3f5c2df43dd209930 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Tue, 5 Jun 2018 19:44:59 +0000 Subject: Add new layout for documentation website for Doxygen (C++) and sphinx (Python) git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3539 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 2dc9edea317426fad7a7d99d849145845eb75bb9 --- src/common/doc/header.html | 109 +++++++++++++++++----------------- src/cython/doc/_templates/layout.html | 109 +++++++++++++++++----------------- 2 files changed, 110 insertions(+), 108 deletions(-) diff --git a/src/common/doc/header.html b/src/common/doc/header.html index 2f54e68d..4661dbbe 100644 --- a/src/common/doc/header.html +++ b/src/common/doc/header.html @@ -24,60 +24,61 @@ $extrastylesheet diff --git a/src/cython/doc/_templates/layout.html b/src/cython/doc/_templates/layout.html index c9356116..613d7d06 100644 --- a/src/cython/doc/_templates/layout.html +++ b/src/cython/doc/_templates/layout.html @@ -166,60 +166,61 @@ -- cgit v1.2.3 From e64a8b5cfd08759b2e43804539db05f44c2615ad Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 6 Jun 2018 09:16:00 +0000 Subject: Fix sphinx warning and issues due to new version of sphinx Modify the doc for persistence diagram git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3543 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 3efbc052bce9a11a6b4a758f8229e91eece2a7f4 --- data/persistence_diagram/rips_on_tore3D_1307.pers | 2044 ++++++++++++++++++++ src/cython/doc/_templates/layout.html | 13 +- src/cython/doc/alpha_complex_ref.rst | 4 + src/cython/doc/alpha_complex_sum.inc | 22 + src/cython/doc/alpha_complex_sum.rst | 22 - src/cython/doc/alpha_complex_user.rst | 12 +- src/cython/doc/bottleneck_distance_sum.inc | 15 + src/cython/doc/bottleneck_distance_sum.rst | 15 - src/cython/doc/bottleneck_distance_user.rst | 6 +- src/cython/doc/citation.rst | 4 + src/cython/doc/conf.py | 3 +- src/cython/doc/cubical_complex_ref.rst | 4 + src/cython/doc/cubical_complex_sum.inc | 15 + src/cython/doc/cubical_complex_sum.rst | 15 - src/cython/doc/cubical_complex_user.rst | 5 + .../doc/euclidean_strong_witness_complex_ref.rst | 4 + src/cython/doc/euclidean_witness_complex_ref.rst | 4 + src/cython/doc/examples.rst | 4 + src/cython/doc/fileformats.rst | 4 + src/cython/doc/index.rst | 18 +- src/cython/doc/installation.rst | 4 + src/cython/doc/periodic_cubical_complex_ref.rst | 4 + src/cython/doc/persistence_graphical_tools_ref.rst | 4 + src/cython/doc/persistence_graphical_tools_sum.inc | 12 + src/cython/doc/persistence_graphical_tools_sum.rst | 12 - .../doc/persistence_graphical_tools_user.rst | 53 +- src/cython/doc/persistent_cohomology_sum.inc | 27 + src/cython/doc/persistent_cohomology_sum.rst | 27 - src/cython/doc/persistent_cohomology_user.rst | 4 + src/cython/doc/pyplots/barcode_persistence.py | 7 - src/cython/doc/pyplots/diagram_persistence.py | 9 - src/cython/doc/reader_utils_ref.rst | 4 + src/cython/doc/rips_complex_ref.rst | 4 + src/cython/doc/rips_complex_sum.inc | 17 + src/cython/doc/rips_complex_sum.rst | 17 - src/cython/doc/rips_complex_user.rst | 6 +- src/cython/doc/simplex_tree_ref.rst | 4 + src/cython/doc/simplex_tree_sum.inc | 14 + src/cython/doc/simplex_tree_sum.rst | 14 - src/cython/doc/simplex_tree_user.rst | 6 +- src/cython/doc/strong_witness_complex_ref.rst | 4 + src/cython/doc/tangential_complex_ref.rst | 4 + src/cython/doc/tangential_complex_sum.inc | 15 + src/cython/doc/tangential_complex_sum.rst | 15 - src/cython/doc/tangential_complex_user.rst | 6 +- src/cython/doc/todos.rst | 4 + src/cython/doc/witness_complex_ref.rst | 4 + src/cython/doc/witness_complex_sum.inc | 19 + src/cython/doc/witness_complex_sum.rst | 19 - src/cython/doc/witness_complex_user.rst | 6 +- src/cython/setup.py.in | 2 - 51 files changed, 2355 insertions(+), 225 deletions(-) create mode 100644 data/persistence_diagram/rips_on_tore3D_1307.pers create mode 100644 src/cython/doc/alpha_complex_sum.inc delete mode 100644 src/cython/doc/alpha_complex_sum.rst create mode 100644 src/cython/doc/bottleneck_distance_sum.inc delete mode 100644 src/cython/doc/bottleneck_distance_sum.rst create mode 100644 src/cython/doc/cubical_complex_sum.inc delete mode 100644 src/cython/doc/cubical_complex_sum.rst create mode 100644 src/cython/doc/persistence_graphical_tools_sum.inc delete mode 100644 src/cython/doc/persistence_graphical_tools_sum.rst create mode 100644 src/cython/doc/persistent_cohomology_sum.inc delete mode 100644 src/cython/doc/persistent_cohomology_sum.rst delete mode 100755 src/cython/doc/pyplots/barcode_persistence.py delete mode 100755 src/cython/doc/pyplots/diagram_persistence.py create mode 100644 src/cython/doc/rips_complex_sum.inc delete mode 100644 src/cython/doc/rips_complex_sum.rst create mode 100644 src/cython/doc/simplex_tree_sum.inc delete mode 100644 src/cython/doc/simplex_tree_sum.rst create mode 100644 src/cython/doc/tangential_complex_sum.inc delete mode 100644 src/cython/doc/tangential_complex_sum.rst create mode 100644 src/cython/doc/witness_complex_sum.inc delete mode 100644 src/cython/doc/witness_complex_sum.rst diff --git a/data/persistence_diagram/rips_on_tore3D_1307.pers b/data/persistence_diagram/rips_on_tore3D_1307.pers new file mode 100644 index 00000000..f1bd600b --- /dev/null +++ b/data/persistence_diagram/rips_on_tore3D_1307.pers @@ -0,0 +1,2044 @@ +2 0.138335 inf +1 0.104347 inf +1 0.0983494 inf +0 0 inf +0 0 0.122545 +0 0 0.121171 +0 0 0.120964 +0 0 0.12057 +0 0 0.12047 +0 0 0.120414 +0 0 0.119758 +0 0 0.119091 +0 0 0.118893 +0 0 0.118874 +0 0 0.118398 +0 0 0.118204 +0 0 0.118102 +0 0 0.118095 +0 0 0.117908 +0 0 0.117806 +0 0 0.117768 +0 0 0.117751 +0 0 0.117407 +0 0 0.117253 +0 0 0.116946 +0 0 0.116892 +0 0 0.116706 +0 0 0.116528 +0 0 0.116232 +0 0 0.115975 +0 0 0.115683 +0 0 0.115646 +0 0 0.115363 +0 0 0.115251 +0 0 0.115146 +0 0 0.115117 +0 0 0.115023 +0 0 0.114815 +0 0 0.114723 +0 0 0.1147 +0 0 0.114614 +0 0 0.114402 +0 0 0.114275 +0 0 0.114223 +0 0 0.113893 +0 0 0.113764 +0 0 0.113647 +0 0 0.113442 +0 0 0.113398 +0 0 0.113164 +0 0 0.113063 +0 0 0.113049 +0 0 0.112954 +0 0 0.112901 +0 0 0.112891 +0 0 0.112885 +0 0 0.112865 +0 0 0.112826 +0 0 0.112796 +0 0 0.112766 +0 0 0.112608 +0 0 0.112307 +0 0 0.112264 +0 0 0.112184 +0 0 0.112147 +0 0 0.112082 +0 0 0.111801 +0 0 0.111735 +0 0 0.111625 +0 0 0.111604 +0 0 0.111575 +0 0 0.111377 +0 0 0.111343 +0 0 0.111156 +0 0 0.111117 +0 0 0.11106 +0 0 0.111002 +0 0 0.110975 +0 0 0.110881 +0 0 0.11069 +0 0 0.110493 +0 0 0.110475 +0 0 0.110435 +0 0 0.110311 +0 0 0.110289 +0 0 0.110272 +0 0 0.110233 +0 0 0.110208 +0 0 0.110205 +0 0 0.110137 +0 0 0.110108 +0 0 0.109917 +0 0 0.109875 +0 0 0.109867 +0 0 0.109799 +0 0 0.109791 +0 0 0.109754 +0 0 0.109736 +0 0 0.109555 +0 0 0.109497 +0 0 0.109492 +0 0 0.109298 +0 0 0.109242 +0 0 0.109079 +0 0 0.10898 +0 0 0.108948 +0 0 0.108943 +0 0 0.108932 +0 0 0.10893 +0 0 0.108922 +0 0 0.108825 +0 0 0.108627 +0 0 0.10856 +0 0 0.108534 +0 0 0.108511 +0 0 0.108472 +0 0 0.108444 +0 0 0.10836 +0 0 0.108346 +0 0 0.108339 +0 0 0.108289 +0 0 0.108224 +0 0 0.108176 +0 0 0.108162 +0 0 0.108154 +0 0 0.108103 +0 0 0.10808 +0 0 0.108051 +0 0 0.10802 +0 0 0.107985 +0 0 0.107938 +0 0 0.107932 +0 0 0.107859 +0 0 0.107802 +0 0 0.107766 +0 0 0.107761 +0 0 0.107733 +0 0 0.107731 +0 0 0.107725 +0 0 0.107557 +0 0 0.107536 +0 0 0.107535 +0 0 0.107516 +0 0 0.107477 +0 0 0.107471 +0 0 0.107469 +0 0 0.107445 +0 0 0.10744 +0 0 0.107419 +0 0 0.107336 +0 0 0.107313 +0 0 0.107297 +0 0 0.107267 +0 0 0.10717 +0 0 0.107131 +0 0 0.107067 +0 0 0.107039 +0 0 0.10689 +0 0 0.106828 +0 0 0.106744 +0 0 0.10666 +0 0 0.106639 +0 0 0.106637 +0 0 0.106593 +0 0 0.106535 +0 0 0.106455 +0 0 0.106438 +0 0 0.106428 +0 0 0.106402 +0 0 0.106382 +0 0 0.106273 +0 0 0.106187 +0 0 0.106182 +0 0 0.105991 +0 0 0.105911 +0 0 0.105803 +0 0 0.105792 +0 0 0.105763 +0 0 0.105749 +0 0 0.105725 +0 0 0.105672 +0 0 0.105622 +0 0 0.105605 +0 0 0.105558 +0 0 0.105484 +0 0 0.105439 +0 0 0.105415 +0 0 0.105389 +0 0 0.105369 +0 0 0.105346 +0 0 0.105339 +0 0 0.1053 +0 0 0.105274 +0 0 0.105206 +0 0 0.105187 +0 0 0.105133 +0 0 0.105093 +0 0 0.105088 +0 0 0.105083 +0 0 0.10505 +0 0 0.105021 +0 0 0.105015 +0 0 0.104978 +0 0 0.10494 +0 0 0.104898 +0 0 0.104883 +0 0 0.104836 +0 0 0.104832 +0 0 0.104746 +0 0 0.104722 +0 0 0.104718 +0 0 0.104692 +0 0 0.10468 +0 0 0.104641 +0 0 0.104638 +0 0 0.104527 +0 0 0.104507 +0 0 0.104477 +0 0 0.10447 +0 0 0.104422 +0 0 0.104414 +0 0 0.104411 +0 0 0.10434 +0 0 0.104314 +0 0 0.104286 +0 0 0.104274 +0 0 0.10427 +0 0 0.104222 +0 0 0.104206 +0 0 0.104201 +0 0 0.104185 +0 0 0.10416 +0 0 0.10415 +0 0 0.104114 +0 0 0.104113 +0 0 0.104099 +0 0 0.103988 +0 0 0.103974 +0 0 0.103946 +0 0 0.103925 +0 0 0.103897 +0 0 0.103852 +0 0 0.103724 +0 0 0.103667 +0 0 0.103651 +0 0 0.103641 +0 0 0.103637 +0 0 0.103574 +0 0 0.103557 +0 0 0.103536 +0 0 0.103516 +0 0 0.103469 +0 0 0.103456 +0 0 0.10344 +0 0 0.103427 +0 0 0.103421 +0 0 0.103376 +0 0 0.103358 +0 0 0.103266 +0 0 0.103263 +0 0 0.103249 +0 0 0.103192 +0 0 0.103156 +0 0 0.103092 +0 0 0.103081 +0 0 0.103058 +0 0 0.102872 +0 0 0.102835 +0 0 0.102805 +0 0 0.102768 +0 0 0.102758 +0 0 0.102752 +0 0 0.102741 +0 0 0.102739 +0 0 0.102715 +0 0 0.102696 +0 0 0.10265 +0 0 0.102553 +0 0 0.102486 +0 0 0.102486 +0 0 0.102467 +0 0 0.102441 +0 0 0.102363 +0 0 0.102346 +0 0 0.102298 +0 0 0.102266 +0 0 0.102253 +0 0 0.102217 +0 0 0.102193 +0 0 0.102191 +0 0 0.10216 +0 0 0.102117 +0 0 0.102031 +0 0 0.102007 +0 0 0.101945 +0 0 0.101907 +0 0 0.101896 +0 0 0.101855 +0 0 0.101847 +0 0 0.101843 +0 0 0.101833 +0 0 0.101822 +0 0 0.101821 +0 0 0.101809 +0 0 0.101699 +0 0 0.10155 +0 0 0.101538 +0 0 0.101493 +0 0 0.101468 +0 0 0.101447 +0 0 0.101403 +0 0 0.101392 +0 0 0.101377 +0 0 0.101373 +0 0 0.101355 +0 0 0.101341 +0 0 0.101286 +0 0 0.10122 +0 0 0.101184 +0 0 0.101126 +0 0 0.101084 +0 0 0.101084 +0 0 0.101072 +0 0 0.100981 +0 0 0.100929 +0 0 0.100921 +0 0 0.100844 +0 0 0.100805 +0 0 0.100797 +0 0 0.100772 +0 0 0.100749 +0 0 0.100749 +0 0 0.100679 +0 0 0.10064 +0 0 0.100635 +0 0 0.100613 +0 0 0.100599 +0 0 0.10052 +0 0 0.100512 +0 0 0.100462 +0 0 0.100399 +0 0 0.100346 +0 0 0.100324 +0 0 0.100276 +0 0 0.100269 +0 0 0.10026 +0 0 0.100249 +0 0 0.100173 +0 0 0.100143 +0 0 0.100132 +0 0 0.100016 +0 0 0.100004 +0 0 0.0999805 +0 0 0.0999609 +0 0 0.0999313 +0 0 0.0999304 +0 0 0.0998899 +0 0 0.099884 +0 0 0.0998646 +0 0 0.0998279 +0 0 0.0997317 +0 0 0.0997064 +0 0 0.0996974 +0 0 0.0996745 +0 0 0.0996681 +0 0 0.0996236 +0 0 0.0995811 +0 0 0.099502 +0 0 0.0994573 +0 0 0.0993738 +0 0 0.0993579 +0 0 0.0993118 +0 0 0.0993115 +0 0 0.099307 +0 0 0.099301 +0 0 0.0992841 +0 0 0.0992493 +0 0 0.0992196 +0 0 0.0992118 +0 0 0.0992002 +0 0 0.0991901 +0 0 0.0991748 +0 0 0.0991699 +0 0 0.0991355 +0 0 0.099127 +0 0 0.0991122 +0 0 0.0991061 +0 0 0.0991026 +0 0 0.0990777 +0 0 0.0990577 +0 0 0.0990106 +0 0 0.0989608 +0 0 0.0989511 +0 0 0.0989433 +0 0 0.0989068 +0 0 0.0989061 +0 0 0.0989017 +0 0 0.0988136 +0 0 0.0987844 +0 0 0.0987155 +0 0 0.0987137 +0 0 0.0987027 +0 0 0.0986656 +0 0 0.0986589 +0 0 0.0985188 +0 0 0.0985127 +0 0 0.0984978 +0 0 0.0984845 +0 0 0.0984384 +0 0 0.0984361 +0 0 0.0984105 +0 0 0.0983949 +0 0 0.0983794 +0 0 0.0983099 +0 0 0.0983022 +0 0 0.0982802 +0 0 0.098261 +0 0 0.0982605 +0 0 0.0982498 +0 0 0.0982427 +0 0 0.0982118 +0 0 0.0981918 +0 0 0.0981537 +0 0 0.0981249 +0 0 0.0981003 +0 0 0.0980403 +0 0 0.0980052 +0 0 0.0979611 +0 0 0.0979211 +0 0 0.0979103 +0 0 0.0978291 +0 0 0.0977825 +0 0 0.0977791 +0 0 0.0977691 +0 0 0.0977678 +0 0 0.0977566 +0 0 0.0977458 +0 0 0.0977308 +0 0 0.0976979 +0 0 0.0976947 +0 0 0.0976571 +0 0 0.0976316 +0 0 0.097628 +0 0 0.0976173 +0 0 0.097617 +0 0 0.0976144 +0 0 0.097594 +0 0 0.0975906 +0 0 0.0975423 +0 0 0.0975044 +0 0 0.0974811 +0 0 0.0974776 +0 0 0.09746 +0 0 0.0974517 +0 0 0.0974161 +0 0 0.097411 +0 0 0.0974102 +0 0 0.0973811 +0 0 0.0973704 +0 0 0.097361 +0 0 0.0973594 +0 0 0.0973475 +0 0 0.097347 +0 0 0.0973354 +0 0 0.0972601 +0 0 0.0972476 +0 0 0.0972407 +0 0 0.097222 +0 0 0.0971562 +0 0 0.097079 +0 0 0.0970225 +0 0 0.0970099 +0 0 0.0969931 +0 0 0.0969318 +0 0 0.0968345 +0 0 0.096738 +0 0 0.0967069 +0 0 0.0966177 +0 0 0.0966121 +0 0 0.0966075 +0 0 0.0965669 +0 0 0.0965524 +0 0 0.0965467 +0 0 0.0965306 +0 0 0.0964752 +0 0 0.0964273 +0 0 0.0964214 +0 0 0.0964044 +0 0 0.0963393 +0 0 0.0962953 +0 0 0.0962618 +0 0 0.0962443 +0 0 0.0962396 +0 0 0.0962072 +0 0 0.0961728 +0 0 0.0961412 +0 0 0.0960799 +0 0 0.0960719 +0 0 0.0960553 +0 0 0.0959975 +0 0 0.0959885 +0 0 0.0959874 +0 0 0.0959671 +0 0 0.0959571 +0 0 0.0959249 +0 0 0.0958821 +0 0 0.0958582 +0 0 0.0958079 +0 0 0.095807 +0 0 0.0957505 +0 0 0.0957349 +0 0 0.095686 +0 0 0.0956663 +0 0 0.0956426 +0 0 0.0955825 +0 0 0.095551 +0 0 0.095509 +0 0 0.0954092 +0 0 0.0954003 +0 0 0.0953929 +0 0 0.0953089 +0 0 0.0953083 +0 0 0.0952959 +0 0 0.0952952 +0 0 0.0952427 +0 0 0.0951664 +0 0 0.0951311 +0 0 0.0951128 +0 0 0.0950144 +0 0 0.0949971 +0 0 0.0949351 +0 0 0.0948798 +0 0 0.0948727 +0 0 0.0947763 +0 0 0.0947681 +0 0 0.0947623 +0 0 0.0947217 +0 0 0.0946984 +0 0 0.0946978 +0 0 0.0946832 +0 0 0.0946395 +0 0 0.0946177 +0 0 0.0945759 +0 0 0.0945205 +0 0 0.0944995 +0 0 0.0944882 +0 0 0.0944571 +0 0 0.0944524 +0 0 0.0944435 +0 0 0.0944357 +0 0 0.0943982 +0 0 0.0943872 +0 0 0.094384 +0 0 0.0943324 +0 0 0.0942979 +0 0 0.094255 +0 0 0.0942476 +0 0 0.0942305 +0 0 0.0941642 +0 0 0.094092 +0 0 0.0940547 +0 0 0.0940288 +0 0 0.0939997 +0 0 0.09392 +0 0 0.0938552 +0 0 0.0937687 +0 0 0.0936632 +0 0 0.0936529 +0 0 0.0936278 +0 0 0.0936091 +0 0 0.093571 +0 0 0.0935084 +0 0 0.0935022 +0 0 0.0934953 +0 0 0.0934922 +0 0 0.0934884 +0 0 0.0933871 +0 0 0.093311 +0 0 0.0932948 +0 0 0.0932911 +0 0 0.0932711 +0 0 0.0932653 +0 0 0.0932573 +0 0 0.0932562 +0 0 0.0932506 +0 0 0.0932066 +0 0 0.0932042 +0 0 0.0931597 +0 0 0.0931377 +0 0 0.0931191 +0 0 0.0930766 +0 0 0.0930576 +0 0 0.0930453 +0 0 0.0930159 +0 0 0.0928905 +0 0 0.0928695 +0 0 0.0928598 +0 0 0.0928533 +0 0 0.0928206 +0 0 0.0926988 +0 0 0.0926135 +0 0 0.0925997 +0 0 0.0925371 +0 0 0.0924703 +0 0 0.0924285 +0 0 0.0924272 +0 0 0.0924161 +0 0 0.0924104 +0 0 0.0922615 +0 0 0.0922589 +0 0 0.0922246 +0 0 0.0922069 +0 0 0.0921781 +0 0 0.0921505 +0 0 0.0921288 +0 0 0.0921087 +0 0 0.092054 +0 0 0.0920027 +0 0 0.091992 +0 0 0.0919474 +0 0 0.0919331 +0 0 0.0918839 +0 0 0.0918463 +0 0 0.091819 +0 0 0.0918129 +0 0 0.0917888 +0 0 0.0917854 +0 0 0.0917808 +0 0 0.0917657 +0 0 0.0917037 +0 0 0.0916728 +0 0 0.09166 +0 0 0.0916551 +0 0 0.0916386 +0 0 0.0915873 +0 0 0.091561 +0 0 0.0915438 +0 0 0.0915334 +0 0 0.0914912 +0 0 0.09148 +0 0 0.0914736 +0 0 0.0914634 +0 0 0.0913736 +0 0 0.0913735 +0 0 0.0913423 +0 0 0.0912014 +0 0 0.0912006 +0 0 0.0911837 +0 0 0.0911558 +0 0 0.0911005 +0 0 0.0910993 +0 0 0.0910305 +0 0 0.0910083 +0 0 0.0910021 +0 0 0.0909993 +0 0 0.0909587 +0 0 0.0909123 +0 0 0.0909078 +0 0 0.0908981 +0 0 0.0908775 +0 0 0.0908673 +0 0 0.0907541 +0 0 0.0907067 +0 0 0.0906992 +0 0 0.090662 +0 0 0.0905038 +0 0 0.0904268 +0 0 0.0904089 +0 0 0.0903719 +0 0 0.0903532 +0 0 0.0902778 +0 0 0.090237 +0 0 0.0902248 +0 0 0.0901963 +0 0 0.090193 +0 0 0.090185 +0 0 0.0901586 +0 0 0.0901274 +0 0 0.0900876 +0 0 0.0900408 +0 0 0.0900098 +0 0 0.0900073 +0 0 0.0899733 +0 0 0.0899145 +0 0 0.0898825 +0 0 0.0898324 +0 0 0.0898248 +0 0 0.089792 +0 0 0.0897916 +0 0 0.089778 +0 0 0.0897022 +0 0 0.0896718 +0 0 0.0896671 +0 0 0.0895692 +0 0 0.0895243 +0 0 0.0895045 +0 0 0.0894882 +0 0 0.0894629 +0 0 0.0893629 +0 0 0.0893336 +0 0 0.0893309 +0 0 0.0893193 +0 0 0.0892099 +0 0 0.089175 +0 0 0.0891563 +0 0 0.0891518 +0 0 0.0890728 +0 0 0.0890717 +0 0 0.0890423 +0 0 0.0890158 +0 0 0.0890093 +0 0 0.0890021 +0 0 0.0889876 +0 0 0.0889287 +0 0 0.0889174 +0 0 0.0888924 +0 0 0.0888761 +0 0 0.0888682 +0 0 0.0887979 +0 0 0.0887824 +0 0 0.0887418 +0 0 0.0887001 +0 0 0.0886274 +0 0 0.0886194 +0 0 0.0886061 +0 0 0.0885183 +0 0 0.0885029 +0 0 0.0884997 +0 0 0.0884676 +0 0 0.0884379 +0 0 0.0884268 +0 0 0.0884101 +0 0 0.0883594 +0 0 0.0883318 +0 0 0.0883027 +0 0 0.0882989 +0 0 0.0882955 +0 0 0.088251 +0 0 0.0882503 +0 0 0.0881693 +0 0 0.0881399 +0 0 0.0881344 +0 0 0.088097 +0 0 0.0880887 +0 0 0.0880663 +0 0 0.0880612 +0 0 0.0880102 +0 0 0.0879131 +0 0 0.0878652 +0 0 0.08786 +0 0 0.087834 +0 0 0.0878146 +0 0 0.087757 +0 0 0.0877406 +0 0 0.0876805 +0 0 0.0876786 +0 0 0.0876403 +0 0 0.087596 +0 0 0.0875844 +0 0 0.0875718 +0 0 0.0875645 +0 0 0.087518 +0 0 0.0874942 +0 0 0.0874353 +0 0 0.0874336 +0 0 0.0873725 +0 0 0.087351 +0 0 0.087348 +0 0 0.0872871 +0 0 0.0872623 +0 0 0.0872584 +0 0 0.0872349 +0 0 0.0871851 +0 0 0.0871834 +0 0 0.0870855 +0 0 0.0870338 +0 0 0.0870283 +0 0 0.0869914 +0 0 0.0869755 +0 0 0.0869607 +0 0 0.0869219 +0 0 0.0869096 +0 0 0.0868956 +0 0 0.0868514 +0 0 0.0868374 +0 0 0.0868301 +0 0 0.0867937 +0 0 0.0867655 +0 0 0.0867603 +0 0 0.0867516 +0 0 0.0867123 +0 0 0.0866914 +0 0 0.0866306 +0 0 0.0866296 +0 0 0.0866279 +0 0 0.0866149 +0 0 0.0866046 +0 0 0.086589 +0 0 0.0865754 +0 0 0.0865427 +0 0 0.0865283 +0 0 0.0865053 +0 0 0.0864874 +0 0 0.0864538 +0 0 0.0864228 +0 0 0.0864194 +0 0 0.0863696 +0 0 0.0862914 +0 0 0.0862708 +0 0 0.0862707 +0 0 0.0862618 +0 0 0.0862079 +0 0 0.0861181 +0 0 0.0861139 +0 0 0.0860775 +0 0 0.0859588 +0 0 0.0858682 +0 0 0.0858302 +0 0 0.0858208 +0 0 0.085786 +0 0 0.0857713 +0 0 0.0857462 +0 0 0.0857051 +0 0 0.0855555 +0 0 0.0855326 +0 0 0.0854601 +0 0 0.0854086 +0 0 0.0853601 +0 0 0.0853515 +0 0 0.0853294 +0 0 0.0852582 +0 0 0.085249 +0 0 0.0851983 +0 0 0.0851962 +0 0 0.0851742 +0 0 0.0851614 +0 0 0.0851573 +0 0 0.0851292 +0 0 0.0850985 +0 0 0.0850658 +0 0 0.0850454 +0 0 0.0849863 +0 0 0.0849704 +0 0 0.0849174 +0 0 0.0849149 +0 0 0.084807 +0 0 0.0847976 +0 0 0.0847651 +0 0 0.0847603 +0 0 0.0847507 +0 0 0.084721 +0 0 0.0847015 +0 0 0.0846691 +0 0 0.0846272 +0 0 0.0846259 +0 0 0.084625 +0 0 0.0845387 +0 0 0.0845105 +0 0 0.0844777 +0 0 0.0844517 +0 0 0.0844504 +0 0 0.0844359 +0 0 0.0844267 +0 0 0.0843912 +0 0 0.0843866 +0 0 0.0843828 +0 0 0.0843443 +0 0 0.0843409 +0 0 0.0843398 +0 0 0.0843247 +0 0 0.0842665 +0 0 0.0842532 +0 0 0.0842054 +0 0 0.0841559 +0 0 0.0841412 +0 0 0.08408 +0 0 0.0840751 +0 0 0.0839919 +0 0 0.0839865 +0 0 0.0839348 +0 0 0.083926 +0 0 0.0839201 +0 0 0.0838728 +0 0 0.0838659 +0 0 0.083832 +0 0 0.0838253 +0 0 0.0838225 +0 0 0.08381 +0 0 0.0837678 +0 0 0.0837502 +0 0 0.0836721 +0 0 0.0834546 +0 0 0.083452 +0 0 0.0834329 +0 0 0.0834192 +0 0 0.0834107 +0 0 0.0833158 +0 0 0.0832953 +0 0 0.0832912 +0 0 0.0832852 +0 0 0.0832816 +0 0 0.0831875 +0 0 0.0831751 +0 0 0.0831381 +0 0 0.08313 +0 0 0.0830867 +0 0 0.0830303 +0 0 0.0830191 +0 0 0.0829953 +0 0 0.0829902 +0 0 0.082963 +0 0 0.0829545 +0 0 0.0829356 +0 0 0.0829183 +0 0 0.0829129 +0 0 0.082855 +0 0 0.0828445 +0 0 0.0828289 +0 0 0.0827917 +0 0 0.0827618 +0 0 0.0827603 +0 0 0.0826968 +0 0 0.0826829 +0 0 0.0826788 +0 0 0.0825669 +0 0 0.0825437 +0 0 0.0825384 +0 0 0.0825341 +0 0 0.0824971 +0 0 0.0824907 +0 0 0.0824755 +0 0 0.0824587 +0 0 0.0824499 +0 0 0.0823912 +0 0 0.0823653 +0 0 0.082329 +0 0 0.0822893 +0 0 0.0822666 +0 0 0.0822373 +0 0 0.0822316 +0 0 0.0822187 +0 0 0.0820697 +0 0 0.082068 +0 0 0.0820532 +0 0 0.0820261 +0 0 0.0820089 +0 0 0.0819164 +0 0 0.0818598 +0 0 0.0818388 +0 0 0.0818334 +0 0 0.0817903 +0 0 0.0817481 +0 0 0.0816978 +0 0 0.0816822 +0 0 0.0816791 +0 0 0.0816385 +0 0 0.0816314 +0 0 0.0816145 +0 0 0.0816071 +0 0 0.0816029 +0 0 0.0815479 +0 0 0.0815381 +0 0 0.0815247 +0 0 0.0815176 +0 0 0.0815082 +0 0 0.0814955 +0 0 0.081407 +0 0 0.0813536 +0 0 0.0812334 +0 0 0.0811714 +0 0 0.0811689 +0 0 0.0811418 +0 0 0.0811346 +0 0 0.0811328 +0 0 0.0811056 +0 0 0.0811001 +0 0 0.0810472 +0 0 0.0810287 +0 0 0.0810215 +0 0 0.0809856 +0 0 0.0809801 +0 0 0.0809611 +0 0 0.0808721 +0 0 0.0808622 +0 0 0.0808618 +0 0 0.0808543 +0 0 0.0807894 +0 0 0.0807893 +0 0 0.0807705 +0 0 0.080715 +0 0 0.0806896 +0 0 0.0805033 +0 0 0.0804637 +0 0 0.0803715 +0 0 0.0803676 +0 0 0.0803405 +0 0 0.08034 +0 0 0.0803392 +0 0 0.0803318 +0 0 0.0803184 +0 0 0.080315 +0 0 0.0803084 +0 0 0.0802989 +0 0 0.0802988 +0 0 0.080297 +0 0 0.0802781 +0 0 0.0802677 +0 0 0.0802418 +0 0 0.0802358 +0 0 0.0802204 +0 0 0.080121 +0 0 0.0800679 +0 0 0.0800673 +0 0 0.0800411 +0 0 0.0800223 +0 0 0.0799564 +0 0 0.0799555 +0 0 0.0799524 +0 0 0.0799261 +0 0 0.0799149 +0 0 0.0798384 +0 0 0.0798239 +0 0 0.0798187 +0 0 0.079787 +0 0 0.0796839 +0 0 0.0796206 +0 0 0.0795918 +0 0 0.0795738 +0 0 0.0795622 +0 0 0.0795417 +0 0 0.0795402 +0 0 0.07953 +0 0 0.07946 +0 0 0.0794184 +0 0 0.0793805 +0 0 0.0793321 +0 0 0.0791912 +0 0 0.0791848 +0 0 0.0791774 +0 0 0.0790722 +0 0 0.0790089 +0 0 0.0789809 +0 0 0.0789498 +0 0 0.0789257 +0 0 0.0788734 +0 0 0.0788599 +0 0 0.0787641 +0 0 0.0787246 +0 0 0.0785622 +0 0 0.0785047 +0 0 0.078495 +0 0 0.0784875 +0 0 0.0784244 +0 0 0.0784187 +0 0 0.0783668 +0 0 0.0783633 +0 0 0.0782278 +0 0 0.0781832 +0 0 0.0781777 +0 0 0.0781513 +0 0 0.0781258 +0 0 0.0780305 +0 0 0.0780201 +0 0 0.0780181 +0 0 0.0780073 +0 0 0.077985 +0 0 0.0779695 +0 0 0.077938 +0 0 0.0778787 +0 0 0.0778179 +0 0 0.0777929 +0 0 0.0777845 +0 0 0.0777642 +0 0 0.0776513 +0 0 0.0776244 +0 0 0.0776135 +0 0 0.0775219 +0 0 0.0774934 +0 0 0.0774764 +0 0 0.0774541 +0 0 0.0774391 +0 0 0.0774203 +0 0 0.0773458 +0 0 0.0773391 +0 0 0.0773344 +0 0 0.0773236 +0 0 0.0773215 +0 0 0.0771755 +0 0 0.0771752 +0 0 0.0771671 +0 0 0.0770662 +0 0 0.0770659 +0 0 0.0769936 +0 0 0.076986 +0 0 0.0768987 +0 0 0.0768589 +0 0 0.0768001 +0 0 0.0767999 +0 0 0.0767277 +0 0 0.07672 +0 0 0.0767033 +0 0 0.0766285 +0 0 0.0766201 +0 0 0.0765619 +0 0 0.07653 +0 0 0.0764597 +0 0 0.0764593 +0 0 0.0762673 +0 0 0.0761308 +0 0 0.0760972 +0 0 0.0760373 +0 0 0.0760352 +0 0 0.0760226 +0 0 0.0759521 +0 0 0.0758866 +0 0 0.0758453 +0 0 0.075843 +0 0 0.0757932 +0 0 0.0757831 +0 0 0.0755611 +0 0 0.0755108 +0 0 0.075429 +0 0 0.0754205 +0 0 0.0753804 +0 0 0.0753703 +0 0 0.0753166 +0 0 0.075056 +0 0 0.0750491 +0 0 0.075046 +0 0 0.0749483 +0 0 0.0749391 +0 0 0.074843 +0 0 0.0748208 +0 0 0.0748122 +0 0 0.0747848 +0 0 0.0747133 +0 0 0.0746998 +0 0 0.074675 +0 0 0.0746619 +0 0 0.0746273 +0 0 0.0746011 +0 0 0.0745912 +0 0 0.0744812 +0 0 0.0744204 +0 0 0.0743043 +0 0 0.0742461 +0 0 0.074126 +0 0 0.0740759 +0 0 0.0740404 +0 0 0.0740253 +0 0 0.0739941 +0 0 0.0739699 +0 0 0.0738437 +0 0 0.0737842 +0 0 0.0737689 +0 0 0.073745 +0 0 0.0737311 +0 0 0.0735169 +0 0 0.0734621 +0 0 0.0733397 +0 0 0.073219 +0 0 0.0732121 +0 0 0.0731369 +0 0 0.0730708 +0 0 0.072856 +0 0 0.0728459 +0 0 0.0728339 +0 0 0.0727474 +0 0 0.0727014 +0 0 0.0725563 +0 0 0.0725443 +0 0 0.0724734 +0 0 0.0724154 +0 0 0.0721943 +0 0 0.0720927 +0 0 0.071931 +0 0 0.0719287 +0 0 0.0717993 +0 0 0.0717989 +0 0 0.0716285 +0 0 0.0715618 +0 0 0.0714544 +0 0 0.0713816 +0 0 0.0713583 +0 0 0.0713392 +0 0 0.0712466 +0 0 0.0712151 +0 0 0.071201 +0 0 0.0710418 +0 0 0.0709326 +0 0 0.0708223 +0 0 0.0707306 +0 0 0.0706176 +0 0 0.0703058 +0 0 0.0702881 +0 0 0.0702202 +0 0 0.0701399 +0 0 0.0695755 +0 0 0.0695132 +0 0 0.0694435 +0 0 0.069298 +0 0 0.0692617 +0 0 0.069201 +0 0 0.0691416 +0 0 0.0691246 +0 0 0.0691224 +0 0 0.0689761 +0 0 0.0687513 +0 0 0.068751 +0 0 0.0684475 +0 0 0.0681675 +0 0 0.0680444 +0 0 0.067827 +0 0 0.0677432 +0 0 0.0676582 +0 0 0.0676575 +0 0 0.0674522 +0 0 0.0674039 +0 0 0.0673475 +0 0 0.067117 +0 0 0.0668301 +0 0 0.0667495 +0 0 0.0666906 +0 0 0.066585 +0 0 0.0665527 +0 0 0.0665475 +0 0 0.0663859 +0 0 0.0663762 +0 0 0.0659211 +0 0 0.065897 +0 0 0.0658765 +0 0 0.0658305 +0 0 0.065485 +0 0 0.0654654 +0 0 0.0654504 +0 0 0.0653854 +0 0 0.06519 +0 0 0.0651654 +0 0 0.0651053 +0 0 0.0651005 +0 0 0.0649342 +0 0 0.0647983 +0 0 0.0645611 +0 0 0.064503 +0 0 0.0643878 +0 0 0.0641541 +0 0 0.0640333 +0 0 0.0639737 +0 0 0.0637212 +0 0 0.0635186 +0 0 0.063326 +0 0 0.0632864 +0 0 0.0632523 +0 0 0.0631945 +0 0 0.0630431 +0 0 0.0630282 +0 0 0.0628496 +0 0 0.0628005 +0 0 0.0627994 +0 0 0.0624745 +0 0 0.062401 +0 0 0.0623043 +0 0 0.0622939 +0 0 0.0620624 +0 0 0.0619763 +0 0 0.0619092 +0 0 0.0617949 +0 0 0.0616653 +0 0 0.0613634 +0 0 0.0611641 +0 0 0.0611428 +0 0 0.0610917 +0 0 0.0609721 +0 0 0.0609721 +0 0 0.060968 +0 0 0.0608642 +0 0 0.0608431 +0 0 0.0607373 +0 0 0.0603037 +0 0 0.0602398 +0 0 0.060237 +0 0 0.0601804 +0 0 0.0596339 +0 0 0.0595326 +0 0 0.0590727 +0 0 0.0589673 +0 0 0.0588864 +0 0 0.058629 +0 0 0.0586267 +0 0 0.0586052 +0 0 0.058033 +0 0 0.0578023 +0 0 0.0577624 +0 0 0.0576869 +0 0 0.0576773 +0 0 0.0576394 +0 0 0.057415 +0 0 0.057225 +0 0 0.0567939 +0 0 0.0567896 +0 0 0.0564245 +0 0 0.0563586 +0 0 0.0561217 +0 0 0.0560577 +0 0 0.0559755 +0 0 0.0557566 +0 0 0.0556232 +0 0 0.055521 +0 0 0.0550926 +0 0 0.0543985 +1 0.0997444 0.137724 +1 0.0963675 0.134298 +1 0.0997164 0.136077 +1 0.0993225 0.134439 +1 0.100243 0.135175 +1 0.102608 0.137141 +1 0.0988401 0.132691 +1 0.103142 0.136828 +1 0.100554 0.134097 +1 0.099464 0.13294 +1 0.0868897 0.119904 +1 0.0986767 0.131216 +1 0.102063 0.134272 +1 0.101951 0.133649 +1 0.104507 0.136174 +1 0.104789 0.136318 +1 0.100679 0.131807 +1 0.0979544 0.128526 +1 0.0992865 0.12979 +1 0.10505 0.135444 +1 0.106493 0.13644 +1 0.104331 0.13427 +1 0.0887233 0.116997 +1 0.100333 0.128453 +1 0.103249 0.130847 +1 0.0928315 0.12026 +1 0.103681 0.131101 +1 0.102419 0.129772 +1 0.107467 0.134504 +1 0.106298 0.13332 +1 0.0863482 0.113056 +1 0.0876685 0.114328 +1 0.102973 0.129426 +1 0.105968 0.132336 +1 0.101557 0.127648 +1 0.103991 0.129943 +1 0.0896578 0.115598 +1 0.102713 0.128567 +1 0.0943757 0.119823 +1 0.107541 0.132986 +1 0.0940415 0.119416 +1 0.106706 0.131892 +1 0.102134 0.127276 +1 0.08196 0.107085 +1 0.0971671 0.122111 +1 0.105478 0.130109 +1 0.0868236 0.111189 +1 0.0946673 0.118694 +1 0.101082 0.125066 +1 0.104529 0.128397 +1 0.113264 0.137008 +1 0.093598 0.117279 +1 0.102309 0.125859 +1 0.11137 0.134915 +1 0.109647 0.133169 +1 0.0961717 0.119526 +1 0.0914649 0.11455 +1 0.104092 0.126992 +1 0.110014 0.13285 +1 0.0969412 0.119714 +1 0.096505 0.119274 +1 0.107733 0.130472 +1 0.105091 0.127774 +1 0.107621 0.130186 +1 0.101354 0.12387 +1 0.0972194 0.119734 +1 0.111868 0.134382 +1 0.103895 0.126399 +1 0.105818 0.128237 +1 0.093991 0.11639 +1 0.106408 0.128753 +1 0.103344 0.125641 +1 0.0985647 0.120776 +1 0.107818 0.130023 +1 0.105326 0.127497 +1 0.108424 0.130451 +1 0.104609 0.126592 +1 0.105401 0.127105 +1 0.108989 0.130636 +1 0.109277 0.130788 +1 0.109884 0.131386 +1 0.096265 0.117692 +1 0.0973152 0.118724 +1 0.0978033 0.11914 +1 0.105971 0.127172 +1 0.105206 0.126174 +1 0.103094 0.123862 +1 0.0930364 0.1137 +1 0.0912215 0.111759 +1 0.105776 0.126283 +1 0.109117 0.129577 +1 0.11185 0.132307 +1 0.103348 0.123757 +1 0.112671 0.132855 +1 0.0873389 0.10751 +1 0.113148 0.133301 +1 0.107831 0.127932 +1 0.0942185 0.114302 +1 0.105423 0.125481 +1 0.100447 0.120461 +1 0.11413 0.134098 +1 0.103867 0.123829 +1 0.109305 0.129215 +1 0.111781 0.131688 +1 0.115776 0.135588 +1 0.0866676 0.106473 +1 0.0820686 0.101833 +1 0.109769 0.129516 +1 0.109777 0.129457 +1 0.0969575 0.116617 +1 0.111919 0.131476 +1 0.0974989 0.117008 +1 0.112238 0.131725 +1 0.0996257 0.119081 +1 0.101161 0.120602 +1 0.0894888 0.108793 +1 0.105021 0.124292 +1 0.110994 0.13024 +1 0.11702 0.136226 +1 0.108008 0.127172 +1 0.109482 0.128451 +1 0.108245 0.127174 +1 0.0942135 0.11312 +1 0.0992471 0.118131 +1 0.106623 0.125504 +1 0.0871873 0.106063 +1 0.108132 0.126863 +1 0.0987099 0.117422 +1 0.105374 0.124068 +1 0.114406 0.133036 +1 0.0914967 0.109997 +1 0.106521 0.1249 +1 0.0955759 0.113921 +1 0.111101 0.129415 +1 0.105122 0.122988 +1 0.091267 0.10908 +1 0.110432 0.127976 +1 0.088384 0.105787 +1 0.112786 0.130153 +1 0.106171 0.123531 +1 0.11442 0.13177 +1 0.109894 0.127229 +1 0.0937333 0.111036 +1 0.106992 0.124248 +1 0.0969028 0.114151 +1 0.116183 0.133233 +1 0.111736 0.128771 +1 0.0993216 0.116354 +1 0.0918067 0.108784 +1 0.104158 0.121134 +1 0.121028 0.137945 +1 0.119786 0.13669 +1 0.101491 0.118338 +1 0.0900619 0.106861 +1 0.105091 0.121844 +1 0.110906 0.12756 +1 0.0942669 0.110777 +1 0.0936016 0.110107 +1 0.103974 0.120299 +1 0.0903266 0.106619 +1 0.109739 0.126022 +1 0.101771 0.117974 +1 0.113957 0.130135 +1 0.104949 0.121106 +1 0.113859 0.129981 +1 0.107266 0.123375 +1 0.106434 0.122441 +1 0.0825495 0.0985038 +1 0.0928646 0.108775 +1 0.10811 0.124013 +1 0.115498 0.131352 +1 0.0857711 0.101566 +1 0.109411 0.12513 +1 0.0992369 0.114868 +1 0.104979 0.120588 +1 0.0928687 0.108436 +1 0.115035 0.130513 +1 0.10634 0.121795 +1 0.0972824 0.112736 +1 0.10508 0.120494 +1 0.0983725 0.11376 +1 0.101863 0.117236 +1 0.108938 0.124301 +1 0.107762 0.123121 +1 0.107407 0.122532 +1 0.102095 0.11715 +1 0.0926056 0.107647 +1 0.102122 0.117157 +1 0.111668 0.126692 +1 0.118187 0.133023 +1 0.091849 0.106675 +1 0.0955763 0.110398 +1 0.0897714 0.104589 +1 0.10026 0.115026 +1 0.117548 0.132301 +1 0.102181 0.116898 +1 0.1039 0.118592 +1 0.111494 0.126118 +1 0.117851 0.132466 +1 0.102311 0.116874 +1 0.104558 0.11907 +1 0.0826206 0.0971206 +1 0.0983518 0.112851 +1 0.108266 0.122713 +1 0.117257 0.13169 +1 0.112625 0.127054 +1 0.102561 0.116956 +1 0.105435 0.119828 +1 0.105814 0.120097 +1 0.110893 0.125174 +1 0.106181 0.120423 +1 0.10824 0.122466 +1 0.0998914 0.114008 +1 0.111463 0.125547 +1 0.106653 0.120712 +1 0.114143 0.128187 +1 0.0987227 0.112686 +1 0.10959 0.123535 +1 0.0866352 0.100557 +1 0.112146 0.126068 +1 0.088279 0.102 +1 0.110376 0.124047 +1 0.101789 0.115338 +1 0.106953 0.120376 +1 0.102707 0.116075 +1 0.0993793 0.112687 +1 0.108878 0.122123 +1 0.120961 0.134152 +1 0.10885 0.122037 +1 0.10738 0.12056 +1 0.101432 0.114597 +1 0.112405 0.125556 +1 0.106813 0.119921 +1 0.112285 0.12529 +1 0.11012 0.123063 +1 0.107717 0.120611 +1 0.0897068 0.102559 +1 0.0987529 0.111589 +1 0.0884634 0.101236 +1 0.0911157 0.103871 +1 0.11179 0.124441 +1 0.119124 0.131689 +1 0.114039 0.126565 +1 0.099306 0.111821 +1 0.109672 0.122139 +1 0.0967874 0.109252 +1 0.110451 0.122915 +1 0.10042 0.112872 +1 0.109867 0.122175 +1 0.11559 0.127875 +1 0.0924112 0.104671 +1 0.109943 0.122122 +1 0.0834784 0.0956025 +1 0.094677 0.106789 +1 0.0944022 0.106494 +1 0.104009 0.116052 +1 0.115406 0.127413 +1 0.0997344 0.111634 +1 0.0834597 0.0953123 +1 0.100265 0.112109 +1 0.108783 0.120624 +1 0.102596 0.114393 +1 0.105933 0.117699 +1 0.0955911 0.10734 +1 0.0915704 0.103284 +1 0.106757 0.11847 +1 0.108034 0.119659 +1 0.107063 0.118624 +1 0.102709 0.114217 +1 0.114347 0.125851 +1 0.101592 0.113064 +1 0.10639 0.117794 +1 0.109961 0.12135 +1 0.106373 0.117724 +1 0.111847 0.123153 +1 0.109539 0.120825 +1 0.0937078 0.104977 +1 0.106527 0.117767 +1 0.115889 0.127068 +1 0.108483 0.119661 +1 0.113189 0.124325 +1 0.106832 0.11787 +1 0.0875251 0.0984842 +1 0.115665 0.126551 +1 0.0929162 0.103716 +1 0.103776 0.114372 +1 0.0975538 0.108061 +1 0.107443 0.117928 +1 0.108814 0.119261 +1 0.103151 0.11358 +1 0.0967477 0.107154 +1 0.104979 0.115384 +1 0.101284 0.111574 +1 0.104981 0.115252 +1 0.0866825 0.0968263 +1 0.112361 0.122466 +1 0.108466 0.118492 +1 0.0975612 0.107561 +1 0.104563 0.114561 +1 0.0854395 0.095418 +1 0.0931692 0.10309 +1 0.107751 0.117652 +1 0.109986 0.119829 +1 0.107501 0.117327 +1 0.104998 0.114782 +1 0.107751 0.117509 +1 0.10754 0.117241 +1 0.111665 0.121357 +1 0.111614 0.121288 +1 0.0872065 0.0968618 +1 0.115761 0.125399 +1 0.10581 0.115426 +1 0.0991297 0.108708 +1 0.104736 0.114301 +1 0.103519 0.112982 +1 0.118659 0.12812 +1 0.107261 0.116706 +1 0.110161 0.119539 +1 0.108064 0.11741 +1 0.107143 0.116483 +1 0.108131 0.117452 +1 0.116427 0.125679 +1 0.0961462 0.105394 +1 0.112569 0.121769 +1 0.0927918 0.101983 +1 0.109636 0.118819 +1 0.0955058 0.104585 +1 0.114088 0.12316 +1 0.111901 0.120969 +1 0.121982 0.131005 +1 0.110988 0.119947 +1 0.0783357 0.0872192 +1 0.120473 0.129355 +1 0.0921671 0.101035 +1 0.119236 0.128003 +1 0.099794 0.108554 +1 0.111357 0.120079 +1 0.11281 0.121516 +1 0.109016 0.117706 +1 0.0931245 0.101783 +1 0.0878912 0.0964983 +1 0.102065 0.110672 +1 0.114585 0.123166 +1 0.110329 0.118883 +1 0.113325 0.121811 +1 0.101143 0.109586 +1 0.119504 0.127904 +1 0.0955487 0.103878 +1 0.0911453 0.0994428 +1 0.120339 0.128623 +1 0.12142 0.129703 +1 0.086379 0.0945977 +1 0.121228 0.129444 +1 0.103027 0.111225 +1 0.113614 0.1218 +1 0.108909 0.116988 +1 0.110248 0.118274 +1 0.0849678 0.0929893 +1 0.113829 0.121818 +1 0.0936312 0.101612 +1 0.102472 0.110429 +1 0.0868612 0.0948107 +1 0.114083 0.121935 +1 0.107052 0.114866 +1 0.105241 0.113053 +1 0.107277 0.114788 +1 0.115088 0.122587 +1 0.0829082 0.0903731 +1 0.10558 0.113044 +1 0.11145 0.118882 +1 0.110181 0.117593 +1 0.114964 0.122358 +1 0.0853302 0.0927109 +1 0.108171 0.115549 +1 0.106645 0.114018 +1 0.103232 0.110597 +1 0.106894 0.114255 +1 0.10519 0.11254 +1 0.127885 0.135225 +1 0.103913 0.111224 +1 0.10035 0.107651 +1 0.110201 0.1175 +1 0.0962617 0.103558 +1 0.108197 0.115486 +1 0.111458 0.11871 +1 0.098521 0.105772 +1 0.122219 0.129425 +1 0.0893661 0.0965408 +1 0.107871 0.115033 +1 0.104818 0.11198 +1 0.114927 0.122087 +1 0.120229 0.127389 +1 0.123751 0.130863 +1 0.0867811 0.0938895 +1 0.108725 0.115806 +1 0.111298 0.118332 +1 0.116132 0.123053 +1 0.102178 0.109074 +1 0.114549 0.121432 +1 0.110523 0.117281 +1 0.117735 0.124481 +1 0.0884368 0.0950995 +1 0.107416 0.114045 +1 0.106531 0.113154 +1 0.103014 0.109636 +1 0.10813 0.114736 +1 0.11639 0.122984 +1 0.109105 0.115698 +1 0.093397 0.0999793 +1 0.115742 0.122324 +1 0.118376 0.124898 +1 0.101104 0.107606 +1 0.115044 0.121535 +1 0.113476 0.119883 +1 0.105748 0.112141 +1 0.109104 0.115492 +1 0.125917 0.132265 +1 0.111914 0.118232 +1 0.125883 0.132169 +1 0.121077 0.127362 +1 0.115773 0.122013 +1 0.104313 0.110543 +1 0.118365 0.124566 +1 0.102092 0.108248 +1 0.120337 0.126478 +1 0.114541 0.120675 +1 0.0992553 0.105374 +1 0.105628 0.111687 +1 0.0850423 0.0910966 +1 0.103692 0.109734 +1 0.120771 0.126797 +1 0.119856 0.125882 +1 0.102024 0.108023 +1 0.119626 0.125622 +1 0.104521 0.110516 +1 0.0915391 0.0974011 +1 0.114983 0.12084 +1 0.110716 0.11656 +1 0.106244 0.112004 +1 0.107854 0.1136 +1 0.0903226 0.0960447 +1 0.120372 0.126087 +1 0.10324 0.108948 +1 0.122694 0.128337 +1 0.1117 0.117306 +1 0.119211 0.124804 +1 0.110743 0.116312 +1 0.117496 0.123039 +1 0.113227 0.118763 +1 0.108715 0.114232 +1 0.107506 0.113022 +1 0.116576 0.122077 +1 0.112014 0.11751 +1 0.121067 0.126503 +1 0.10271 0.10807 +1 0.117238 0.122588 +1 0.112664 0.117961 +1 0.110963 0.116251 +1 0.121302 0.126577 +1 0.112077 0.117336 +1 0.095596 0.100812 +1 0.111411 0.116605 +1 0.0902511 0.0954238 +1 0.114381 0.119466 +1 0.0998193 0.104886 +1 0.0918736 0.0969192 +1 0.0884121 0.0934282 +1 0.110972 0.115973 +1 0.108334 0.113302 +1 0.102994 0.107957 +1 0.122498 0.127409 +1 0.113511 0.118395 +1 0.0906824 0.0955612 +1 0.0908176 0.0956598 +1 0.104894 0.109707 +1 0.116777 0.12158 +1 0.108034 0.112829 +1 0.119415 0.12418 +1 0.119605 0.124356 +1 0.11511 0.119826 +1 0.10408 0.108782 +1 0.0893248 0.0940033 +1 0.109139 0.113811 +1 0.0869492 0.0916174 +1 0.11488 0.119522 +1 0.108902 0.113507 +1 0.102023 0.106573 +1 0.106527 0.111071 +1 0.1117 0.116244 +1 0.108254 0.11277 +1 0.111407 0.115914 +1 0.0906087 0.0950758 +1 0.106504 0.11095 +1 0.123911 0.128263 +1 0.10015 0.10448 +1 0.100373 0.104665 +1 0.104751 0.109037 +1 0.114767 0.119022 +1 0.11427 0.118524 +1 0.0873467 0.091541 +1 0.120737 0.124923 +1 0.101735 0.105869 +1 0.117308 0.121437 +1 0.0949366 0.0990612 +1 0.110445 0.114566 +1 0.111496 0.115581 +1 0.107981 0.112018 +1 0.0836944 0.0877279 +1 0.0869282 0.0909341 +1 0.126548 0.13054 +1 0.119075 0.123055 +1 0.116128 0.120086 +1 0.101842 0.10579 +1 0.113183 0.117117 +1 0.118439 0.122358 +1 0.103742 0.107651 +1 0.115295 0.119183 +1 0.103151 0.107026 +1 0.102092 0.105948 +1 0.108527 0.112373 +1 0.0988934 0.102714 +1 0.105175 0.108975 +1 0.0900176 0.0937998 +1 0.124104 0.127877 +1 0.108098 0.111867 +1 0.0927389 0.0964599 +1 0.0950363 0.09874 +1 0.103675 0.107361 +1 0.106655 0.110301 +1 0.109679 0.113325 +1 0.115272 0.118888 +1 0.115989 0.119557 +1 0.121905 0.125397 +1 0.10312 0.106565 +1 0.108113 0.111554 +1 0.121869 0.125284 +1 0.102783 0.106188 +1 0.103888 0.107291 +1 0.115296 0.118678 +1 0.10563 0.108996 +1 0.106472 0.109814 +1 0.11275 0.116076 +1 0.0845606 0.0878851 +1 0.119448 0.122766 +1 0.104633 0.107941 +1 0.109935 0.113234 +1 0.112474 0.115747 +1 0.091723 0.0949822 +1 0.0844931 0.0877142 +1 0.103435 0.106632 +1 0.0991778 0.102339 +1 0.0920068 0.0951646 +1 0.112581 0.115727 +1 0.100722 0.10379 +1 0.0926894 0.0957161 +1 0.0988585 0.101883 +1 0.112133 0.115093 +1 0.100392 0.103342 +1 0.121192 0.124101 +1 0.127297 0.130205 +1 0.124283 0.127125 +1 0.118629 0.121461 +1 0.120033 0.122863 +1 0.106227 0.109042 +1 0.0877192 0.0905291 +1 0.121117 0.123921 +1 0.1073 0.110085 +1 0.102226 0.104966 +1 0.0913487 0.094036 +1 0.121988 0.124653 +1 0.111379 0.114023 +1 0.118327 0.120956 +1 0.127402 0.129993 +1 0.0865545 0.0891376 +1 0.109444 0.112021 +1 0.116611 0.119173 +1 0.0898924 0.092445 +1 0.104545 0.107074 +1 0.106897 0.109384 +1 0.121135 0.123621 +1 0.108985 0.111453 +1 0.118284 0.120727 +1 0.106249 0.108667 +1 0.12219 0.1246 +1 0.122067 0.124462 +1 0.124465 0.126835 +1 0.112932 0.1153 +1 0.11878 0.121147 +1 0.118673 0.121016 +1 0.125604 0.127906 +1 0.102935 0.105231 +1 0.095249 0.0975133 +1 0.120558 0.122822 +1 0.0989733 0.101209 +1 0.107301 0.10953 +1 0.0928034 0.0950099 +1 0.114216 0.11637 +1 0.118923 0.121075 +1 0.0865676 0.0887081 +1 0.111848 0.113959 +1 0.104268 0.106377 +1 0.120826 0.1229 +1 0.105936 0.108007 +1 0.118976 0.121027 +1 0.110054 0.112099 +1 0.123635 0.125677 +1 0.112406 0.114439 +1 0.11012 0.112134 +1 0.0884612 0.0904603 +1 0.111737 0.113728 +1 0.113357 0.115347 +1 0.108096 0.110081 +1 0.108259 0.110219 +1 0.128584 0.130535 +1 0.10709 0.109027 +1 0.100268 0.102179 +1 0.122237 0.124142 +1 0.100079 0.101982 +1 0.0967714 0.0986662 +1 0.113603 0.115487 +1 0.0912266 0.0930879 +1 0.117149 0.119006 +1 0.110169 0.112011 +1 0.109301 0.111132 +1 0.118604 0.120405 +1 0.117961 0.11976 +1 0.104397 0.106158 +1 0.118609 0.120336 +1 0.0832201 0.0849465 +1 0.0797153 0.0814197 +1 0.0990505 0.100753 +1 0.10596 0.107658 +1 0.0998188 0.101476 +1 0.105913 0.10757 +1 0.113531 0.115182 +1 0.0967926 0.098443 +1 0.0940843 0.0957039 +1 0.114661 0.116274 +1 0.087046 0.0886275 +1 0.0916777 0.0932535 +1 0.123024 0.124591 +1 0.0875995 0.089149 +1 0.110778 0.112327 +1 0.116115 0.117637 +1 0.128015 0.129522 +1 0.11174 0.113234 +1 0.0897331 0.0912275 +1 0.0941751 0.0956475 +1 0.108018 0.109483 +1 0.0974017 0.0988631 +1 0.0933664 0.0947723 +1 0.111466 0.11286 +1 0.11841 0.11978 +1 0.114989 0.116311 +1 0.120067 0.121385 +1 0.113528 0.114839 +1 0.104843 0.106117 +1 0.111298 0.112507 +1 0.0987946 0.100003 +1 0.116609 0.117793 +1 0.0907966 0.0919788 +1 0.116691 0.117873 +1 0.105971 0.107138 +1 0.108219 0.109383 +1 0.107818 0.108969 +1 0.110756 0.111896 +1 0.107855 0.108977 +1 0.111159 0.112271 +1 0.106634 0.107745 +1 0.104271 0.105379 +1 0.114413 0.115445 +1 0.114315 0.115337 +1 0.0967034 0.0977021 +1 0.113498 0.114496 +1 0.105644 0.106638 +1 0.123591 0.124579 +1 0.108805 0.109775 +1 0.108044 0.109001 +1 0.123861 0.124794 +1 0.110087 0.111007 +1 0.0955589 0.0964736 +1 0.102733 0.103612 +1 0.104046 0.104922 +1 0.0924699 0.0933413 +1 0.115285 0.116112 +1 0.0954201 0.09623 +1 0.0855219 0.0863159 +1 0.0967526 0.0975336 +1 0.105675 0.106446 +1 0.0900959 0.0908643 +1 0.105807 0.10657 +1 0.118205 0.118962 +1 0.117617 0.118373 +1 0.114137 0.114887 +1 0.114842 0.115581 +1 0.10114 0.101879 +1 0.103445 0.104161 +1 0.0991235 0.0998339 +1 0.0972796 0.0979348 +1 0.102682 0.103332 +1 0.0938035 0.0944286 +1 0.111262 0.11188 +1 0.111618 0.112153 +1 0.0997941 0.100297 +1 0.120843 0.121314 +1 0.114265 0.114734 +1 0.10137 0.101832 +1 0.108491 0.108953 +1 0.0991029 0.099559 +1 0.102937 0.10339 +1 0.118778 0.119221 +1 0.107189 0.107626 +1 0.101957 0.102357 +1 0.0924087 0.0928051 +1 0.101168 0.101555 +1 0.109878 0.110253 +1 0.101449 0.101791 +1 0.0965111 0.0968328 +1 0.0997832 0.100102 +1 0.116346 0.11663 +1 0.125517 0.125757 +1 0.125432 0.125671 +1 0.111594 0.111803 +1 0.10228 0.102465 +1 0.110192 0.110371 +1 0.0993469 0.0995118 +1 0.104171 0.104324 +1 0.0807541 0.0808958 +1 0.10346 0.103585 +1 0.127331 0.127396 +1 0.0945151 0.0945558 +1 0.104771 0.104801 +1 0.103878 0.103908 +1 0.11169 0.111695 diff --git a/src/cython/doc/_templates/layout.html b/src/cython/doc/_templates/layout.html index c9356116..797afb27 100644 --- a/src/cython/doc/_templates/layout.html +++ b/src/cython/doc/_templates/layout.html @@ -56,6 +56,12 @@

{%- endif %} {%- endblock %} +

GUDHI

+

File formats

+

GUDHI installation

+

Acknowledging the GUDHI library

+

Index

+

Examples

{%- if sidebars != None %} {#- new style sidebar: explicitly include/exclude templates #} {%- for sidebartemplate in sidebars %} @@ -64,13 +70,6 @@ {%- else %} {#- old style sidebars: using blocks -- should be deprecated #} {%- block sidebartoc %} -

GUDHI

-

File formats

-

GUDHI installation

-

Acknowledging the GUDHI library

-

Index

-

Examples

- {%- include "localtoc.html" %} {%- endblock %} {%- block sidebarrel %} diff --git a/src/cython/doc/alpha_complex_ref.rst b/src/cython/doc/alpha_complex_ref.rst index 6a122b09..7da79543 100644 --- a/src/cython/doc/alpha_complex_ref.rst +++ b/src/cython/doc/alpha_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ============================== Alpha complex reference manual ============================== diff --git a/src/cython/doc/alpha_complex_sum.inc b/src/cython/doc/alpha_complex_sum.inc new file mode 100644 index 00000000..1680a712 --- /dev/null +++ b/src/cython/doc/alpha_complex_sum.inc @@ -0,0 +1,22 @@ +================================================================= =================================== =================================== +:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +:Requires: CGAL :math:`\geq` 4.7.0 Eigen3 +================================================================= =================================== =================================== + ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| .. figure:: | Alpha_complex is a simplicial complex constructed from the finite | +| ../../doc/Alpha_complex/alpha_complex_representation.png | cells of a Delaunay Triangulation. | +| :alt: Alpha complex representation | | +| :figclass: align-center | The filtration value of each simplex is computed as the square of the | +| | circumradius of the simplex if the circumsphere is empty (the simplex | +| Alpha complex representation | is then said to be Gabriel), and as the minimum of the filtration | +| | values of the codimension 1 cofaces that make it not Gabriel | +| | otherwise. All simplices that have a filtration value strictly | +| | greater than a given alpha squared value are not inserted into the | +| | complex. | +| | | +| | This package requires having CGAL version 4.7 or higher (4.8.1 is | +| | advised for better performance). | ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| :doc:`alpha_complex_user` | :doc:`alpha_complex_ref` | ++----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/alpha_complex_sum.rst b/src/cython/doc/alpha_complex_sum.rst deleted file mode 100644 index 1680a712..00000000 --- a/src/cython/doc/alpha_complex_sum.rst +++ /dev/null @@ -1,22 +0,0 @@ -================================================================= =================================== =================================== -:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -:Requires: CGAL :math:`\geq` 4.7.0 Eigen3 -================================================================= =================================== =================================== - -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| .. figure:: | Alpha_complex is a simplicial complex constructed from the finite | -| ../../doc/Alpha_complex/alpha_complex_representation.png | cells of a Delaunay Triangulation. | -| :alt: Alpha complex representation | | -| :figclass: align-center | The filtration value of each simplex is computed as the square of the | -| | circumradius of the simplex if the circumsphere is empty (the simplex | -| Alpha complex representation | is then said to be Gabriel), and as the minimum of the filtration | -| | values of the codimension 1 cofaces that make it not Gabriel | -| | otherwise. All simplices that have a filtration value strictly | -| | greater than a given alpha squared value are not inserted into the | -| | complex. | -| | | -| | This package requires having CGAL version 4.7 or higher (4.8.1 is | -| | advised for better performance). | -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| :doc:`alpha_complex_user` | :doc:`alpha_complex_ref` | -+----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/alpha_complex_user.rst b/src/cython/doc/alpha_complex_user.rst index db7edd6f..d1e9c7cd 100644 --- a/src/cython/doc/alpha_complex_user.rst +++ b/src/cython/doc/alpha_complex_user.rst @@ -1,11 +1,15 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Alpha complex user manual ========================= Definition ---------- -.. include:: alpha_complex_sum.rst +.. include:: alpha_complex_sum.inc -Alpha_complex is constructing a :doc:`Simplex_tree ` using +Alpha_complex is constructing a :doc:`Simplex_tree ` using `Delaunay Triangulation `_ :cite:`cgal:hdj-t-15b` from `CGAL `_ (the Computational Geometry Algorithms Library :cite:`cgal:eb-15b`). @@ -99,9 +103,9 @@ Filtration value computation algorithm **end for** **end for** **end for** - + make_filtration_non_decreasing() - + prune_above_filtration() Dimension 2 diff --git a/src/cython/doc/bottleneck_distance_sum.inc b/src/cython/doc/bottleneck_distance_sum.inc new file mode 100644 index 00000000..030fad9e --- /dev/null +++ b/src/cython/doc/bottleneck_distance_sum.inc @@ -0,0 +1,15 @@ +================================================================= =================================== =================================== +:Author: François Godi :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +:Requires: CGAL :math:`\geq` 4.8.0 +================================================================= =================================== =================================== + ++-----------------------------------------------------------------+----------------------------------------------------------------------+ +| .. figure:: | Bottleneck distance measures the similarity between two persistence | +| ../../doc/Bottleneck_distance/perturb_pd.png | diagrams. It's the shortest distance b for which there exists a | +| :figclass: align-center | perfect matching between the points of the two diagrams (+ all the | +| | diagonal points) such that any couple of matched points are at | +| Bottleneck distance is the length of | distance at most b. | +| the longest edge | | ++-----------------------------------------------------------------+----------------------------------------------------------------------+ +| :doc:`bottleneck_distance_user` | | ++-----------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/bottleneck_distance_sum.rst b/src/cython/doc/bottleneck_distance_sum.rst deleted file mode 100644 index 030fad9e..00000000 --- a/src/cython/doc/bottleneck_distance_sum.rst +++ /dev/null @@ -1,15 +0,0 @@ -================================================================= =================================== =================================== -:Author: François Godi :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -:Requires: CGAL :math:`\geq` 4.8.0 -================================================================= =================================== =================================== - -+-----------------------------------------------------------------+----------------------------------------------------------------------+ -| .. figure:: | Bottleneck distance measures the similarity between two persistence | -| ../../doc/Bottleneck_distance/perturb_pd.png | diagrams. It's the shortest distance b for which there exists a | -| :figclass: align-center | perfect matching between the points of the two diagrams (+ all the | -| | diagonal points) such that any couple of matched points are at | -| Bottleneck distance is the length of | distance at most b. | -| the longest edge | | -+-----------------------------------------------------------------+----------------------------------------------------------------------+ -| :doc:`bottleneck_distance_user` | | -+-----------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/bottleneck_distance_user.rst b/src/cython/doc/bottleneck_distance_user.rst index 7692dce2..605db022 100644 --- a/src/cython/doc/bottleneck_distance_user.rst +++ b/src/cython/doc/bottleneck_distance_user.rst @@ -1,9 +1,13 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Bottleneck distance user manual =============================== Definition ---------- -.. include:: bottleneck_distance_sum.rst +.. include:: bottleneck_distance_sum.inc Function -------- diff --git a/src/cython/doc/citation.rst b/src/cython/doc/citation.rst index f4fdf83b..117eb9dd 100644 --- a/src/cython/doc/citation.rst +++ b/src/cython/doc/citation.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Acknowledging the GUDHI library ############################### diff --git a/src/cython/doc/conf.py b/src/cython/doc/conf.py index a13c9751..4a54d4fd 100755 --- a/src/cython/doc/conf.py +++ b/src/cython/doc/conf.py @@ -85,7 +85,7 @@ version = gudhi.__version__ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +exclude_patterns = ['_build', '*.inc'] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -125,6 +125,7 @@ html_theme_options = { "sidebarbgcolor": "#A1ADCD", "sidebartextcolor": "black", "sidebarlinkcolor": "#334D5C", + "body_max_width": "1200px", } # Add any paths that contain custom themes here, relative to this directory. diff --git a/src/cython/doc/cubical_complex_ref.rst b/src/cython/doc/cubical_complex_ref.rst index 84aa4223..1fe9d5fb 100644 --- a/src/cython/doc/cubical_complex_ref.rst +++ b/src/cython/doc/cubical_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Cubical complex reference manual ################################ diff --git a/src/cython/doc/cubical_complex_sum.inc b/src/cython/doc/cubical_complex_sum.inc new file mode 100644 index 00000000..280ad0e0 --- /dev/null +++ b/src/cython/doc/cubical_complex_sum.inc @@ -0,0 +1,15 @@ +================================================================= =================================== =================================== +:Author: Pawel Dlotko :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +================================================================= =================================== =================================== + ++--------------------------------------------------------------------------+----------------------------------------------------------------------+ +| .. figure:: | The cubical complex is an example of a structured complex useful in | +| ../../doc/Bitmap_cubical_complex/Cubical_complex_representation.png | computational mathematics (specially rigorous numerics) and image | +| :alt: Cubical complex representation | analysis. | +| :figclass: align-center | | +| | | +| Cubical complex representation | | ++--------------------------------------------------------------------------+----------------------------------------------------------------------+ +| :doc:`cubical_complex_user` | * :doc:`cubical_complex_ref` | +| | * :doc:`periodic_cubical_complex_ref` | ++--------------------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/cubical_complex_sum.rst b/src/cython/doc/cubical_complex_sum.rst deleted file mode 100644 index 280ad0e0..00000000 --- a/src/cython/doc/cubical_complex_sum.rst +++ /dev/null @@ -1,15 +0,0 @@ -================================================================= =================================== =================================== -:Author: Pawel Dlotko :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -================================================================= =================================== =================================== - -+--------------------------------------------------------------------------+----------------------------------------------------------------------+ -| .. figure:: | The cubical complex is an example of a structured complex useful in | -| ../../doc/Bitmap_cubical_complex/Cubical_complex_representation.png | computational mathematics (specially rigorous numerics) and image | -| :alt: Cubical complex representation | analysis. | -| :figclass: align-center | | -| | | -| Cubical complex representation | | -+--------------------------------------------------------------------------+----------------------------------------------------------------------+ -| :doc:`cubical_complex_user` | * :doc:`cubical_complex_ref` | -| | * :doc:`periodic_cubical_complex_ref` | -+--------------------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/cubical_complex_user.rst b/src/cython/doc/cubical_complex_user.rst index dd82ad93..320bd79b 100644 --- a/src/cython/doc/cubical_complex_user.rst +++ b/src/cython/doc/cubical_complex_user.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Cubical complex user manual =========================== Definition @@ -144,6 +148,7 @@ the program output is: .. testoutput:: Periodic cubical complex is of dimension 2 - 42 simplices. + Examples. --------- diff --git a/src/cython/doc/euclidean_strong_witness_complex_ref.rst b/src/cython/doc/euclidean_strong_witness_complex_ref.rst index bebf0f9a..1a602cd5 100644 --- a/src/cython/doc/euclidean_strong_witness_complex_ref.rst +++ b/src/cython/doc/euclidean_strong_witness_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ================================================= Euclidean strong witness complex reference manual ================================================= diff --git a/src/cython/doc/euclidean_witness_complex_ref.rst b/src/cython/doc/euclidean_witness_complex_ref.rst index 29b8806f..28daf965 100644 --- a/src/cython/doc/euclidean_witness_complex_ref.rst +++ b/src/cython/doc/euclidean_witness_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ========================================== Euclidean witness complex reference manual ========================================== diff --git a/src/cython/doc/examples.rst b/src/cython/doc/examples.rst index 1e596e18..d42f5a92 100644 --- a/src/cython/doc/examples.rst +++ b/src/cython/doc/examples.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Examples ######## diff --git a/src/cython/doc/fileformats.rst b/src/cython/doc/fileformats.rst index 4f0b6f6d..ff20f26e 100644 --- a/src/cython/doc/fileformats.rst +++ b/src/cython/doc/fileformats.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + File formats ############ diff --git a/src/cython/doc/index.rst b/src/cython/doc/index.rst index 3945d72a..4e444fb0 100644 --- a/src/cython/doc/index.rst +++ b/src/cython/doc/index.rst @@ -34,32 +34,32 @@ Data structures Alpha complex ============= -.. include:: alpha_complex_sum.rst +.. include:: alpha_complex_sum.inc Cubical complex =============== -.. include:: cubical_complex_sum.rst +.. include:: cubical_complex_sum.inc Rips complex ============ -.. include:: rips_complex_sum.rst +.. include:: rips_complex_sum.inc Simplex tree ============ -.. include:: simplex_tree_sum.rst +.. include:: simplex_tree_sum.inc Tangential complex ================== -.. include:: tangential_complex_sum.rst +.. include:: tangential_complex_sum.inc Witness complex =============== -.. include:: witness_complex_sum.rst +.. include:: witness_complex_sum.inc Toolbox @@ -68,17 +68,17 @@ Toolbox Bottleneck distance =================== -.. include:: bottleneck_distance_sum.rst +.. include:: bottleneck_distance_sum.inc Persistence cohomology ====================== -.. include:: persistent_cohomology_sum.rst +.. include:: persistent_cohomology_sum.inc Persistence graphical tools =========================== -.. include:: persistence_graphical_tools_sum.rst +.. include:: persistence_graphical_tools_sum.inc Bibliography ************ diff --git a/src/cython/doc/installation.rst b/src/cython/doc/installation.rst index b0bc5f38..43ff85c5 100644 --- a/src/cython/doc/installation.rst +++ b/src/cython/doc/installation.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Installation ############ diff --git a/src/cython/doc/periodic_cubical_complex_ref.rst b/src/cython/doc/periodic_cubical_complex_ref.rst index c6190a1b..4b831647 100644 --- a/src/cython/doc/periodic_cubical_complex_ref.rst +++ b/src/cython/doc/periodic_cubical_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Periodic cubical complex reference manual ######################################### diff --git a/src/cython/doc/persistence_graphical_tools_ref.rst b/src/cython/doc/persistence_graphical_tools_ref.rst index a69c8ba2..a2c6bcef 100644 --- a/src/cython/doc/persistence_graphical_tools_ref.rst +++ b/src/cython/doc/persistence_graphical_tools_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ============================================ Persistence graphical tools reference manual ============================================ diff --git a/src/cython/doc/persistence_graphical_tools_sum.inc b/src/cython/doc/persistence_graphical_tools_sum.inc new file mode 100644 index 00000000..d602daa7 --- /dev/null +++ b/src/cython/doc/persistence_graphical_tools_sum.inc @@ -0,0 +1,12 @@ +================================================================= =================================== =================================== +:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +:Requires: Matplotlib Numpy +================================================================= =================================== =================================== + ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ +| .. figure:: | These graphical tools comes on top of persistence results and allows | +| img/graphical_tools_representation.png | the user to build easily barcode and persistence diagram. | +| | | ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ +| :doc:`persistence_graphical_tools_user` | :doc:`persistence_graphical_tools_ref` | ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ diff --git a/src/cython/doc/persistence_graphical_tools_sum.rst b/src/cython/doc/persistence_graphical_tools_sum.rst deleted file mode 100644 index d602daa7..00000000 --- a/src/cython/doc/persistence_graphical_tools_sum.rst +++ /dev/null @@ -1,12 +0,0 @@ -================================================================= =================================== =================================== -:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -:Requires: Matplotlib Numpy -================================================================= =================================== =================================== - -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ -| .. figure:: | These graphical tools comes on top of persistence results and allows | -| img/graphical_tools_representation.png | the user to build easily barcode and persistence diagram. | -| | | -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ -| :doc:`persistence_graphical_tools_user` | :doc:`persistence_graphical_tools_ref` | -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ diff --git a/src/cython/doc/persistence_graphical_tools_user.rst b/src/cython/doc/persistence_graphical_tools_user.rst index 46f871c7..292915eb 100644 --- a/src/cython/doc/persistence_graphical_tools_user.rst +++ b/src/cython/doc/persistence_graphical_tools_user.rst @@ -1,8 +1,12 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Persistence graphical tools user manual ======================================= Definition ---------- -.. include:: persistence_graphical_tools_sum.rst +.. include:: persistence_graphical_tools_sum.inc Show persistence as a barcode @@ -10,22 +14,13 @@ Show persistence as a barcode This function can display the persistence result as a barcode: -.. testcode:: - - import gudhi - - periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file=gudhi.__root_source_dir__ + \ - '/data/bitmap/3d_torus.txt') - diag = periodic_cc.persistence() - plt = gudhi.plot_persistence_barcode(diag) - plt.show() - .. plot:: + :include-source: import gudhi - periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file=gudhi.__root_source_dir__ + \ - '/data/bitmap/3d_torus.txt') + perseus_file = gudhi.__root_source_dir__ + '/data/bitmap/3d_torus.txt' + periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file=perseus_file) diag = periodic_cc.persistence() print("diag = ", diag) plt = gudhi.plot_persistence_barcode(diag) @@ -36,24 +31,32 @@ Show persistence as a diagram This function can display the persistence result as a diagram: -.. testcode:: +.. plot:: + :include-source: import gudhi - - point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + '/data/points/tore3D_1307.off') - rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) - simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) - diag = simplex_tree.persistence() - plt = gudhi.plot_persistence_diagram(diag) + + # rips_on_tore3D_1307.pers obtained from write_persistence_diagram method + persistence_file=gudhi.__root_source_dir__ + \ + '/data/persistence_diagram/rips_on_tore3D_1307.pers' + plt = gudhi.plot_persistence_diagram(persistence_file=persistence_file, + legend=True) plt.show() +If you want more information on a specific dimension, for instance: + .. plot:: + :include-source: import gudhi - point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + '/data/points/tore3D_1307.off') - rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) - simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) - diag = simplex_tree.persistence() - plt = gudhi.plot_persistence_diagram(diag) + persistence_file=gudhi.__root_source_dir__ + \ + '/data/persistence_diagram/rips_on_tore3D_1307.pers' + diag = \ + gudhi.read_persistence_intervals_grouped_by_dimension(persistence_file=\ + persistence_file) + dim = 1 + # Display all points with some transparency + plt = gudhi.plot_persistence_diagram([(dim,interval) for interval in diag[dim]], + max_plots=0, alpha=0.1) plt.show() diff --git a/src/cython/doc/persistent_cohomology_sum.inc b/src/cython/doc/persistent_cohomology_sum.inc new file mode 100644 index 00000000..a26df1dc --- /dev/null +++ b/src/cython/doc/persistent_cohomology_sum.inc @@ -0,0 +1,27 @@ +================================================================= =================================== =================================== +:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +================================================================= =================================== =================================== + ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ +| .. figure:: | The theory of homology consists in attaching to a topological space | +| ../../doc/Persistent_cohomology/3DTorus_poch.png | a sequence of (homology) groups, capturing global topological | +| :figclass: align-center | features like connected components, holes, cavities, etc. Persistent | +| | homology studies the evolution -- birth, life and death -- of these | +| Rips Persistent Cohomology on a 3D | features when the topological space is changing. Consequently, the | +| Torus | theory is essentially composed of three elements: topological spaces, | +| | their homology groups and an evolution scheme. | +| | | +| | Computation of persistent cohomology using the algorithm of | +| | :cite:`DBLP:journals/dcg/SilvaMV11` and | +| | :cite:`DBLP:journals/corr/abs-1208-5018` and the Compressed | +| | Annotation Matrix implementation of | +| | :cite:`DBLP:conf/esa/BoissonnatDM13`. | +| | | ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ +| :doc:`persistent_cohomology_user` | Please refer to each data structure that contains persistence | +| | feature for reference: | +| | | +| | * :doc:`simplex_tree_ref` | +| | * :doc:`cubical_complex_ref` | +| | * :doc:`periodic_cubical_complex_ref` | ++-----------------------------------------------------------------+-----------------------------------------------------------------------+ diff --git a/src/cython/doc/persistent_cohomology_sum.rst b/src/cython/doc/persistent_cohomology_sum.rst deleted file mode 100644 index a26df1dc..00000000 --- a/src/cython/doc/persistent_cohomology_sum.rst +++ /dev/null @@ -1,27 +0,0 @@ -================================================================= =================================== =================================== -:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -================================================================= =================================== =================================== - -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ -| .. figure:: | The theory of homology consists in attaching to a topological space | -| ../../doc/Persistent_cohomology/3DTorus_poch.png | a sequence of (homology) groups, capturing global topological | -| :figclass: align-center | features like connected components, holes, cavities, etc. Persistent | -| | homology studies the evolution -- birth, life and death -- of these | -| Rips Persistent Cohomology on a 3D | features when the topological space is changing. Consequently, the | -| Torus | theory is essentially composed of three elements: topological spaces, | -| | their homology groups and an evolution scheme. | -| | | -| | Computation of persistent cohomology using the algorithm of | -| | :cite:`DBLP:journals/dcg/SilvaMV11` and | -| | :cite:`DBLP:journals/corr/abs-1208-5018` and the Compressed | -| | Annotation Matrix implementation of | -| | :cite:`DBLP:conf/esa/BoissonnatDM13`. | -| | | -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ -| :doc:`persistent_cohomology_user` | Please refer to each data structure that contains persistence | -| | feature for reference: | -| | | -| | * :doc:`simplex_tree_ref` | -| | * :doc:`cubical_complex_ref` | -| | * :doc:`periodic_cubical_complex_ref` | -+-----------------------------------------------------------------+-----------------------------------------------------------------------+ diff --git a/src/cython/doc/persistent_cohomology_user.rst b/src/cython/doc/persistent_cohomology_user.rst index bf90c163..ce7fc685 100644 --- a/src/cython/doc/persistent_cohomology_user.rst +++ b/src/cython/doc/persistent_cohomology_user.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Persistent cohomology user manual ================================= Definition diff --git a/src/cython/doc/pyplots/barcode_persistence.py b/src/cython/doc/pyplots/barcode_persistence.py deleted file mode 100755 index de33d506..00000000 --- a/src/cython/doc/pyplots/barcode_persistence.py +++ /dev/null @@ -1,7 +0,0 @@ -import gudhi - -periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file=gudhi.__root_source_dir__ + \ - '/data/bitmap/3d_torus.txt') -diag = periodic_cc.persistence() -plt = gudhi.plot_persistence_barcode(diag) -plt.show() diff --git a/src/cython/doc/pyplots/diagram_persistence.py b/src/cython/doc/pyplots/diagram_persistence.py deleted file mode 100755 index 3bab0ca1..00000000 --- a/src/cython/doc/pyplots/diagram_persistence.py +++ /dev/null @@ -1,9 +0,0 @@ -import gudhi - -point_cloud = gudhi.read_off(off_file=gudhi.__root_source_dir__ + \ - '/data/points/tore3D_1307.off') -rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=0.3) -simplex_tree = rips_complex.create_simplex_tree(max_dimension=3) -diag = simplex_tree.persistence() -plt = gudhi.plot_persistence_diagram(diag) -plt.show() diff --git a/src/cython/doc/reader_utils_ref.rst b/src/cython/doc/reader_utils_ref.rst index 9c1ea6fc..f3ecebad 100644 --- a/src/cython/doc/reader_utils_ref.rst +++ b/src/cython/doc/reader_utils_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ============================= Reader utils reference manual ============================= diff --git a/src/cython/doc/rips_complex_ref.rst b/src/cython/doc/rips_complex_ref.rst index b17dc4e0..22b5616c 100644 --- a/src/cython/doc/rips_complex_ref.rst +++ b/src/cython/doc/rips_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ============================= Rips complex reference manual ============================= diff --git a/src/cython/doc/rips_complex_sum.inc b/src/cython/doc/rips_complex_sum.inc new file mode 100644 index 00000000..5616bfa9 --- /dev/null +++ b/src/cython/doc/rips_complex_sum.inc @@ -0,0 +1,17 @@ +================================================================= =================================== =================================== +:Author: Clément Maria, Pawel Dlotko, Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +================================================================= =================================== =================================== + ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| .. figure:: | Rips complex is a simplicial complex constructed from a one skeleton | +| ../../doc/Rips_complex/rips_complex_representation.png | graph. | +| :figclass: align-center | | +| | The filtration value of each edge is computed from a user-given | +| Rips complex representation | distance function and is inserted until a user-given threshold | +| | value. | +| | | +| | This complex can be built from a point cloud and a distance function, | +| | or from a distance matrix. | ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| :doc:`rips_complex_user` | :doc:`rips_complex_ref` | ++----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/rips_complex_sum.rst b/src/cython/doc/rips_complex_sum.rst deleted file mode 100644 index 5616bfa9..00000000 --- a/src/cython/doc/rips_complex_sum.rst +++ /dev/null @@ -1,17 +0,0 @@ -================================================================= =================================== =================================== -:Author: Clément Maria, Pawel Dlotko, Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -================================================================= =================================== =================================== - -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| .. figure:: | Rips complex is a simplicial complex constructed from a one skeleton | -| ../../doc/Rips_complex/rips_complex_representation.png | graph. | -| :figclass: align-center | | -| | The filtration value of each edge is computed from a user-given | -| Rips complex representation | distance function and is inserted until a user-given threshold | -| | value. | -| | | -| | This complex can be built from a point cloud and a distance function, | -| | or from a distance matrix. | -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| :doc:`rips_complex_user` | :doc:`rips_complex_ref` | -+----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/rips_complex_user.rst b/src/cython/doc/rips_complex_user.rst index 7738aef0..a8c06cf9 100644 --- a/src/cython/doc/rips_complex_user.rst +++ b/src/cython/doc/rips_complex_user.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Rips complex user manual ========================= Definition @@ -243,7 +247,7 @@ the program output is: [3, 6] -> 11.00 Correlation matrix ---------------- +------------------ Example from a correlation matrix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/cython/doc/simplex_tree_ref.rst b/src/cython/doc/simplex_tree_ref.rst index 6d196843..9eb8c199 100644 --- a/src/cython/doc/simplex_tree_ref.rst +++ b/src/cython/doc/simplex_tree_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ============================= Simplex tree reference manual ============================= diff --git a/src/cython/doc/simplex_tree_sum.inc b/src/cython/doc/simplex_tree_sum.inc new file mode 100644 index 00000000..fb0e54c1 --- /dev/null +++ b/src/cython/doc/simplex_tree_sum.inc @@ -0,0 +1,14 @@ +================================================================= =================================== =================================== +:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +================================================================= =================================== =================================== + ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| .. figure:: | The simplex tree is an efficient and flexible data structure for | +| ../../doc/Simplex_tree/Simplex_tree_representation.png | representing general (filtered) simplicial complexes. | +| :alt: Simplex tree representation | | +| :figclass: align-center | The data structure is described in | +| | :cite:`boissonnatmariasimplextreealgorithmica` | +| Simplex tree representation | | ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| :doc:`simplex_tree_user` | :doc:`simplex_tree_ref` | ++----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/simplex_tree_sum.rst b/src/cython/doc/simplex_tree_sum.rst deleted file mode 100644 index fb0e54c1..00000000 --- a/src/cython/doc/simplex_tree_sum.rst +++ /dev/null @@ -1,14 +0,0 @@ -================================================================= =================================== =================================== -:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -================================================================= =================================== =================================== - -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| .. figure:: | The simplex tree is an efficient and flexible data structure for | -| ../../doc/Simplex_tree/Simplex_tree_representation.png | representing general (filtered) simplicial complexes. | -| :alt: Simplex tree representation | | -| :figclass: align-center | The data structure is described in | -| | :cite:`boissonnatmariasimplextreealgorithmica` | -| Simplex tree representation | | -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| :doc:`simplex_tree_user` | :doc:`simplex_tree_ref` | -+----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/simplex_tree_user.rst b/src/cython/doc/simplex_tree_user.rst index 4b1dde19..aebeb29f 100644 --- a/src/cython/doc/simplex_tree_user.rst +++ b/src/cython/doc/simplex_tree_user.rst @@ -1,9 +1,13 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Simplex tree user manual ======================== Definition ---------- -.. include:: simplex_tree_sum.rst +.. include:: simplex_tree_sum.inc A simplicial complex :math:`\mathbf{K}` on a set of vertices :math:`V = \{1, \cdots ,|V|\}` is a collection of simplices :math:`\{\sigma\}`, :math:`\sigma \subseteq V` such that diff --git a/src/cython/doc/strong_witness_complex_ref.rst b/src/cython/doc/strong_witness_complex_ref.rst index 4ed4fe46..d624d711 100644 --- a/src/cython/doc/strong_witness_complex_ref.rst +++ b/src/cython/doc/strong_witness_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ======================================= Strong witness complex reference manual ======================================= diff --git a/src/cython/doc/tangential_complex_ref.rst b/src/cython/doc/tangential_complex_ref.rst index 35589475..cdfda082 100644 --- a/src/cython/doc/tangential_complex_ref.rst +++ b/src/cython/doc/tangential_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + =================================== Tangential complex reference manual =================================== diff --git a/src/cython/doc/tangential_complex_sum.inc b/src/cython/doc/tangential_complex_sum.inc new file mode 100644 index 00000000..72b4d7ba --- /dev/null +++ b/src/cython/doc/tangential_complex_sum.inc @@ -0,0 +1,15 @@ +================================================================= =================================== =================================== +:Author: Clément Jamin :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +:Requires: CGAL :math:`\geq` 4.8.0 Eigen3 +================================================================= =================================== =================================== + ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| .. figure:: | A Tangential Delaunay complex is a simplicial complex designed to | +| ../../doc/Tangential_complex/tc_examples.png | reconstruct a :math:`k`-dimensional manifold embedded in :math:`d`- | +| :figclass: align-center | dimensional Euclidean space. The input is a point sample coming from | +| | an unknown manifold. The running time depends only linearly on the | +| Tangential complex representation | extrinsic dimension :math:`d` and exponentially on the intrinsic | +| | dimension :math:`k`. | ++----------------------------------------------------------------+------------------------------------------------------------------------+ +| :doc:`tangential_complex_user` | :doc:`tangential_complex_ref` | ++----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/tangential_complex_sum.rst b/src/cython/doc/tangential_complex_sum.rst deleted file mode 100644 index 72b4d7ba..00000000 --- a/src/cython/doc/tangential_complex_sum.rst +++ /dev/null @@ -1,15 +0,0 @@ -================================================================= =================================== =================================== -:Author: Clément Jamin :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -:Requires: CGAL :math:`\geq` 4.8.0 Eigen3 -================================================================= =================================== =================================== - -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| .. figure:: | A Tangential Delaunay complex is a simplicial complex designed to | -| ../../doc/Tangential_complex/tc_examples.png | reconstruct a :math:`k`-dimensional manifold embedded in :math:`d`- | -| :figclass: align-center | dimensional Euclidean space. The input is a point sample coming from | -| | an unknown manifold. The running time depends only linearly on the | -| Tangential complex representation | extrinsic dimension :math:`d` and exponentially on the intrinsic | -| | dimension :math:`k`. | -+----------------------------------------------------------------+------------------------------------------------------------------------+ -| :doc:`tangential_complex_user` | :doc:`tangential_complex_ref` | -+----------------------------------------------------------------+------------------------------------------------------------------------+ diff --git a/src/cython/doc/tangential_complex_user.rst b/src/cython/doc/tangential_complex_user.rst index fafb3193..5ce69e86 100644 --- a/src/cython/doc/tangential_complex_user.rst +++ b/src/cython/doc/tangential_complex_user.rst @@ -1,6 +1,10 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Tangential complex user manual ============================== -.. include:: tangential_complex_sum.rst +.. include:: tangential_complex_sum.inc Definition ---------- diff --git a/src/cython/doc/todos.rst b/src/cython/doc/todos.rst index 78972a4c..ca274ced 100644 --- a/src/cython/doc/todos.rst +++ b/src/cython/doc/todos.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ========== To be done ========== diff --git a/src/cython/doc/witness_complex_ref.rst b/src/cython/doc/witness_complex_ref.rst index c78760cb..9987d3fd 100644 --- a/src/cython/doc/witness_complex_ref.rst +++ b/src/cython/doc/witness_complex_ref.rst @@ -1,3 +1,7 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + ================================ Witness complex reference manual ================================ diff --git a/src/cython/doc/witness_complex_sum.inc b/src/cython/doc/witness_complex_sum.inc new file mode 100644 index 00000000..a8a126a0 --- /dev/null +++ b/src/cython/doc/witness_complex_sum.inc @@ -0,0 +1,19 @@ +================================================================= =================================== =================================== +:Author: Siargey Kachanovich :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 +:Euclidean version requires: CGAL :math:`\geq` 4.6.0 Eigen3 +================================================================= =================================== =================================== + ++-------------------------------------------------------------------+----------------------------------------------------------------------+ +| .. figure:: | Witness complex :math:`Wit(W,L)` is a simplicial complex defined on | +| ../../doc/Witness_complex/Witness_complex_representation.png | two sets of points in :math:`\mathbb{R}^D`. | +| :alt: Witness complex representation | | +| :figclass: align-center | The data structure is described in | +| | :cite:`boissonnatmariasimplextreealgorithmica`. | +| | | +| Witness complex representation | | ++-------------------------------------------------------------------+----------------------------------------------------------------------+ +| :doc:`witness_complex_user` | * :doc:`witness_complex_ref` | +| | * :doc:`strong_witness_complex_ref` | +| | * :doc:`euclidean_witness_complex_ref` | +| | * :doc:`euclidean_strong_witness_complex_ref` | ++-------------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/witness_complex_sum.rst b/src/cython/doc/witness_complex_sum.rst deleted file mode 100644 index a8a126a0..00000000 --- a/src/cython/doc/witness_complex_sum.rst +++ /dev/null @@ -1,19 +0,0 @@ -================================================================= =================================== =================================== -:Author: Siargey Kachanovich :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3 -:Euclidean version requires: CGAL :math:`\geq` 4.6.0 Eigen3 -================================================================= =================================== =================================== - -+-------------------------------------------------------------------+----------------------------------------------------------------------+ -| .. figure:: | Witness complex :math:`Wit(W,L)` is a simplicial complex defined on | -| ../../doc/Witness_complex/Witness_complex_representation.png | two sets of points in :math:`\mathbb{R}^D`. | -| :alt: Witness complex representation | | -| :figclass: align-center | The data structure is described in | -| | :cite:`boissonnatmariasimplextreealgorithmica`. | -| | | -| Witness complex representation | | -+-------------------------------------------------------------------+----------------------------------------------------------------------+ -| :doc:`witness_complex_user` | * :doc:`witness_complex_ref` | -| | * :doc:`strong_witness_complex_ref` | -| | * :doc:`euclidean_witness_complex_ref` | -| | * :doc:`euclidean_strong_witness_complex_ref` | -+-------------------------------------------------------------------+----------------------------------------------------------------------+ diff --git a/src/cython/doc/witness_complex_user.rst b/src/cython/doc/witness_complex_user.rst index 99be5185..40e94134 100644 --- a/src/cython/doc/witness_complex_user.rst +++ b/src/cython/doc/witness_complex_user.rst @@ -1,7 +1,11 @@ +:orphan: + +.. To get rid of WARNING: document isn't included in any toctree + Witness complex user manual =========================== -.. include:: witness_complex_sum.rst +.. include:: witness_complex_sum.inc Definitions ----------- diff --git a/src/cython/setup.py.in b/src/cython/setup.py.in index a798717d..ee381a1b 100644 --- a/src/cython/setup.py.in +++ b/src/cython/setup.py.in @@ -46,8 +46,6 @@ setup( version='@GUDHI_VERSION@', url='http://gudhi.gforge.inria.fr/', ext_modules = cythonize(gudhi), - - #install_requires = required, install_requires = [ "matplotlib", "numpy", -- cgit v1.2.3 From 655b7a42078a350c3827cb68beb86a25ac5929ab Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 6 Jun 2018 10:56:52 +0000 Subject: Doc review : warn about cubical betti numbers function and remove simplicial references for cubical git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/python_2.1.0_fix_vincent@3546 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 41399f9e8aec2ab914368822cd288b1a08839085 --- src/cython/cython/cubical_complex.pyx | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cython/cython/cubical_complex.pyx b/src/cython/cython/cubical_complex.pyx index a98a3ec3..de6cd396 100644 --- a/src/cython/cython/cubical_complex.pyx +++ b/src/cython/cython/cubical_complex.pyx @@ -104,22 +104,22 @@ cdef class CubicalComplex: return self.pcohptr != NULL def num_simplices(self): - """This function returns the number of simplices of the simplicial + """This function returns the number of all cubes in the complex. complex. - :returns: int -- the simplicial complex number of simplices. + :returns: int -- the number of all cubes in the complex. """ return self.thisptr.num_simplices() def dimension(self): - """This function returns the dimension of the simplicial complex. + """This function returns the dimension of the complex. - :returns: int -- the simplicial complex dimension. + :returns: int -- the complex dimension. """ return self.thisptr.dimension() def persistence(self, homology_coeff_field=11, min_persistence=0): - """This function returns the persistence of the simplicial complex. + """This function returns the persistence of the complex. :param homology_coeff_field: The homology coefficient field. Must be a prime number @@ -130,7 +130,7 @@ cdef class CubicalComplex: Sets min_persistence to -1.0 to see all values. :type min_persistence: float. :returns: list of pairs(dimension, pair(birth, death)) -- the - persistence of the simplicial complex. + persistence of the complex. """ if self.pcohptr != NULL: del self.pcohptr @@ -142,12 +142,15 @@ cdef class CubicalComplex: return persistence_result def betti_numbers(self): - """This function returns the Betti numbers of the simplicial complex. + """This function returns the Betti numbers of the complex. :returns: list of int -- The Betti numbers ([B0, B1, ..., Bn]). :note: betti_numbers function requires persistence function to be launched first. + + :note: betti_numbers function always returns [1, 0, 0, ...] as infinity + filtration cubes are not removed from the complex. """ cdef vector[int] bn_result if self.pcohptr != NULL: @@ -155,8 +158,7 @@ cdef class CubicalComplex: return bn_result def persistent_betti_numbers(self, from_value, to_value): - """This function returns the persistent Betti numbers of the - simplicial complex. + """This function returns the persistent Betti numbers of the complex. :param from_value: The persistence birth limit to be added in the numbers (persistent birth <= from_value). @@ -177,8 +179,8 @@ cdef class CubicalComplex: return pbn_result def persistence_intervals_in_dimension(self, dimension): - """This function returns the persistence intervals of the simplicial - complex in a specific dimension. + """This function returns the persistence intervals of the complex in a + specific dimension. :param dimension: The specific dimension. :type from_value: int. -- cgit v1.2.3 From 155f5ac929374a666dd87df2e8b876569a2c3c43 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 6 Jun 2018 21:15:12 +0000 Subject: Merge tangential complex warning fix git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3551 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 252954186a69fa338f79f6e057845e8b5d8a9619 --- src/Tangential_complex/include/gudhi/Tangential_complex.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Tangential_complex/include/gudhi/Tangential_complex.h b/src/Tangential_complex/include/gudhi/Tangential_complex.h index d8356520..9d8fdcd3 100644 --- a/src/Tangential_complex/include/gudhi/Tangential_complex.h +++ b/src/Tangential_complex/include/gudhi/Tangential_complex.h @@ -1100,7 +1100,10 @@ class Tangential_complex { // of the sphere "star sphere" centered at "center_vertex" // and which contains all the // circumspheres of the star of "center_vertex" - boost::optional squared_star_sphere_radius_plus_margin; + boost::optional squared_star_sphere_radius_plus_margin = boost::make_optional(false, FT()); + // This is the strange way boost is recommending to get rid of "may be used uninitialized in this function". + // Former code was : + // boost::optional squared_star_sphere_radius_plus_margin; // Insert points until we find a point which is outside "star sphere" for (auto nn_it = ins_range.begin(); -- cgit v1.2.3 From 2fd6f14cbe1c949d5724ffe762ce27ab9ab95941 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 6 Jun 2018 21:33:27 +0000 Subject: Merge paralellized version of Nerve_GIC fix for CoordGIC from Nerve_GIC branch git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3552 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 384a6362a19da625b09879ad6eb7573c48a52940 --- src/Nerve_GIC/include/gudhi/GIC.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Nerve_GIC/include/gudhi/GIC.h b/src/Nerve_GIC/include/gudhi/GIC.h index aa6478e5..05c6a386 100644 --- a/src/Nerve_GIC/include/gudhi/GIC.h +++ b/src/Nerve_GIC/include/gudhi/GIC.h @@ -415,7 +415,6 @@ class Cover_complex { double set_graph_from_automatic_rips(Distance distance, int N = 100) { int m = floor(n / std::exp((1 + rate_power) * std::log(std::log(n) / std::log(rate_constant)))); m = std::min(m, n - 1); - std::vector samples(m); double delta = 0; if (verbose) std::cout << n << " points in R^" << data_dimension << std::endl; @@ -424,7 +423,9 @@ class Cover_complex { if (distances.size() == 0) compute_pairwise_distances(distance); #ifdef GUDHI_USE_TBB - tbb::parallel_for(0, N, [&](int i){ + tbb::mutex deltamutex; + tbb::parallel_for(0, N, [&](int i){ + std::vector samples(m); SampleWithoutReplacement(n, m, samples); double hausdorff_dist = 0; for (int j = 0; j < n; j++) { @@ -432,10 +433,13 @@ class Cover_complex { for (int k = 1; k < m; k++) mj = std::min(mj, distances[j][samples[k]]); hausdorff_dist = std::max(hausdorff_dist, mj); } + deltamutex.lock(); delta += hausdorff_dist / N; + deltamutex.unlock(); }); #else for (int i = 0; i < N; i++) { + std::vector samples(m); SampleWithoutReplacement(n, m, samples); double hausdorff_dist = 0; for (int j = 0; j < n; j++) { @@ -717,6 +721,7 @@ class Cover_complex { #ifdef GUDHI_USE_TBB if (verbose) std::cout << "Computing connected components (parallelized)..." << std::endl; + tbb::mutex covermutex, idmutex; tbb::parallel_for(0, res, [&](int i){ // Compute connected components Graph G = one_skeleton.create_subgraph(); @@ -735,16 +740,20 @@ class Cover_complex { int identifier = ((i + component[j])*(i + component[j]) + 3 * i + component[j]) / 2; // Update covers + covermutex.lock(); cover[preimages[i][j]].push_back(identifier); cover_back[identifier].push_back(preimages[i][j]); cover_fct[identifier] = i; cover_std[identifier] = funcstd[i]; cover_color[identifier].second += func_color[preimages[i][j]]; cover_color[identifier].first += 1; + covermutex.unlock(); } // Maximal dimension is total number of connected components + idmutex.lock(); id += max + 1; + idmutex.unlock(); }); #else if (verbose) std::cout << "Computing connected components..." << std::endl; -- cgit v1.2.3 From 027dac0358de7d07f772c32cbdf2306dfeae714b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 6 Jun 2018 22:00:46 +0000 Subject: Merge of branch thread_local_optional_vincent to take into account XCode < v.8 as thread local is not available git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3554 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 9dcf072a4606d1131a925bca4571f0f1b5547d14 --- src/Nerve_GIC/include/gudhi/GIC.h | 10 +++-- src/Simplex_tree/include/gudhi/Simplex_tree.h | 6 ++- src/cmake/modules/GUDHI_compilation_flags.cmake | 49 ++++++++++++++++++++++--- src/cython/CMakeLists.txt | 27 +------------- 4 files changed, 56 insertions(+), 36 deletions(-) diff --git a/src/Nerve_GIC/include/gudhi/GIC.h b/src/Nerve_GIC/include/gudhi/GIC.h index 05c6a386..ebe463dd 100644 --- a/src/Nerve_GIC/include/gudhi/GIC.h +++ b/src/Nerve_GIC/include/gudhi/GIC.h @@ -142,6 +142,9 @@ class Cover_complex { std::string point_cloud_name; std::string color_name; + // 2 threads using 2 different GIC will have their own random engine + std::default_random_engine re; + // Remove all edges of a graph. void remove_edges(Graph& G) { boost::graph_traits::edge_iterator ei, ei_end; @@ -150,8 +153,7 @@ class Cover_complex { // Find random number in [0,1]. double GetUniform() { - thread_local std::default_random_engine re; - thread_local std::uniform_real_distribution Dist(0, 1); + std::uniform_real_distribution Dist(0, 1); return Dist(re); } @@ -422,7 +424,9 @@ class Cover_complex { if (distances.size() == 0) compute_pairwise_distances(distance); - #ifdef GUDHI_USE_TBB + // This cannot be parallelized if thread_local is not defined + // thread_local is not defined for XCode < v.8 + #if defined(GUDHI_USE_TBB) && defined(GUDHI_CAN_USE_CXX11_THREAD_LOCAL) tbb::mutex deltamutex; tbb::parallel_for(0, N, [&](int i){ std::vector samples(m); diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 74a7281d..ee96d5a2 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -689,7 +689,11 @@ class Simplex_tree { return { null_simplex(), true }; // ----->> // Copy before sorting - thread_local std::vector copy; + // Thread local is not available on XCode version < V.8 - It will slow down computation +#ifdef GUDHI_CAN_USE_CXX11_THREAD_LOCAL + thread_local +#endif // GUDHI_CAN_USE_CXX11_THREAD_LOCAL + std::vector copy; copy.clear(); copy.insert(copy.end(), first, last); std::sort(std::begin(copy), std::end(copy)); diff --git a/src/cmake/modules/GUDHI_compilation_flags.cmake b/src/cmake/modules/GUDHI_compilation_flags.cmake index 394f1f42..a01d6e13 100644 --- a/src/cmake/modules/GUDHI_compilation_flags.cmake +++ b/src/cmake/modules/GUDHI_compilation_flags.cmake @@ -1,6 +1,7 @@ # This files manage compilation flags required by GUDHI include(TestCXXAcceptsFlag) +include(CheckCXXSourceCompiles) # add a compiler flag only if it is accepted macro(add_cxx_compiler_flag _flag) @@ -11,6 +12,32 @@ macro(add_cxx_compiler_flag _flag) endif() endmacro() +function(can_cgal_use_cxx11_thread_local) + # This is because of https://github.com/CGAL/cgal/blob/master/Installation/include/CGAL/tss.h + # CGAL is using boost thread if thread_local is not ready (requires XCode 8 for Mac). + # The test in https://github.com/CGAL/cgal/blob/master/Installation/include/CGAL/config.h + # #if __has_feature(cxx_thread_local) || \ + # ( (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L ) || \ + # ( _MSC_VER >= 1900 ) + # #define CGAL_CAN_USE_CXX11_THREAD_LOCAL + # #endif + set(CGAL_CAN_USE_CXX11_THREAD_LOCAL " + int main() { + #ifndef __has_feature + #define __has_feature(x) 0 // Compatibility with non-clang compilers. + #endif + #if __has_feature(cxx_thread_local) || \ + ( (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L ) || \ + ( _MSC_VER >= 1900 ) + bool has_feature_thread_local = true; + #else + // Explicit error of compilation for CMake test purpose - has_feature_thread_local is not defined + #endif + bool result = has_feature_thread_local; + } ") + check_cxx_source_compiles("${CGAL_CAN_USE_CXX11_THREAD_LOCAL}" CGAL_CAN_USE_CXX11_THREAD_LOCAL_RESULT) +endfunction() + set (CMAKE_CXX_STANDARD 11) enable_testing() @@ -22,14 +49,24 @@ endif() add_cxx_compiler_flag("-Wall") -if(CMAKE_BUILD_TYPE MATCHES Debug) - message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") -else() - message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") -endif() - if (DEBUG_TRACES) # For programs to be more verbose message(STATUS "DEBUG_TRACES are activated") add_definitions(-DDEBUG_TRACES) endif() + +set(GUDHI_CAN_USE_CXX11_THREAD_LOCAL " + int main() { + thread_local int result = 0; + return result; + } ") +check_cxx_source_compiles("${GUDHI_CAN_USE_CXX11_THREAD_LOCAL}" GUDHI_CAN_USE_CXX11_THREAD_LOCAL_RESULT) +if (GUDHI_CAN_USE_CXX11_THREAD_LOCAL_RESULT) + add_definitions(-DGUDHI_CAN_USE_CXX11_THREAD_LOCAL) +endif() + +if(CMAKE_BUILD_TYPE MATCHES Debug) + message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") +else() + message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") +endif() diff --git a/src/cython/CMakeLists.txt b/src/cython/CMakeLists.txt index 158c7561..17d440ee 100644 --- a/src/cython/CMakeLists.txt +++ b/src/cython/CMakeLists.txt @@ -1,7 +1,5 @@ project(Cython) -include(CheckCXXSourceCompiles) - function( add_gudhi_cython_lib THE_LIB ) if(EXISTS ${THE_LIB}) get_filename_component(THE_LIB_FILE_NAME ${THE_LIB} NAME_WE) @@ -71,30 +69,7 @@ if(CYTHON_FOUND) endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0) if(CGAL_FOUND) - # This is because of https://github.com/CGAL/cgal/blob/master/Installation/include/CGAL/tss.h - # CGAL is using boost thread if thread_local is not ready (requires XCode 8 for Mac). - # The test in https://github.com/CGAL/cgal/blob/master/Installation/include/CGAL/config.h - # #if __has_feature(cxx_thread_local) || \ - # ( (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L ) || \ - # ( _MSC_VER >= 1900 ) - # #define CGAL_CAN_USE_CXX11_THREAD_LOCAL - # #endif - set(CGAL_CAN_USE_CXX11_THREAD_LOCAL " - int main() { - #ifndef __has_feature - #define __has_feature(x) 0 // Compatibility with non-clang compilers. - #endif - #if __has_feature(cxx_thread_local) || \ - ( (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L ) || \ - ( _MSC_VER >= 1900 ) - bool has_feature_thread_local = true; - #else - // Explicit error of compilation for CMake test purpose - has_feature_thread_local is not defined - #endif - bool result = has_feature_thread_local; - } ") - check_cxx_source_compiles("${CGAL_CAN_USE_CXX11_THREAD_LOCAL}" CGAL_CAN_USE_CXX11_THREAD_LOCAL_RESULT) - + can_cgal_use_cxx11_thread_local() if (NOT CGAL_CAN_USE_CXX11_THREAD_LOCAL_RESULT) add_gudhi_cython_lib(${Boost_THREAD_LIBRARY}) set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${Boost_LIBRARY_DIRS}', ") -- cgit v1.2.3 From 0886a06c75d43f6e9d64f41440c0f1c6fd02c06a Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 7 Jun 2018 08:00:17 +0000 Subject: fix Cubical python documentation (no more simplicial references for periodic) git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3555 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 198a65222029760e0ff5cd5e576c3281833b307c --- src/cython/cython/cubical_complex.pyx | 3 +-- src/cython/cython/periodic_cubical_complex.pyx | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/cython/cython/cubical_complex.pyx b/src/cython/cython/cubical_complex.pyx index de6cd396..e94cd539 100644 --- a/src/cython/cython/cubical_complex.pyx +++ b/src/cython/cython/cubical_complex.pyx @@ -105,7 +105,6 @@ cdef class CubicalComplex: def num_simplices(self): """This function returns the number of all cubes in the complex. - complex. :returns: int -- the number of all cubes in the complex. """ @@ -150,7 +149,7 @@ cdef class CubicalComplex: launched first. :note: betti_numbers function always returns [1, 0, 0, ...] as infinity - filtration cubes are not removed from the complex. + filtration cubes are not removed from the complex. """ cdef vector[int] bn_result if self.pcohptr != NULL: diff --git a/src/cython/cython/periodic_cubical_complex.pyx b/src/cython/cython/periodic_cubical_complex.pyx index c25b83e9..e626950b 100644 --- a/src/cython/cython/periodic_cubical_complex.pyx +++ b/src/cython/cython/periodic_cubical_complex.pyx @@ -106,22 +106,21 @@ cdef class PeriodicCubicalComplex: return self.pcohptr != NULL def num_simplices(self): - """This function returns the number of simplices of the simplicial - complex. + """This function returns the number of all cubes in the complex. - :returns: int -- the simplicial complex number of simplices. + :returns: int -- the number of all cubes in the complex. """ return self.thisptr.num_simplices() def dimension(self): - """This function returns the dimension of the simplicial complex. + """This function returns the dimension of the complex. - :returns: int -- the simplicial complex dimension. + :returns: int -- the complex dimension. """ return self.thisptr.dimension() def persistence(self, homology_coeff_field=11, min_persistence=0): - """This function returns the persistence of the simplicial complex. + """This function returns the persistence of the complex. :param homology_coeff_field: The homology coefficient field. Must be a prime number @@ -132,7 +131,7 @@ cdef class PeriodicCubicalComplex: Sets min_persistence to -1.0 to see all values. :type min_persistence: float. :returns: list of pairs(dimension, pair(birth, death)) -- the - persistence of the simplicial complex. + persistence of the complex. """ if self.pcohptr != NULL: del self.pcohptr @@ -144,12 +143,15 @@ cdef class PeriodicCubicalComplex: return persistence_result def betti_numbers(self): - """This function returns the Betti numbers of the simplicial complex. + """This function returns the Betti numbers of the complex. :returns: list of int -- The Betti numbers ([B0, B1, ..., Bn]). :note: betti_numbers function requires persistence function to be launched first. + + :note: betti_numbers function always returns [1, 0, 0, ...] as infinity + filtration cubes are not removed from the complex. """ cdef vector[int] bn_result if self.pcohptr != NULL: @@ -157,8 +159,7 @@ cdef class PeriodicCubicalComplex: return bn_result def persistent_betti_numbers(self, from_value, to_value): - """This function returns the persistent Betti numbers of the - simplicial complex. + """This function returns the persistent Betti numbers of the complex. :param from_value: The persistence birth limit to be added in the numbers (persistent birth <= from_value). @@ -179,8 +180,8 @@ cdef class PeriodicCubicalComplex: return pbn_result def persistence_intervals_in_dimension(self, dimension): - """This function returns the persistence intervals of the simplicial - complex in a specific dimension. + """This function returns the persistence intervals of the complex in a + specific dimension. :param dimension: The specific dimension. :type from_value: int. -- cgit v1.2.3 From 1ab1ffb38c49443ebef69dbb86e5da582c1cd767 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 7 Jun 2018 09:29:16 +0000 Subject: Code review : Use thread_local when necessary git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3558 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0893cfa1065dcd9988c9d910e764b7a1edbcdc11 --- src/Nerve_GIC/include/gudhi/GIC.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Nerve_GIC/include/gudhi/GIC.h b/src/Nerve_GIC/include/gudhi/GIC.h index ebe463dd..7aa95210 100644 --- a/src/Nerve_GIC/include/gudhi/GIC.h +++ b/src/Nerve_GIC/include/gudhi/GIC.h @@ -142,17 +142,25 @@ class Cover_complex { std::string point_cloud_name; std::string color_name; - // 2 threads using 2 different GIC will have their own random engine - std::default_random_engine re; - // Remove all edges of a graph. void remove_edges(Graph& G) { boost::graph_traits::edge_iterator ei, ei_end; for (boost::tie(ei, ei_end) = boost::edges(G); ei != ei_end; ++ei) boost::remove_edge(*ei, G); } + // Thread local is not available on XCode version < V.8 + // If not available, random engine is a class member. +#ifndef GUDHI_CAN_USE_CXX11_THREAD_LOCAL + std::default_random_engine re; +#endif // GUDHI_CAN_USE_CXX11_THREAD_LOCAL + // Find random number in [0,1]. double GetUniform() { + // Thread local is not available on XCode version < V.8 + // If available, random engine is defined for each thread. +#ifdef GUDHI_CAN_USE_CXX11_THREAD_LOCAL + thread_local std::default_random_engine re; +#endif // GUDHI_CAN_USE_CXX11_THREAD_LOCAL std::uniform_real_distribution Dist(0, 1); return Dist(re); } -- cgit v1.2.3 From 5eaeffe9f19d1355c3ff704bbb8aaa2c4c324b35 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 7 Jun 2018 10:55:59 +0000 Subject: beta version for Gudhi 2.2.0 git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3560 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 470fd4feeb480a415a03d5378f5734fd42f2411a --- CMakeGUDHIVersion.txt | 4 ++-- src/Doxyfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt index 5e71f7eb..3ffb012f 100644 --- a/CMakeGUDHIVersion.txt +++ b/CMakeGUDHIVersion.txt @@ -1,6 +1,6 @@ set (GUDHI_MAJOR_VERSION 2) -set (GUDHI_MINOR_VERSION 1) -set (GUDHI_PATCH_VERSION 0) +set (GUDHI_MINOR_VERSION 2) +set (GUDHI_PATCH_VERSION 0.beta) set(GUDHI_VERSION ${GUDHI_MAJOR_VERSION}.${GUDHI_MINOR_VERSION}.${GUDHI_PATCH_VERSION}) message(STATUS "GUDHI version : ${GUDHI_VERSION}") diff --git a/src/Doxyfile b/src/Doxyfile index 52de65b0..1cb86183 100644 --- a/src/Doxyfile +++ b/src/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "GUDHI" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "2.1.0" +PROJECT_NUMBER = "2.2.0.beta" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a -- cgit v1.2.3 From 1ff765f5b703926c33fa57153e46ed89794912be Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 7 Jun 2018 11:38:09 +0000 Subject: Use release candidate instead of beta tag git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3563 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 85f92deeb18049186357a93f1d746ad2e5570cc0 --- CMakeGUDHIVersion.txt | 2 +- src/Doxyfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt index 3ffb012f..17bdb3de 100644 --- a/CMakeGUDHIVersion.txt +++ b/CMakeGUDHIVersion.txt @@ -1,6 +1,6 @@ set (GUDHI_MAJOR_VERSION 2) set (GUDHI_MINOR_VERSION 2) -set (GUDHI_PATCH_VERSION 0.beta) +set (GUDHI_PATCH_VERSION 0.rc1) set(GUDHI_VERSION ${GUDHI_MAJOR_VERSION}.${GUDHI_MINOR_VERSION}.${GUDHI_PATCH_VERSION}) message(STATUS "GUDHI version : ${GUDHI_VERSION}") diff --git a/src/Doxyfile b/src/Doxyfile index 1cb86183..99e9d108 100644 --- a/src/Doxyfile +++ b/src/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "GUDHI" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "2.2.0.beta" +PROJECT_NUMBER = "2.2.0.rc1" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a -- cgit v1.2.3 From 5397788ef9b387267eaadee682f2b50bc3503de3 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 7 Jun 2018 14:24:11 +0000 Subject: Fix alpha complex user pseudo code on documentation git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3565 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 4b4300ef95fac962dd2c4d6a44c5c9f80ca6bc4a --- src/Alpha_complex/doc/Intro_alpha_complex.h | 80 +++++++++-------------------- 1 file changed, 23 insertions(+), 57 deletions(-) diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h index 2d55c710..7a375c9f 100644 --- a/src/Alpha_complex/doc/Intro_alpha_complex.h +++ b/src/Alpha_complex/doc/Intro_alpha_complex.h @@ -93,63 +93,29 @@ namespace alpha_complex { * \image html "alpha_complex_doc.png" "Simplicial complex structure construction example" * * \subsection filtrationcomputation Filtration value computation algorithm - * - * - * - *
    - *
  • \f$ \textbf{for } i : dimension \rightarrow 0 \textbf{ do} \f$ - *
      - *
    • \f$\textbf{for all } \sigma of dimension i \f$ - *
        - *
      • \f$\textbf{if } filtration( \sigma ) is NaN \textbf{ then} \f$ - *
          - *
        • \f$ filtration( \sigma ) = \alpha^2( \sigma ) \f$ - *
        • - *
        - *
      • - *
      • \f$\textbf{end if}\f$ - *
      • - *
      • \f$\textbf{for all } \tau face of \sigma \textbf{ do} \f$ - *        // propagate alpha filtration value - *
          - *
        • \f$\textbf{if } filtration( \tau ) is not NaN \textbf{ then} \f$ - *
            - *
          • \f$ filtration( \tau ) = min ( filtration( \tau ), filtration( \sigma ) ) \f$ - *
          • - *
          - *
        • - *
        • \f$\textbf{else}\f$ - *
            - *
          • \f$\textbf{if } \tau is not Gabriel for \sigma \textbf{ then} \f$ - *
              - *
            • \f$ filtration( \tau ) = filtration( \sigma ) \f$ - *
            • - *
            - *
          • - *
          • \f$\textbf{end if}\f$ - *
          • - *
          - *
        • - *
        • \f$\textbf{end if}\f$ - *
        • - *
        - *
      • - *
      • \f$\textbf{end for}\f$ - *
      • - *
      - *
    • - *
    • \f$\textbf{end for}\f$ - *
    • - *
    - *
  • - *
  • \f$\textbf{end for}\f$ - *
  • - *
  • \f$make\_filtration\_non\_decreasing()\f$ - *
  • - *
  • \f$prune\_above\_filtration()\f$ - *
  • - *
- * + *
+ * \f$ + * \textbf{for } \text{i : dimension } \rightarrow 0 \textbf{ do}\\ + * \quad \textbf{for all } \sigma \text{ of dimension i}\\ + * \quad\quad \textbf{if } \text{filtration(} \sigma ) \text{ is NaN} \textbf{ then}\\ + * \quad\quad\quad \text{filtration(} \sigma ) = \alpha^2( \sigma )\\ + * \quad\quad \textbf{end if}\\ + * \quad\quad \textbf{for all } \tau \text{ face of } \sigma \textbf{ do}\quad\quad + * \textit{// propagate alpha filtration value}\\ + * \quad\quad\quad \textbf{if } \text{filtration(} \tau ) \text{ is not NaN} \textbf{ then}\\ + * \quad\quad\quad\quad \text{filtration(} \tau \text{) = min( filtration(} \tau \text{), filtration(} \sigma + * \text{) )}\\ + * \quad\quad\quad \textbf{else}\\ + * \quad\quad\quad\quad \textbf{if } \textbf{if } \tau \text{ is not Gabriel for } \sigma \textbf{ then}\\ + * \quad\quad\quad\quad\quad \text{filtration(} \tau \text{) = filtration(} \sigma \text{)}\\ + * \quad\quad\quad\quad \textbf{end if}\\ + * \quad\quad\quad \textbf{end if}\\ + * \quad\quad \textbf{end for}\\ + * \quad \textbf{end for}\\ + * \textbf{end for}\\ + * \text{make_filtration_non_decreasing()}\\ + * \text{prune_above_filtration()}\\ + * \f$ * * \subsubsection dimension2 Dimension 2 * -- cgit v1.2.3 From e0634f23c228f5f4061b45a7b9af31a3310e11a4 Mon Sep 17 00:00:00 2001 From: glisse Date: Tue, 12 Jun 2018 13:58:44 +0000 Subject: Quick fix for infinite loop: drop extra precision in step computation. I am not saying this is what the code should optimally look like... git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3590 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0253d73afb1b1b565b45d214ea2d948e00c7db25 --- src/Bottleneck_distance/include/gudhi/Bottleneck.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Bottleneck_distance/include/gudhi/Bottleneck.h b/src/Bottleneck_distance/include/gudhi/Bottleneck.h index 41f8b16a..b0fc3949 100644 --- a/src/Bottleneck_distance/include/gudhi/Bottleneck.h +++ b/src/Bottleneck_distance/include/gudhi/Bottleneck.h @@ -30,6 +30,7 @@ #include // for numeric_limits #include +#include // FLT_EVAL_METHOD namespace Gudhi { @@ -43,6 +44,13 @@ double bottleneck_distance_approx(Persistence_graph& g, double e) { Graph_matching biggest_unperfect(g); while (b_upper_bound - b_lower_bound > 2 * e) { double step = b_lower_bound + (b_upper_bound - b_lower_bound) / alpha; +#if !defined FLT_EVAL_METHOD || FLT_EVAL_METHOD < 0 || FLT_EVAL_METHOD > 1 + // On platforms where double computation is done with excess precision, + // we force it to its true precision so the following test is reliable. + volatile double drop_excess_precision = step; + step = drop_excess_precision; + // Alternative: step = CGAL::IA_force_to_double(step); +#endif if (step <= b_lower_bound || step >= b_upper_bound) // Avoid precision problem break; m.set_r(step); -- cgit v1.2.3 From e7fa347f0d0e0160e90ee2f869c8039625aaed5f Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 13 Jun 2018 07:32:36 +0000 Subject: Fix cppcheck issues git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3601 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 44cc04b1609d3b3d40382fd02d4fe15e5ba0159f --- src/Cech_complex/include/gudhi/Cech_complex.h | 1 + .../include/gudhi/read_persistence_from_file.h | 6 ++-- .../include/gudhi/Sparse_rips_complex.h | 4 +-- .../rips_correlation_matrix_persistence.cpp | 1 + src/Witness_complex/example/generators.h | 6 ++-- src/common/doc/header.html | 34 ++++++++++----------- src/common/include/gudhi/Off_reader.h | 2 +- src/common/include/gudhi/distance_functions.h | 4 +-- src/common/include/gudhi/random_point_generators.h | 3 +- .../include/gudhi/writing_persistence_to_file.h | 8 ++--- src/cython/doc/_templates/layout.html | 35 +++++++++++----------- 11 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/Cech_complex/include/gudhi/Cech_complex.h b/src/Cech_complex/include/gudhi/Cech_complex.h index f4fb4288..f9b8a269 100644 --- a/src/Cech_complex/include/gudhi/Cech_complex.h +++ b/src/Cech_complex/include/gudhi/Cech_complex.h @@ -30,6 +30,7 @@ #include #include // for exception management +#include namespace Gudhi { diff --git a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h index e0fc7107..4a2b9d68 100644 --- a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h +++ b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h @@ -57,7 +57,7 @@ std::vector > read_persistence_intervals_in_one_dimens std::string line; std::vector > barcode_initial = - read_persistence_intervals_in_dimension(filename, (int)dimension); + read_persistence_intervals_in_dimension(filename, static_cast(dimension)); std::vector > final_barcode; final_barcode.reserve(barcode_initial.size()); @@ -92,8 +92,8 @@ std::vector > read_persistence_intervals_in_one_dimens if ((barcode_initial[i].second == std::numeric_limits::infinity()) && (what_to_substitute_for_infinite_bar != -1)) { - if (barcode_initial[i].first < what_to_substitute_for_infinite_bar) // if only birth < death. - { + if (barcode_initial[i].first < what_to_substitute_for_infinite_bar) { + // if only birth < death. final_barcode.push_back( std::pair(barcode_initial[i].first, what_to_substitute_for_infinite_bar)); } diff --git a/src/Rips_complex/include/gudhi/Sparse_rips_complex.h b/src/Rips_complex/include/gudhi/Sparse_rips_complex.h index 19a44b28..4dcc08ed 100644 --- a/src/Rips_complex/include/gudhi/Sparse_rips_complex.h +++ b/src/Rips_complex/include/gudhi/Sparse_rips_complex.h @@ -54,7 +54,7 @@ namespace rips_complex { template class Sparse_rips_complex { private: - // TODO: use a different graph where we know we can safely insert in parallel. + // TODO(MG): use a different graph where we know we can safely insert in parallel. typedef typename boost::adjacency_list, boost::property> @@ -140,7 +140,7 @@ class Sparse_rips_complex { put(vertex_filtration_t(), graph_, v, 0); } - // TODO: + // TODO(MG): // - make it parallel // - only test near-enough neighbors for (int i = 0; i < n; ++i) diff --git a/src/Rips_complex/utilities/rips_correlation_matrix_persistence.cpp b/src/Rips_complex/utilities/rips_correlation_matrix_persistence.cpp index d4671b45..c78677d2 100644 --- a/src/Rips_complex/utilities/rips_correlation_matrix_persistence.cpp +++ b/src/Rips_complex/utilities/rips_correlation_matrix_persistence.cpp @@ -31,6 +31,7 @@ #include #include #include // infinity +#include // for sort // Types definition using Simplex_tree = Gudhi::Simplex_tree; diff --git a/src/Witness_complex/example/generators.h b/src/Witness_complex/example/generators.h index 81566824..4b755daa 100644 --- a/src/Witness_complex/example/generators.h +++ b/src/Witness_complex/example/generators.h @@ -20,8 +20,8 @@ * along with this program. If not, see . */ -#ifndef EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_ -#define EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_ +#ifndef GENERATORS_H_ +#define GENERATORS_H_ #include #include @@ -163,4 +163,4 @@ void generate_points_torus(Point_Vector& W, int nbP, int dim) { } } -#endif // EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_ +#endif // GENERATORS_H_ diff --git a/src/common/doc/header.html b/src/common/doc/header.html index 4661dbbe..56833d39 100644 --- a/src/common/doc/header.html +++ b/src/common/doc/header.html @@ -27,7 +27,7 @@ $extrastylesheet
- Author: Clément Maria, Pawel Dlotko, Vincent Rouvreau
+ Author: Clément Maria, Pawel Dlotko, Vincent Rouvreau, Marc Glisse
Introduced in: GUDHI 2.0.0
Copyright: GPL v3