From 21eb395a9571d4b6df64b4972f6727b235369836 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 14 Sep 2016 05:56:34 +0000 Subject: -Wsign-compare is included into -Wall -pedantic is recognized by icpc (and also gcc and clang) unlike -Wpedantic git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@1494 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 6ad63e46a4e077bc4e16852eb0cb443db7c5197d --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ce556b2..42a56fdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ else() # 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 -Wpedantic -Wsign-compare") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic") endif() if(CMAKE_BUILD_TYPE MATCHES Debug) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cde949e1..c7744c49 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -53,7 +53,7 @@ else() # 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 -Wpedantic -Wsign-compare") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic") endif() if(CMAKE_BUILD_TYPE MATCHES Debug) -- cgit v1.2.3 -- cgit v1.2.3 From bef66102e0ab999724dbb6c1ad9733ee2a5d6813 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 15 Sep 2016 14:00:35 +0000 Subject: Fix cpplint and warnings git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1502 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: afc7d137b66225954ebfe37a823f1f0b6bcfe7a5 --- src/GudhUI/model/Model.h | 4 +- src/GudhUI/utils/Edge_contractor.h | 2 +- src/GudhUI/utils/Furthest_point_epsilon_net.h | 2 +- src/GudhUI/view/FirstCoordProjector.h | 6 +- src/Simplex_tree/test/simplex_tree_unit_test.cpp | 16 +- src/Skeleton_blocker/concept/SkeletonBlockerDS.h | 213 +++++++++++---------- .../concept/SkeletonBlockerGeometricDS.h | 113 ++++++----- .../example/Skeleton_blocker_from_simplices.cpp | 2 +- .../example/Skeleton_blocker_iteration.cpp | 2 +- .../example/Skeleton_blocker_link.cpp | 4 +- .../include/gudhi/Skeleton_blocker.h | 204 ++++++++++---------- .../Skeleton_blocker_complex_visitor.h | 53 ++--- .../Skeleton_blocker_link_superior.h | 14 +- .../Skeleton_blocker/Skeleton_blocker_off_io.h | 11 +- .../Skeleton_blocker_simple_geometric_traits.h | 13 +- .../Skeleton_blocker_simple_traits.h | 39 ++-- .../Skeleton_blocker/Skeleton_blocker_simplex.h | 12 +- .../Skeleton_blocker_sub_complex.h | 49 ++--- .../gudhi/Skeleton_blocker/internal/Top_faces.h | 5 +- .../include/gudhi/Skeleton_blocker/internal/Trie.h | 10 +- .../Skeleton_blockers_blockers_iterators.h | 5 +- .../iterators/Skeleton_blockers_edges_iterators.h | 3 +- .../iterators/Skeleton_blockers_iterators.h | 2 +- .../Skeleton_blockers_simplices_iterators.h | 34 ++-- .../Skeleton_blockers_triangles_iterators.h | 12 +- .../Skeleton_blockers_vertices_iterators.h | 12 +- .../include/gudhi/Skeleton_blocker_complex.h | 37 ++-- .../gudhi/Skeleton_blocker_geometric_complex.h | 3 +- .../include/gudhi/Skeleton_blocker_link_complex.h | 28 +-- .../gudhi/Skeleton_blocker_simplifiable_complex.h | 11 +- src/Skeleton_blocker/test/TestGeometricComplex.cpp | 2 +- src/Skeleton_blocker/test/TestSimplifiable.cpp | 10 +- .../test/TestSkeletonBlockerComplex.cpp | 9 +- 33 files changed, 474 insertions(+), 468 deletions(-) diff --git a/src/GudhUI/model/Model.h b/src/GudhUI/model/Model.h index 1c39c0d7..77e37b6c 100644 --- a/src/GudhUI/model/Model.h +++ b/src/GudhUI/model/Model.h @@ -72,8 +72,8 @@ class CGAL_geometric_flag_complex_wrapper { void maximal_face(std::vector vertices) { if (!load_only_points_) { // std::cout << "size:" << vertices.size() << std::endl; - for (int i = 0; i < vertices.size(); ++i) - for (int j = i + 1; j < vertices.size(); ++j) + for (std::size_t i = 0; i < vertices.size(); ++i) + for (std::size_t j = i + 1; j < vertices.size(); ++j) complex_.add_edge(Vertex_handle(vertices[i]), Vertex_handle(vertices[j])); } } diff --git a/src/GudhUI/utils/Edge_contractor.h b/src/GudhUI/utils/Edge_contractor.h index 45079a40..8a29ff4b 100644 --- a/src/GudhUI/utils/Edge_contractor.h +++ b/src/GudhUI/utils/Edge_contractor.h @@ -65,7 +65,7 @@ template class Edge_contractor { Placement_type operator()(const EdgeProfile& profile) const override { std::vector mid_coords(profile.p0().dimension(), 0); - for (size_t i = 0; i < profile.p0().dimension(); ++i) { + for (int i = 0; i < profile.p0().dimension(); ++i) { mid_coords[i] = (profile.p0()[i] + profile.p1()[i]) / 2.; } return Point(profile.p0().dimension(), mid_coords.begin(), mid_coords.end()); diff --git a/src/GudhUI/utils/Furthest_point_epsilon_net.h b/src/GudhUI/utils/Furthest_point_epsilon_net.h index f2a216f6..98346daa 100644 --- a/src/GudhUI/utils/Furthest_point_epsilon_net.h +++ b/src/GudhUI/utils/Furthest_point_epsilon_net.h @@ -73,7 +73,7 @@ template class Furthest_point_epsilon_net { complex_(complex) { if (!complex.empty()) { init_filtration(); - for (int k = 2; k < net_filtration_.size(); ++k) { + for (std::size_t k = 2; k < net_filtration_.size(); ++k) { update_radius_value(k); } } diff --git a/src/GudhUI/view/FirstCoordProjector.h b/src/GudhUI/view/FirstCoordProjector.h index a4027b7f..1333f5d3 100644 --- a/src/GudhUI/view/FirstCoordProjector.h +++ b/src/GudhUI/view/FirstCoordProjector.h @@ -33,9 +33,11 @@ class FirstCoordProjector3D : public Projector3D { Point_3 operator()(const Point& p) const { if (p.dimension() >= 3) - return Point_3(p.x(), p.y(), p.z()); + return Point_3(p.x(), p.y(), p.z()); else if (p.dimension() >= 2) - return Point_3(p.x(), p.y(), 0.0); + return Point_3(p.x(), p.y(), 0.0); + else + return Point_3(0.0, 0.0, 0.0); } }; diff --git a/src/Simplex_tree/test/simplex_tree_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_unit_test.cpp index b1bb23b1..28bf202b 100644 --- a/src/Simplex_tree/test/simplex_tree_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_unit_test.cpp @@ -806,14 +806,14 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing) { st.insert_simplex_and_subfaces({3, 0}, 2.0); st.insert_simplex_and_subfaces({3, 4, 5}, 2.0); - // Inserted simplex: - // 1 - // o - // /X\ - // o---o---o---o - // 2 0 3\X/4 - // o - // 5 + /* Inserted simplex: */ + /* 1 */ + /* o */ + /* /X\ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ std::cout << "Check default insertion ensures the filtration values are non decreasing" << std::endl; BOOST_CHECK(!st.make_filtration_non_decreasing()); diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h index 3c650f99..d82425a0 100644 --- a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h +++ b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h @@ -1,128 +1,129 @@ -/* - * SkeletonBlockerDS.h +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. * - * Created on: Feb 20, 2014 - * Author: David Salinas - * Copyright 2013 INRIA. All rights reserved + * Author(s): David Salinas + * + * 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 . */ -#ifndef GUDHI_SKELETONBLOCKERDS_H_ -#define GUDHI_SKELETONBLOCKERDS_H_ - +#ifndef CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_ +#define CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_ namespace Gudhi { namespace skeleton_blocker { - - /** \brief Concept for the template class passed for Skeleton_blocker_complex. * Most importantly, it contains the nodes for vertices and edges * (Graph_vertex and Graph_edge) that are stored in the simplicial * complex. The user can redefine these classes to attach * additional information to vertices and edges. */ -struct SkeletonBlockerDS -{ - /** - * @brief index that allows to find the vertex in the boost graph - */ - typedef int boost_vertex_handle; - - - /** - * @brief Root_vertex_handle and Vertex_handle are similar to global and local vertex descriptor - * used in boost subgraphs - * and allow to localize a vertex of a subcomplex on its parent root complex. - * - * In gross, vertices are stored in a vector - * and the Root_vertex_handle and Vertex_handle store indices of a vertex in this vector. - * - * For the root simplicial complex, the Root_vertex_handle and Vertex_handle of a vertex - * are the same. - * - * - * For a subcomplex L of a simplicial complex K, the local descriptor, ie the Vertex_handle, of a - * vertex v (that belongs to L) is its position in the vector of vertices - * of the subcomplex L whereas its Root_vertex_handle (global descriptor) is the position of v in the vector of the - * vertices of the root simplicial complex K. - */ - struct Root_vertex_handle{ - - boost_vertex_handle vertex; - - friend ostream& operator << (ostream& o, const Root_vertex_handle & v); - }; - - /** - * A Vertex_handle must be Default Constructible, Assignable and Equality Comparable. - */ - struct Vertex_handle{ - boost_vertex_handle vertex; - - friend ostream& operator << (ostream& o, const Vertex_handle & v); - }; - - - /** - * \brief The type of vertices that are stored the boost graph. - * A Vertex must be Default Constructible and Equality Comparable. - * - */ - struct Graph_vertex{ - /** \brief Used to deactivate a vertex for example when contracting an edge. - * It allows in some cases to remove the vertex at low cost. - */ - void deactivate(); - - /** \brief Used to activate a vertex. - */ - void activate(); - - /** \brief Tells if the vertex is active. - */ - bool is_active() const; - - void set_id(Root_vertex_handle i); - Root_vertex_handle get_id() const; - virtual string to_string() const ; - friend ostream& operator << (ostream& o, const Graph_vertex & v); - }; - - - /** - * \brief The type of edges that are stored the boost graph. - * An Edge must be Default Constructible and Equality Comparable. - */ - struct Graph_edge{ - /** - * @brief Allows to modify vertices of the edge. - */ - void setId(Root_vertex_handle a,Root_vertex_handle b); - - /** - * @brief Returns the first vertex of the edge. - */ - Root_vertex_handle first() const ; - - /** - * @brief Returns the second vertex of the edge. - */ - Root_vertex_handle second() const ; - - friend ostream& operator << (ostream& o, const Simple_edge & v); - }; - - +struct SkeletonBlockerDS { + /** + * @brief index that allows to find the vertex in the boost graph + */ + typedef int boost_vertex_handle; + + /** + * @brief Root_vertex_handle and Vertex_handle are similar to global and local vertex descriptor + * used in boost subgraphs + * and allow to localize a vertex of a subcomplex on its parent root complex. + * + * In gross, vertices are stored in a vector + * and the Root_vertex_handle and Vertex_handle store indices of a vertex in this vector. + * + * For the root simplicial complex, the Root_vertex_handle and Vertex_handle of a vertex + * are the same. + * + * + * For a subcomplex L of a simplicial complex K, the local descriptor, ie the Vertex_handle, of a + * vertex v (that belongs to L) is its position in the vector of vertices + * of the subcomplex L whereas its Root_vertex_handle (global descriptor) is the position of v in the vector of the + * vertices of the root simplicial complex K. + */ + struct Root_vertex_handle { + boost_vertex_handle vertex; + + friend ostream& operator<<(ostream& o, const Root_vertex_handle & v); + }; + + /** + * A Vertex_handle must be Default Constructible, Assignable and Equality Comparable. + */ + struct Vertex_handle { + boost_vertex_handle vertex; + + friend ostream& operator<<(ostream& o, const Vertex_handle & v); + }; + + /** + * \brief The type of vertices that are stored the boost graph. + * A Vertex must be Default Constructible and Equality Comparable. + * + */ + struct Graph_vertex { + /** \brief Used to deactivate a vertex for example when contracting an edge. + * It allows in some cases to remove the vertex at low cost. + */ + void deactivate(); + + /** \brief Used to activate a vertex. + */ + void activate(); + + /** \brief Tells if the vertex is active. + */ + bool is_active() const; + + void set_id(Root_vertex_handle i); + Root_vertex_handle get_id() const; + virtual string to_string() const; + friend ostream& operator<<(ostream& o, const Graph_vertex & v); + }; + + /** + * \brief The type of edges that are stored the boost graph. + * An Edge must be Default Constructible and Equality Comparable. + */ + struct Graph_edge { + /** + * @brief Allows to modify vertices of the edge. + */ + void setId(Root_vertex_handle a, Root_vertex_handle b); + + /** + * @brief Returns the first vertex of the edge. + */ + Root_vertex_handle first() const; + + /** + * @brief Returns the second vertex of the edge. + */ + Root_vertex_handle second() const; + + friend ostream& operator<<(ostream& o, const Simple_edge & v); + }; }; - - } // namespace skeleton_blocker namespace skbl = skeleton_blocker; } // namespace Gudhi - -#endif /* GUDHI_SKELETONBLOCKERDS_H_ */ +#endif // CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_ diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h index c5d52800..6017df1a 100644 --- a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h +++ b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h @@ -1,13 +1,27 @@ -/* - * SkeletonBlockerGeometricDS.h +/* This file is part of the Gudhi Library. The Gudhi library + * (Geometric Understanding in Higher Dimensions) is a generic C++ + * library for computational topology. * - * Created on: Feb 20, 2014 - * Author: David Salinas - * Copyright 2013 INRIA. All rights reserved + * Author(s): David Salinas + * + * 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 . */ -#ifndef GUDHI_SKELETONBLOCKERGEOMETRICDS_H_ -#define GUDHI_SKELETONBLOCKERGEOMETRICDS_H_ +#ifndef CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_ +#define CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_ namespace Gudhi { namespace skeleton_blocker { @@ -20,52 +34,51 @@ namespace skeleton_blocker { * Graph_edge must specify how to access to an index. * */ - //todo the index is just for contraction, to remove -template -struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS -{ +//todo the index is just for contraction, to remove - /** - * Geometry information. - */ - typedef GeometryTrait GT ; +template +struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS { + /** + * Geometry information. + */ + typedef GeometryTrait GT; - /** - * Type of point (should be the same as GT::Point). - */ - typedef typename GeometryTrait::Point Point; + /** + * Type of point (should be the same as GT::Point). + */ + typedef typename GeometryTrait::Point Point; - /** - * @brief Vertex that stores a point. - */ - class Graph_vertex : public SkeletonBlockerDS::Graph_vertex{ - public: - /** - * @brief Access to the point. - */ - Point& point(); - /** - * @brief Access to the point. - */ - const Point& point(); - }; + /** + * @brief Vertex that stores a point. + */ + class Graph_vertex : public SkeletonBlockerDS::Graph_vertex { + public: + /** + * @brief Access to the point. + */ + Point& point(); + /** + * @brief Access to the point. + */ + const Point& point(); + }; - /** - * @brief Edge that allows to access to an index. - * The indices of the edges are used to store heap information - * in the edge contraction algorithm. - */ - class Graph_Edge : public SkeletonBlockerDS::Graph_edge{ - public: - /** - * @brief Access to the index. - */ - int& index(); - /** - * @brief Access to the index. - */ - int index(); - }; + /** + * @brief Edge that allows to access to an index. + * The indices of the edges are used to store heap information + * in the edge contraction algorithm. + */ + class Graph_Edge : public SkeletonBlockerDS::Graph_edge { + public: + /** + * @brief Access to the index. + */ + int& index(); + /** + * @brief Access to the index. + */ + int index(); + }; }; } // namespace skeleton_blocker @@ -74,4 +87,4 @@ namespace skbl = skeleton_blocker; } // namespace Gudhi -#endif /* GUDHI_SKELETONBLOCKERGEOMETRICDS_H_ */ +#endif // CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_ diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp index 171f35f2..5f89536b 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp index 8d9d1a67..7df0e3c9 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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/Skeleton_blocker/example/Skeleton_blocker_link.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp index 1f937170..e2a04d75 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) { // For instance, to test if the link contains the vertex that was labeled i: for (int i = 0; i < 5; ++i) cout << "link.contains_vertex(Root_vertex_handle(" << i << ")):" << - link.contains_vertex(Root_vertex_handle(i)) << endl; + link.contains_vertex(Root_vertex_handle(i)) << endl; return EXIT_SUCCESS; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h index 822282fd..85fada4f 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h @@ -1,24 +1,24 @@ - /* 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): David Salinas - * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (France) - * - * 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 . - */ +/* 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): David Salinas + * + * 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 . + */ #ifndef SKELETON_BLOCKER_H_ #define SKELETON_BLOCKER_H_ @@ -63,7 +63,7 @@ when \f$ \tau \neq \sigma\f$ we say that \f$ \tau\f$ is a proper-face of \f$ \si An abstract simplicial complex is a set of simplices that contains all the faces of its simplices. The 1-skeleton of a simplicial complex (or its graph) consists of its elements of dimension lower than 2. -*\image html "ds_representation.png" "Skeleton-blocker representation" width=20cm + *\image html "ds_representation.png" "Skeleton-blocker representation" width=20cm To encode, a simplicial complex, one can encodes all its simplices. @@ -85,7 +85,7 @@ in next figure. Storing the graph and blockers of such simplicial complexes is m their simplices. -*\image html "blockers_curve.png" "Number of blockers of random triangulations of 3-spheres" width=10cm + *\image html "blockers_curve.png" "Number of blockers of random triangulations of 3-spheres" width=10cm @@ -127,46 +127,46 @@ such as the Simplex Tree. The following example computes the Euler Characteristi of a simplicial complex. \code{.cpp} - typedef Skeleton_blocker_complex Complex; - typedef Complex::Vertex_handle Vertex_handle; - typedef Complex::Simplex Simplex; - - const int n = 15; - - // build a full complex with 10 vertices and 2^n-1 simplices - Complex complex; - for(int i=0;i Complex; + typedef Complex::Vertex_handle Vertex_handle; + typedef Complex::Simplex Simplex; + + const int n = 15; + + // build a full complex with 10 vertices and 2^n-1 simplices + Complex complex; + for(int i=0;i simplices; - - //add 4 triangles of a tetrahedron 0123 - simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2))); - simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3))); - simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2))); - simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1))); - - Complex complex; - //get complex from top faces - make_complex_from_top_faces(complex,simplices.begin(),simplices.end()); - - std::cout << "Simplices:"< simplices; + + //add 4 triangles of a tetrahedron 0123 + simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2))); + simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3))); + simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2))); + simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1))); + + Complex complex; + //get complex from top faces + make_complex_from_top_faces(complex,simplices.begin(),simplices.end()); + + std::cout << "Simplices:"<. */ + #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_ #define SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_ @@ -27,7 +28,7 @@ namespace Gudhi { namespace skeleton_blocker { -// todo rajouter les const +// TODO(DS): to be constified /** *@class Skeleton_blocker_complex_visitor @@ -36,7 +37,7 @@ namespace skeleton_blocker { template class Skeleton_blocker_complex_visitor { public: - virtual ~Skeleton_blocker_complex_visitor() {} + virtual ~Skeleton_blocker_complex_visitor() { } virtual void on_add_vertex(Vertex_handle) = 0; virtual void on_remove_vertex(Vertex_handle) = 0; @@ -61,9 +62,9 @@ class Skeleton_blocker_complex_visitor { virtual void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) = 0; virtual void on_add_blocker( - const Skeleton_blocker_simplex&) = 0; + const Skeleton_blocker_simplex&) = 0; virtual void on_delete_blocker( - const Skeleton_blocker_simplex*) = 0; + const Skeleton_blocker_simplex*) = 0; }; /** @@ -73,24 +74,23 @@ class Skeleton_blocker_complex_visitor { */ template class Dummy_complex_visitor : public Skeleton_blocker_complex_visitor< - Vertex_handle> { +Vertex_handle> { public: - void on_add_vertex(Vertex_handle) { - } - void on_remove_vertex(Vertex_handle) { - } - void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) { - } - void on_remove_edge(Vertex_handle a, Vertex_handle b) { - } - void on_changed_edge(Vertex_handle a, Vertex_handle b) { - } - void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) { - } - void on_add_blocker(const Skeleton_blocker_simplex&) { - } - void on_delete_blocker(const Skeleton_blocker_simplex*) { - } + void on_add_vertex(Vertex_handle) { } + + void on_remove_vertex(Vertex_handle) { } + + void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) { } + + void on_remove_edge(Vertex_handle a, Vertex_handle b) { } + + void on_changed_edge(Vertex_handle a, Vertex_handle b) { } + + void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) { } + + void on_add_blocker(const Skeleton_blocker_simplex&) { } + + void on_delete_blocker(const Skeleton_blocker_simplex*) { } }; /** @@ -100,29 +100,36 @@ class Dummy_complex_visitor : public Skeleton_blocker_complex_visitor< */ template class Print_complex_visitor : public Skeleton_blocker_complex_visitor< - Vertex_handle> { +Vertex_handle> { public: void on_add_vertex(Vertex_handle v) { std::cerr << "on_add_vertex:" << v << std::endl; } + void on_remove_vertex(Vertex_handle v) { std::cerr << "on_remove_vertex:" << v << std::endl; } + void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) { std::cerr << "on_add_edge_without_blockers:" << a << "," << b << std::endl; } + void on_remove_edge(Vertex_handle a, Vertex_handle b) { std::cerr << "on_remove_edge:" << a << "," << b << std::endl; } + void on_changed_edge(Vertex_handle a, Vertex_handle b) { std::cerr << "on_changed_edge:" << a << "," << b << std::endl; } + void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) { std::cerr << "on_swaped_edge:" << a << "," << b << "," << x << std::endl; } + void on_add_blocker(const Skeleton_blocker_simplex& b) { std::cerr << "on_add_blocker:" << b << std::endl; } + void on_delete_blocker(const Skeleton_blocker_simplex* b) { std::cerr << "on_delete_blocker:" << b << std::endl; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h index 3bfb5d11..d4b60613 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_ #define SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_ @@ -36,7 +37,7 @@ template class Skeleton_blocker_sub_complex; */ template class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex< - ComplexType> { +ComplexType> { typedef typename ComplexType::Edge_handle Edge_handle; typedef typename ComplexType::boost_vertex_handle boost_vertex_handle; @@ -54,20 +55,17 @@ class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex< typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator IdSimplexConstIterator; Skeleton_blocker_link_superior() - : Skeleton_blocker_link_complex(true) { - } + : Skeleton_blocker_link_complex(true) { } Skeleton_blocker_link_superior(const ComplexType & parent_complex, Simplex& alpha_parent_adress) : Skeleton_blocker_link_complex(parent_complex, - alpha_parent_adress, true) { - } + alpha_parent_adress, true) { } Skeleton_blocker_link_superior(const ComplexType & parent_complex, Vertex_handle a_parent_adress) : Skeleton_blocker_link_complex(parent_complex, - a_parent_adress, true) { - } + a_parent_adress, true) { } }; } // namespace skeleton_blocker diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h index ba46c49e..747e60f1 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_ #define SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_ @@ -49,8 +50,8 @@ class Skeleton_blocker_off_flag_visitor_reader { load_only_points_(load_only_points) { } void init(int dim, int num_vertices, int num_faces, int num_edges) { - // todo do an assert to check that this number are correctly read - // todo reserve size for vector points + // TODO(DS): do an assert to check that this number are correctly read + // TODO(DS): reserve size for vector points } void point(const std::vector& point) { @@ -108,7 +109,7 @@ class Skeleton_blocker_off_visitor_reader { void done() { complex_ = make_complex_from_top_faces(maximal_faces_.begin(), maximal_faces_.end(), - points_.begin(), points_.end() ); + points_.begin(), points_.end()); } }; @@ -140,7 +141,7 @@ class Skeleton_blocker_off_reader { } /** - * return true iff reading did not meet problems. + * return true if reading did not meet problems. */ bool is_valid() const { return valid_; diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h index fb4a1106..275376e6 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_ #define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_ @@ -39,7 +40,7 @@ namespace skeleton_blocker { */ template struct Skeleton_blocker_simple_geometric_traits : - public Skeleton_blocker_simple_traits { +public Skeleton_blocker_simple_traits { public: typedef GeometryTrait GT; typedef typename GT::Point Point; @@ -57,19 +58,20 @@ struct Skeleton_blocker_simple_geometric_traits : Point& point() { return point_; } + const Point& point() const { return point_; } }; class Simple_geometric_edge : - public Skeleton_blocker_simple_traits::Graph_edge { + public Skeleton_blocker_simple_traits::Graph_edge { int index_; public: Simple_geometric_edge() : Skeleton_blocker_simple_traits::Graph_edge(), - index_(-1) { - } + index_(-1) { } + /** * @brief Allows to modify the index of the edge. * The indices of the edge are used to store heap information @@ -78,6 +80,7 @@ struct Skeleton_blocker_simple_geometric_traits : int& index() { return index_; } + int index() const { return index_; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h index 31bec3b6..469717ae 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_ #define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_ @@ -48,9 +49,9 @@ struct Skeleton_blocker_simple_traits { */ struct Root_vertex_handle { typedef int boost_vertex_handle; + explicit Root_vertex_handle(boost_vertex_handle val = -1) - : vertex(val) { - } + : vertex(val) { } boost_vertex_handle vertex; bool operator!=(const Root_vertex_handle& other) const { @@ -65,8 +66,8 @@ struct Skeleton_blocker_simple_traits { return this->vertex < other.vertex; } - friend std::ostream& operator <<(std::ostream& o, - const Root_vertex_handle & v) { + friend std::ostream& operator<<(std::ostream& o, + const Root_vertex_handle & v) { o << v.vertex; return o; } @@ -74,11 +75,13 @@ struct Skeleton_blocker_simple_traits { struct Vertex_handle { typedef int boost_vertex_handle; + explicit Vertex_handle(boost_vertex_handle val = -1) - : vertex(val) { - } + : vertex(val) { } - operator int() const { return static_cast(vertex); } + operator int() const { + return static_cast (vertex); + } boost_vertex_handle vertex; @@ -94,7 +97,7 @@ struct Skeleton_blocker_simple_traits { return this->vertex < other.vertex; } - friend std::ostream& operator <<(std::ostream& o, const Vertex_handle & v) { + friend std::ostream& operator<<(std::ostream& o, const Vertex_handle & v) { o << v.vertex; return o; } @@ -105,21 +108,24 @@ struct Skeleton_blocker_simple_traits { Root_vertex_handle id_; public: - virtual ~Graph_vertex() { - } + virtual ~Graph_vertex() { } void activate() { is_active_ = true; } + void deactivate() { is_active_ = false; } + bool is_active() const { return is_active_; } + void set_id(Root_vertex_handle i) { id_ = i; } + Root_vertex_handle get_id() const { return id_; } @@ -130,7 +136,7 @@ struct Skeleton_blocker_simple_traits { return res.str(); } - friend std::ostream& operator <<(std::ostream& o, const Graph_vertex & v) { + friend std::ostream& operator<<(std::ostream& o, const Graph_vertex & v) { o << v.to_string(); return o; } @@ -142,15 +148,16 @@ struct Skeleton_blocker_simple_traits { int index_; public: + Graph_edge() : a_(-1), - b_(-1), - index_(-1) { - } + b_(-1), + index_(-1) { } int& index() { return index_; } + int index() const { return index_; } @@ -168,7 +175,7 @@ struct Skeleton_blocker_simple_traits { return b_; } - friend std::ostream& operator <<(std::ostream& o, const Graph_edge & v) { + friend std::ostream& operator<<(std::ostream& o, const Graph_edge & v) { o << "(" << v.a_ << "," << v.b_ << " - id = " << v.index(); return o; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h index 3c7f1dd5..aa6f2215 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -63,7 +63,6 @@ class Skeleton_blocker_simplex { */ //@{ - // Skeleton_blocker_simplex():simplex_set() {} void clear() { simplex_set.clear(); } @@ -89,8 +88,7 @@ class Skeleton_blocker_simplex { add_vertex(v); } - void add_vertices() { - } + void add_vertices() { } /** * Initialize a simplex with a string such as {0,1,2} @@ -192,7 +190,6 @@ class Skeleton_blocker_simplex { return simplex_set.crend(); } - typename std::set::iterator begin() { return simplex_set.begin(); } @@ -236,6 +233,7 @@ class Skeleton_blocker_simplex { assert(!empty()); return *(simplex_set.rbegin()); } + /** * @return true iff the simplex contains the simplex a. */ @@ -351,8 +349,8 @@ class Skeleton_blocker_simplex { //@} - friend std::ostream& operator <<(std::ostream& o, - const Skeleton_blocker_simplex & sigma) { + friend std::ostream& operator<<(std::ostream& o, + const Skeleton_blocker_simplex & sigma) { bool first = true; o << "{"; for (auto i : sigma) { diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h index 196fe8c0..fadf6619 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -159,7 +159,7 @@ class Skeleton_blocker_sub_complex : public ComplexType { if (simplex.contains(*blocker)) { Root_simplex_handle blocker_root(parent_complex.get_id(*(blocker))); Simplex blocker_restr( - *(this->get_simplex_address(blocker_root))); + *(this->get_simplex_address(blocker_root))); this->add_blocker(new Simplex(blocker_restr)); } } @@ -190,14 +190,15 @@ class Skeleton_blocker_sub_complex : public ComplexType { // */ // boost::optional get_address(const Root_simplex_handle & s) const; -// private: + // private: /** * same as get_address except that it will return a simplex in any case. * The vertices that were not found are not added. */ // @remark should be private but problem with VS + std::vector > get_addresses( - const Root_simplex_handle & s) const { + const Root_simplex_handle & s) const { std::vector < boost::optional > res; for (auto i : s) { res.push_back(get_address(i)); @@ -214,14 +215,14 @@ class Skeleton_blocker_sub_complex : public ComplexType { */ template bool proper_face_in_union( - Skeleton_blocker_sub_complex & link, - std::vector > & addresses_sigma_in_link, - int vertex_to_be_ignored) { + Skeleton_blocker_sub_complex & link, + std::vector > & addresses_sigma_in_link, + std::size_t vertex_to_be_ignored) { // we test that all vertices of 'addresses_sigma_in_link' but 'vertex_to_be_ignored' // are in link1 if it is the case we construct the corresponding simplex bool vertices_sigma_are_in_link = true; typename ComplexType::Simplex sigma_in_link; - for (int i = 0; i < addresses_sigma_in_link.size(); ++i) { + for (std::size_t i = 0; i < addresses_sigma_in_link.size(); ++i) { if (i != vertex_to_be_ignored) { if (!addresses_sigma_in_link[i]) { vertices_sigma_are_in_link = false; @@ -236,43 +237,24 @@ bool proper_face_in_union( return vertices_sigma_are_in_link && link.contains(sigma_in_link); } -/* - template - bool - proper_faces_in_union(Skeleton_blocker_simplex & sigma, Skeleton_blocker_sub_complex & link1, Skeleton_blocker_sub_complex & link2) - { - typedef typename ComplexType::Vertex_handle Vertex_handle; - std::vector > addresses_sigma_in_link1 = link1.get_addresses(sigma); - std::vector > addresses_sigma_in_link2 = link2.get_addresses(sigma); - - for (int current_index = 0; current_index < addresses_sigma_in_link1.size(); ++current_index) - { - - if (!proper_face_in_union(link1, addresses_sigma_in_link1, current_index) - && !proper_face_in_union(link2, addresses_sigma_in_link2, current_index)){ - return false; - } - } - return true; - }*/ - // Remark: this function should be friend in order to leave get_adresses private // however doing so seemes currently not possible due to a visual studio bug c2668 // "the compiler does not support partial ordering of template functions as specified in the C++ Standard" // http://www.serkey.com/error-c2668-ambiguous-call-to-overloaded-function-bb45ft.html + template bool proper_faces_in_union( - Skeleton_blocker_simplex & sigma, - Skeleton_blocker_sub_complex & link1, - Skeleton_blocker_sub_complex & link2) { + Skeleton_blocker_simplex & sigma, + Skeleton_blocker_sub_complex & link1, + Skeleton_blocker_sub_complex & link2) { typedef typename ComplexType::Vertex_handle Vertex_handle; std::vector < boost::optional > addresses_sigma_in_link1 = link1.get_addresses(sigma); std::vector < boost::optional > addresses_sigma_in_link2 = link2.get_addresses(sigma); - for (int current_index = 0; current_index < addresses_sigma_in_link1.size(); - ++current_index) { + for (std::size_t current_index = 0; current_index < addresses_sigma_in_link1.size(); + ++current_index) { if (!proper_face_in_union(link1, addresses_sigma_in_link1, current_index) && !proper_face_in_union(link2, addresses_sigma_in_link2, current_index)) { @@ -289,4 +271,3 @@ namespace skbl = skeleton_blocker; } // namespace Gudhi #endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_ - diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h index 39d95661..2b681752 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_ #define SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_ @@ -69,4 +70,4 @@ namespace skbl = skeleton_blocker; } // namespace Gudhi -#endif // SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_ +#endif // SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_ diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h index cdc47b8a..ccc7c36b 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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 @@ -21,7 +21,6 @@ * */ - #ifndef SKELETON_BLOCKER_INTERNAL_TRIE_H_ #define SKELETON_BLOCKER_INTERNAL_TRIE_H_ @@ -46,6 +45,7 @@ struct Trie { const Trie* parent_; public: + Trie() : parent_(0) { } Trie(Vertex_handle v_) : v(v_), parent_(0) { } @@ -80,6 +80,7 @@ struct Trie { private: // go down recursively in the tree while advancing the simplex iterator. // when it reaches a leaf, it inserts the remaining that is not present + void add_simplex_helper(Simplex_vertex_const_iterator s_it, Simplex_vertex_const_iterator s_end) { assert(*s_it == v); ++s_it; @@ -105,6 +106,7 @@ struct Trie { } public: + /** * adds the simplex to the trie */ @@ -240,7 +242,7 @@ struct Tries { std::vector next_dimension_simplices() const { std::vector res; - while (!to_see_.empty() && to_see_.front()->simplex().dimension() == current_dimension_) { + while (!(to_see_.empty()) && (to_see_.front()->simplex().dimension() == current_dimension_)) { res.emplace_back(to_see_.front()->simplex()); for (auto child : to_see_.front()->childs) to_see_.push_back(child.get()); @@ -257,7 +259,7 @@ struct Tries { private: mutable std::deque to_see_; - mutable unsigned current_dimension_ = 0; + mutable int current_dimension_ = 0; std::vector cofaces_; }; diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h index 4dbc9ed3..4049fb0b 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_ #define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_ @@ -46,6 +47,7 @@ ReturnType MapIteratorType end_of_map; public: + Blocker_iterator_internal() : current_position() { } Blocker_iterator_internal(MapIteratorType position, MapIteratorType end_of_map_) : @@ -64,6 +66,7 @@ ReturnType } private: + /** * Let the current pair be (v,sigma) where v is a vertex and sigma is a blocker. * If v is not the first vertex of sigma then we already have seen sigma as a blocker diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h index 15618932..b90dcf34 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_ #define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_ diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h index cc3ed276..1351614f 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h index 3b941be5..c9482263 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_ #define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_ @@ -68,10 +69,10 @@ public boost::iterator_facade < Simplex_around_vertex_iterator link_v; std::shared_ptr trie; - std::list nodes_to_be_seen; // todo deque + std::list nodes_to_be_seen; // todo deque public: - Simplex_around_vertex_iterator() : complex(0) {} + Simplex_around_vertex_iterator() : complex(0) { } Simplex_around_vertex_iterator(const Complex* complex_, Vertex_handle v_) : complex(complex_), @@ -81,15 +82,16 @@ public boost::iterator_facade < Simplex_around_vertex_iterator } private: - // todo return to private Simplex_iterator(const Complex* complex, bool end) : complex_(complex) { set_end(); @@ -306,7 +307,7 @@ public boost::iterator_facade < Simplex_iterator /** * Iterator through the maximal faces of the coboundary of a simplex. - */ + */ template class Simplex_coboundary_iterator : public boost::iterator_facade < Simplex_coboundary_iterator @@ -329,7 +330,7 @@ public boost::iterator_facade < Simplex_coboundary_iteratorconvert_handle_from_another_complex(*link, link_vh); } -public: + public: friend std::ostream& operator<<(std::ostream& stream, const Simplex_coboundary_iterator& sci) { return stream; } @@ -369,8 +370,8 @@ public: // assume that iterator points to the same complex and comes from the same simplex bool equal(const Simplex_coboundary_iterator& other) const { assert(complex == other.complex && sigma == other.sigma); - if(is_end()) return other.is_end(); - if(other.is_end()) return is_end(); + if (is_end()) return other.is_end(); + if (other.is_end()) return is_end(); return *current_vertex == *(other.current_vertex); } @@ -384,13 +385,12 @@ public: return res; } -private: + private: bool is_end() const { return !link || current_vertex == link_vertex_end; } }; - } // namespace skeleton_blocker namespace skbl = skeleton_blocker; diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h index b2dd9a21..4e0dbb74 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_ #define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_ @@ -135,7 +136,7 @@ typename SkeletonBlockerComplex::Simplex const Triangle_iterator(const SkeletonBlockerComplex* complex) : complex_(complex), current_vertex_(complex->vertex_range().begin()), - current_triangle_(complex, *current_vertex_), // xxx this line is problematic is the complex is empty + current_triangle_(complex, *current_vertex_), // xxx this line is problematic is the complex is empty is_end_(false) { assert(!complex->empty()); gotoFirstTriangle(); @@ -172,7 +173,8 @@ typename SkeletonBlockerComplex::Simplex const bool both_arent_finished = !is_finished() && !other.is_finished(); // if the two iterators are not finished, they must have the same state return (complex_ == other.complex_) && (both_are_finished || ((both_arent_finished) && - current_vertex_ == other.current_vertex_ && current_triangle_ == other.current_triangle_)); + current_vertex_ == other.current_vertex_ && + current_triangle_ == other.current_triangle_)); } Simplex dereference() const { @@ -183,8 +185,8 @@ typename SkeletonBlockerComplex::Simplex const // goto the next vertex that has a triangle pending or the // end vertex iterator if none exists void goto_next_vertex() { - assert(current_triangle_.finished()); // we mush have consume all triangles passing through the vertex - assert(!is_finished()); // we must not be done + assert(current_triangle_.finished()); // we mush have consume all triangles passing through the vertex + assert(!is_finished()); // we must not be done ++current_vertex_; diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h index f06cab71..9e9ae961 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_ #define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_ @@ -103,7 +104,7 @@ class Vertex_iterator : public boost::iterator_facade< Vertex_iterator -class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_vertices_iterator +class Neighbors_vertices_iterator : public boost::iterator_facade < Neighbors_vertices_iterator , typename SkeletonBlockerComplex::Vertex_handle const , boost::forward_traversal_tag , typename SkeletonBlockerComplex::Vertex_handle const> { @@ -122,9 +123,6 @@ class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_ver boost_adjacency_iterator end_; public: - // boost_adjacency_iterator ai, ai_end; - // for (tie(ai, ai_end) = adjacent_vertices(v.vertex, skeleton); ai != ai_end; ++ai) { - Neighbors_vertices_iterator() : complex(NULL) { } Neighbors_vertices_iterator(const Complex* complex_, Vertex_handle v_) : @@ -157,7 +155,7 @@ class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_ver } private: - // todo remove this ugly hack + // TODO(DS): remove this ugly hack void set_end() { current_ = end_; } @@ -170,5 +168,3 @@ namespace skbl = skeleton_blocker; } // namespace Gudhi #endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_ - - diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h index 7a6d1d50..c1a0cf2d 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -104,8 +104,8 @@ class Skeleton_blocker_complex { typedef typename Simplex::Simplex_vertex_const_iterator Simplex_handle_iterator; protected: - typedef typename boost::adjacency_list Graph; // todo/remark : edges are not sorted, it heavily penalizes computation for SuperiorLink // (eg Link with greater vertices) @@ -211,7 +211,6 @@ class Skeleton_blocker_complex { add_edge_without_blockers(e.first, e.second); } - template void add_blockers(SimpleHandleOutputIterator simplices_begin, SimpleHandleOutputIterator simplices_end) { Tries tries(num_vertices(), simplices_begin, simplices_end); @@ -414,7 +413,8 @@ class Skeleton_blocker_complex { /** */ bool contains_vertex(Vertex_handle u) const { - if (u.vertex < 0 || u.vertex >= boost::num_vertices(skeleton)) + Vertex_handle num_vertices(boost::num_vertices(skeleton)); + if (u.vertex < 0 || u.vertex >= num_vertices) return false; return (*this)[u].is_active(); } @@ -441,11 +441,11 @@ class Skeleton_blocker_complex { * @brief Given an Id return the address of the vertex having this Id in the complex. * @remark For a simplicial complex, the address is the id but it may not be the case for a SubComplex. */ - virtual boost::optional get_address( - Root_vertex_handle id) const { + virtual boost::optional get_address(Root_vertex_handle id) const { boost::optional res; - if (id.vertex < boost::num_vertices(skeleton)) - res = Vertex_handle(id.vertex); // xxx + int num_vertices = boost::num_vertices(skeleton); + if (id.vertex < num_vertices) + res = Vertex_handle(id.vertex); // xxx return res; } @@ -560,7 +560,7 @@ class Skeleton_blocker_complex { return res; } - /** + /** * @brief Adds all edges of s in the complex. */ void add_edge(const Simplex& s) { @@ -591,7 +591,6 @@ class Skeleton_blocker_complex { return *edge_handle; } - /** * @brief Adds all edges of s in the complex without adding blockers. */ @@ -844,12 +843,13 @@ class Skeleton_blocker_complex { boost_adjacency_iterator ai, ai_end; for (tie(ai, ai_end) = adjacent_vertices(v.vertex, skeleton); ai != ai_end; ++ai) { + Vertex_handle value(*ai); if (keep_only_superior) { - if (*ai > v.vertex) { - n.add_vertex(Vertex_handle(*ai)); + if (value > v.vertex) { + n.add_vertex(value); } } else { - n.add_vertex(Vertex_handle(*ai)); + n.add_vertex(value); } } } @@ -929,7 +929,7 @@ class Skeleton_blocker_complex { // xxx rename get_address et place un using dans sub_complex boost::optional get_simplex_address( - const Root_simplex_handle& s) const { + const Root_simplex_handle& s) const { boost::optional res; Simplex s_address; @@ -1001,10 +1001,9 @@ class Skeleton_blocker_complex { return std::distance(triangles.begin(), triangles.end()); } - /* * @brief returns the number of simplices of a given dimension in the complex. - */ + */ size_t num_simplices() const { auto simplices = complex_simplex_range(); return std::distance(simplices.begin(), simplices.end()); @@ -1012,8 +1011,8 @@ class Skeleton_blocker_complex { /* * @brief returns the number of simplices of a given dimension in the complex. - */ - size_t num_simplices(unsigned dimension) const { + */ + size_t num_simplices(int dimension) const { // TODO(DS): iterator on k-simplices size_t res = 0; for (const auto& s : complex_simplex_range()) diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h index 1130ca9f..95331b7a 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_ #define SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_ diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h index 1bd66289..906d3e86 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_LINK_COMPLEX_H_ #define SKELETON_BLOCKER_LINK_COMPLEX_H_ @@ -39,7 +40,7 @@ template class Skeleton_blocker_sub_complex; */ template class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< - ComplexType> { +ComplexType> { template friend class Skeleton_blocker_link_superior; typedef typename ComplexType::Edge_handle Edge_handle; @@ -60,8 +61,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator Root_simplex_handle_iterator; explicit Skeleton_blocker_link_complex(bool only_superior_vertices = false) - : only_superior_vertices_(only_superior_vertices) { - } + : only_superior_vertices_(only_superior_vertices) { } /** * If the parameter only_superior_vertices is true, @@ -95,10 +95,10 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< */ Skeleton_blocker_link_complex(const ComplexType & parent_complex, Edge_handle edge, bool only_superior_vertices = - false) + false) : only_superior_vertices_(only_superior_vertices) { Simplex alpha_simplex(parent_complex.first_vertex(edge), - parent_complex.second_vertex(edge)); + parent_complex.second_vertex(edge)); build_link(parent_complex, alpha_simplex); } @@ -151,7 +151,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< bool only_superior_vertices) { // for a vertex we know exactly the number of vertices of the link (and the size of the corresponding vector this->skeleton.m_vertices.reserve( - parent_complex.degree(alpha_parent_adress)); + parent_complex.degree(alpha_parent_adress)); // For all vertex 'v' in this intersection, we go through all its adjacent blockers. // If one blocker minus 'v' is included in alpha then the vertex is not in the link complex. @@ -169,21 +169,21 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< return; for (auto x_link = this->vertex_range().begin(); - x_link != this->vertex_range().end(); ++x_link) { + x_link != this->vertex_range().end(); ++x_link) { for (auto y_link = x_link; ++y_link != this->vertex_range().end();) { Vertex_handle x_parent = *parent_complex.get_address( - this->get_id(*x_link)); + this->get_id(*x_link)); Vertex_handle y_parent = *parent_complex.get_address( - this->get_id(*y_link)); + this->get_id(*y_link)); if (parent_complex.contains_edge(x_parent, y_parent)) { // we check that there is no blocker subset of alpha passing trough x and y bool new_edge = true; for (auto blocker_parent : parent_complex.const_blocker_range( - x_parent)) { + x_parent)) { if (!is_alpha_blocker || *blocker_parent != alpha_parent_adress) { if (blocker_parent->contains(y_parent)) { new_edge = !(alpha_parent_adress.contains_difference( - *blocker_parent, x_parent, y_parent)); + *blocker_parent, x_parent, y_parent)); if (!new_edge) break; } @@ -202,7 +202,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< * It assumes that other_complex have a vertex 'this.get_id(address)' */ boost::optional give_equivalent_vertex( - const ComplexType & other_complex, Vertex_handle address) const { + const ComplexType & other_complex, Vertex_handle address) const { Root_vertex_handle id((*this)[address].get_id()); return other_complex.get_address(id); } @@ -269,7 +269,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex< bool only_vertices = false) { assert(is_alpha_blocker || parent_complex.contains(alpha_parent_adress)); compute_link_vertices(parent_complex, alpha_parent_adress, only_superior_vertices_); - if(!only_vertices) { + if (!only_vertices) { compute_link_edges(parent_complex, alpha_parent_adress, is_alpha_blocker); compute_link_blockers(parent_complex, alpha_parent_adress, is_alpha_blocker); } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h index 171efd4b..fcb6bafe 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_ #define SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_ @@ -33,7 +34,7 @@ namespace Gudhi { namespace skeleton_blocker { /** - * Returns true iff the blocker 'sigma' is popable. + * Returns true if the blocker 'sigma' is popable. * To define popable, let us call 'L' the complex that * consists in the current complex without the blocker 'sigma'. * A blocker 'sigma' is then "popable" if the link of 'sigma' @@ -146,7 +147,7 @@ void Skeleton_blocker_complex::remove_star(Vertex_handle v) { */ template void Skeleton_blocker_complex::update_blockers_after_remove_star_of_vertex_or_edge( - const Simplex& simplex_to_be_removed) { + const Simplex& simplex_to_be_removed) { std::list blockers_to_update; if (simplex_to_be_removed.empty()) return; @@ -224,8 +225,6 @@ void Skeleton_blocker_complex::add_simplex(const Simplex& sig add_blockers_after_simplex_insertion(sigma); } - - template void Skeleton_blocker_complex::add_blockers_after_simplex_insertion(Simplex sigma) { if (sigma.dimension() < 1) return; @@ -385,7 +384,7 @@ Skeleton_blocker_complex::contract_edge(Vertex_handle a, Vert template void Skeleton_blocker_complex::get_blockers_to_be_added_after_contraction(Vertex_handle a, - Vertex_handle b, std::set& blockers_to_add) { + Vertex_handle b, std::set& blockers_to_add) { blockers_to_add.clear(); typedef Skeleton_blocker_link_complex > LinkComplexType; diff --git a/src/Skeleton_blocker/test/TestGeometricComplex.cpp b/src/Skeleton_blocker/test/TestGeometricComplex.cpp index 9edb13fe..102162c5 100644 --- a/src/Skeleton_blocker/test/TestGeometricComplex.cpp +++ b/src/Skeleton_blocker/test/TestGeometricComplex.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp index 76736240..6646734d 100644 --- a/src/Skeleton_blocker/test/TestSimplifiable.cpp +++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -20,14 +20,12 @@ * along with this program. If not, see . */ - #include #include #include #include #include #include "gudhi/Test.h" -//#include "Skeleton_blocker/Simplex.h" #include "gudhi/Skeleton_blocker.h" @@ -406,11 +404,11 @@ int main(int argc, char *argv[]) { tests_simplifiable_complex.add("Test collapse 2", test_collapse2); tests_simplifiable_complex.add("Test collapse 3", test_collapse3); - tests_simplifiable_complex.add("Test add edge",test_add_edge); + tests_simplifiable_complex.add("Test add edge", test_add_edge); tests_simplifiable_complex.add("Test add simplex", test_add_simplex); tests_simplifiable_complex.add("Test add simplex2", test_add_simplex2); - tests_simplifiable_complex.add("Test add simplex3",test_add_simplex3); - tests_simplifiable_complex.add("Test add simplex4",test_add_simplex4); + tests_simplifiable_complex.add("Test add simplex3", test_add_simplex3); + tests_simplifiable_complex.add("Test add simplex4", test_add_simplex4); tests_simplifiable_complex.run(); diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp index 6e891483..f61cffac 100644 --- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp +++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp @@ -4,7 +4,7 @@ * * Author(s): David Salinas * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 @@ -27,10 +27,6 @@ #include "gudhi/Debug_utils.h" #include "gudhi/Test.h" #include "gudhi/Skeleton_blocker.h" -//#include "gudhi/Skeleton_blocker_link_complex.h" -//#include "gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h" -//#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h" -//#include "gudhi/Skeleton_blocker/internal/Trie.h" using namespace std; @@ -946,7 +942,4 @@ int main(int argc, char *argv[]) { } else { return EXIT_FAILURE; } - - // test_iterator_simplices(); } - -- cgit v1.2.3 From 865b64d6b006d7ce8d6ac179ea4df3dbddb8d85f Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 15 Sep 2016 15:04:01 +0000 Subject: Fix cpplint warnings git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1503 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: b4e1ec1b6cc95a6a7207e68fb31e064c0e3bd065 --- src/Simplex_tree/doc/Intro_simplex_tree.h | 3 +- .../example/Skeleton_blocker_from_simplices.cpp | 9 +- .../example/Skeleton_blocker_iteration.cpp | 8 +- .../example/Skeleton_blocker_link.cpp | 20 ++-- .../include/gudhi/Skeleton_blocker.h | 11 +- .../Skeleton_blocker_simple_traits.h | 1 - .../include/gudhi/Skeleton_blocker/internal/Trie.h | 3 - .../Skeleton_blockers_blockers_iterators.h | 2 - .../Skeleton_blockers_simplices_iterators.h | 6 +- .../Skeleton_blockers_triangles_iterators.h | 8 +- .../include/gudhi/Skeleton_blocker_complex.h | 6 +- .../include/gudhi/Skeleton_blocker_link_complex.h | 4 +- .../gudhi/Skeleton_blocker_simplifiable_complex.h | 6 +- src/Skeleton_blocker/test/TestGeometricComplex.cpp | 26 ++--- src/Skeleton_blocker/test/TestSimplifiable.cpp | 111 ++++++++++----------- .../test/TestSkeletonBlockerComplex.cpp | 102 +++++++++---------- 16 files changed, 152 insertions(+), 174 deletions(-) diff --git a/src/Simplex_tree/doc/Intro_simplex_tree.h b/src/Simplex_tree/doc/Intro_simplex_tree.h index ddf9ad22..be061785 100644 --- a/src/Simplex_tree/doc/Intro_simplex_tree.h +++ b/src/Simplex_tree/doc/Intro_simplex_tree.h @@ -28,6 +28,7 @@ namespace Gudhi { /** \defgroup simplex_tree Filtered Complexes + * @{ * \author Clément Maria * * A simplicial complex \f$\mathbf{K}\f$ on a set of vertices \f$V = \{1, \cdots ,|V|\}\f$ is a collection of @@ -76,7 +77,7 @@ Number of vertices = 10 Number of simplices = 98 \endcode * compact and harder to construct from scratch. * * \copyright GNU General Public License v3. - * @{ + * @} */ } // namespace Gudhi diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp index 5f89536b..076c6a53 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp @@ -29,11 +29,8 @@ #include #include -using namespace std; -using namespace Gudhi; -using namespace skeleton_blocker; - -typedef Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Simplex Simplex; @@ -47,7 +44,7 @@ int main(int argc, char *argv[]) { simplices.push_back(Simplex(Vertex_handle(3), Vertex_handle(0), Vertex_handle(1))); // get complex from top faces - Complex complex(make_complex_from_top_faces(simplices.begin(), simplices.end())); + Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); std::cout << "Simplices:" << std::endl; diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp index 7df0e3c9..6a1bc480 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp @@ -30,12 +30,8 @@ #include #include - -using namespace std; -using namespace Gudhi; -using namespace skeleton_blocker; - -typedef Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Simplex Simplex; diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp index e2a04d75..58322038 100644 --- a/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp +++ b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp @@ -28,11 +28,8 @@ #include #include -using namespace std; -using namespace Gudhi; -using namespace skeleton_blocker; - -typedef Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Root_vertex_handle Root_vertex_handle; typedef Complex::Simplex Simplex; @@ -47,25 +44,26 @@ int main(int argc, char *argv[]) { Simplex tetrahedron(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); complex.add_simplex(tetrahedron); - cout << "complex:" << complex.to_string() << endl; + std::cout << "complex:" << complex.to_string() << std::endl; // build the link of vertex 1, eg a triangle {0,2,3} auto link = complex.link(Vertex_handle(1)); - cout << "link:" << link.to_string() << endl; + std::cout << "link:" << link.to_string() << std::endl; // Internally link is a subcomplex of 'complex' and its vertices are stored in a vector. // They can be accessed via Vertex_handle(x) where x is an index of the vector. // In that example, link has three vertices and thus it contains only // Vertex_handle(0),Vertex_handle(1) and Vertex_handle(2) are). for (int i = 0; i < 5; ++i) - cout << "link.contains_vertex(Vertex_handle(" << i << ")):" << link.contains_vertex(Vertex_handle(i)) << endl; - cout << endl; + std::cout << "link.contains_vertex(Vertex_handle(" << i << ")):" << link.contains_vertex(Vertex_handle(i)) << + std::endl; + std::cout << std::endl; // To access to the initial vertices eg (0,1,2,3,4), Root_vertex_handle must be used. // For instance, to test if the link contains the vertex that was labeled i: for (int i = 0; i < 5; ++i) - cout << "link.contains_vertex(Root_vertex_handle(" << i << ")):" << - link.contains_vertex(Root_vertex_handle(i)) << endl; + std::cout << "link.contains_vertex(Root_vertex_handle(" << i << ")):" << + link.contains_vertex(Root_vertex_handle(i)) << std::endl; return EXIT_SUCCESS; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h index 85fada4f..bd907131 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h @@ -37,7 +37,8 @@ namespace Gudhi { namespace skeleton_blocker { -/** \defgroup skbl Skeleton-Blocker +/** \defgroup skbl Skeleton-Blocker +@{ \author David Salinas @@ -236,12 +237,12 @@ The author wishes to thank Dominique Attali and André Lieutier for their collaboration to write the two initial papers \cite socg_blockers_2011,\cite blockers2012 about this data-structure - and also Dominique for leaving him use a prototype. + and also Dominique for leaving him use a prototype. -\copyright GNU General Public License v3. - */ -/** @} */ // end defgroup +\copyright GNU General Public License v3. + +@} */ } // namespace skeleton_blocker diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h index 469717ae..3835cf77 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h @@ -148,7 +148,6 @@ struct Skeleton_blocker_simple_traits { int index_; public: - Graph_edge() : a_(-1), b_(-1), diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h index ccc7c36b..b0ee35f5 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h @@ -45,7 +45,6 @@ struct Trie { const Trie* parent_; public: - Trie() : parent_(0) { } Trie(Vertex_handle v_) : v(v_), parent_(0) { } @@ -80,7 +79,6 @@ struct Trie { private: // go down recursively in the tree while advancing the simplex iterator. // when it reaches a leaf, it inserts the remaining that is not present - void add_simplex_helper(Simplex_vertex_const_iterator s_it, Simplex_vertex_const_iterator s_end) { assert(*s_it == v); ++s_it; @@ -106,7 +104,6 @@ struct Trie { } public: - /** * adds the simplex to the trie */ diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h index 4049fb0b..d2fff960 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h @@ -47,7 +47,6 @@ ReturnType MapIteratorType end_of_map; public: - Blocker_iterator_internal() : current_position() { } Blocker_iterator_internal(MapIteratorType position, MapIteratorType end_of_map_) : @@ -66,7 +65,6 @@ ReturnType } private: - /** * Let the current pair be (v,sigma) where v is a vertex and sigma is a blocker. * If v is not the first vertex of sigma then we already have seen sigma as a blocker diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h index c9482263..20d5600c 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h @@ -69,7 +69,8 @@ public boost::iterator_facade < Simplex_around_vertex_iterator link_v; std::shared_ptr trie; - std::list nodes_to_be_seen; // todo deque + // TODO(DS): use a deque instead + std::list nodes_to_be_seen; public: Simplex_around_vertex_iterator() : complex(0) { } @@ -161,7 +162,8 @@ public boost::iterator_facade < Simplex_around_vertex_iteratorvertex_range().begin()), - current_triangle_(complex, *current_vertex_), // xxx this line is problematic is the complex is empty + current_triangle_(complex, *current_vertex_), // this line is problematic is the complex is empty is_end_(false) { assert(!complex->empty()); gotoFirstTriangle(); @@ -185,8 +185,10 @@ typename SkeletonBlockerComplex::Simplex const // goto the next vertex that has a triangle pending or the // end vertex iterator if none exists void goto_next_vertex() { - assert(current_triangle_.finished()); // we mush have consume all triangles passing through the vertex - assert(!is_finished()); // we must not be done + // we must have consume all triangles passing through the vertex + assert(current_triangle_.finished()); + // we must not be done + assert(!is_finished()); ++current_vertex_; diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h index c1a0cf2d..4f052ba5 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h @@ -104,8 +104,8 @@ class Skeleton_blocker_complex { typedef typename Simplex::Simplex_vertex_const_iterator Simplex_handle_iterator; protected: - typedef typename boost::adjacency_list Graph; // todo/remark : edges are not sorted, it heavily penalizes computation for SuperiorLink // (eg Link with greater vertices) @@ -445,7 +445,7 @@ class Skeleton_blocker_complex { boost::optional res; int num_vertices = boost::num_vertices(skeleton); if (id.vertex < num_vertices) - res = Vertex_handle(id.vertex); // xxx + res = Vertex_handle(id.vertex); return res; } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h index 906d3e86..4db075b0 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h @@ -201,8 +201,8 @@ ComplexType> { * corresponding address in 'other_complex'. * It assumes that other_complex have a vertex 'this.get_id(address)' */ - boost::optional give_equivalent_vertex( - const ComplexType & other_complex, Vertex_handle address) const { + boost::optional give_equivalent_vertex(const ComplexType & other_complex, + Vertex_handle address) const { Root_vertex_handle id((*this)[address].get_id()); return other_complex.get_address(id); } diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h index fcb6bafe..544e02e8 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h @@ -146,8 +146,7 @@ void Skeleton_blocker_complex::remove_star(Vertex_handle v) { * whenever the dimension of tau is at least 2. */ template -void Skeleton_blocker_complex::update_blockers_after_remove_star_of_vertex_or_edge( - const Simplex& simplex_to_be_removed) { +void Skeleton_blocker_complex::update_blockers_after_remove_star_of_vertex_or_edge(const Simplex& simplex_to_be_removed) { std::list blockers_to_update; if (simplex_to_be_removed.empty()) return; @@ -384,7 +383,8 @@ Skeleton_blocker_complex::contract_edge(Vertex_handle a, Vert template void Skeleton_blocker_complex::get_blockers_to_be_added_after_contraction(Vertex_handle a, - Vertex_handle b, std::set& blockers_to_add) { + Vertex_handle b, + std::set& blockers_to_add) { blockers_to_add.clear(); typedef Skeleton_blocker_link_complex > LinkComplexType; diff --git a/src/Skeleton_blocker/test/TestGeometricComplex.cpp b/src/Skeleton_blocker/test/TestGeometricComplex.cpp index 102162c5..c5351b04 100644 --- a/src/Skeleton_blocker/test/TestGeometricComplex.cpp +++ b/src/Skeleton_blocker/test/TestGeometricComplex.cpp @@ -25,26 +25,22 @@ #include #include #include -#include "gudhi/Test.h" -#include "gudhi/Skeleton_blocker.h" +#include +#include -using namespace std; -using namespace Gudhi; -using namespace skeleton_blocker; - struct Geometry_trait { typedef std::vector Point; }; typedef Geometry_trait::Point Point; -typedef Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; -typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; typedef Complex::Vertex_handle Vertex_handle; bool test_constructor1() { Complex complex; - Skeleton_blocker_off_reader off_reader("test2.off", complex); + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); if (!off_reader.is_valid()) { std::cerr << "Unable to read file" << std::endl; return false; @@ -60,19 +56,19 @@ bool test_constructor1() { if (complex.num_vertices() != 7 || complex.num_edges() != 12 || complex.num_triangles() != 6) return false; - Skeleton_blocker_off_writer off_writer("tmp.off", complex); + Gudhi::skeleton_blocker::Skeleton_blocker_off_writer off_writer("tmp.off", complex); Complex same; - Skeleton_blocker_off_reader off_reader2("tmp.off", same); + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader2("tmp.off", same); - std::cout << "\ncomplex:" << complex.to_string() << endl; - std::cout << "\nsame:" << same.to_string() << endl; + std::cout << "\ncomplex:" << complex.to_string() << std::endl; + std::cout << "\nsame:" << same.to_string() << std::endl; return (complex == same); } bool test_constructor2() { Complex complex; - Skeleton_blocker_off_reader off_reader("test2.off", complex); + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); if (!off_reader.is_valid()) { std::cerr << "Unable to read file" << std::endl; return false; @@ -89,7 +85,7 @@ bool test_constructor2() { auto link_0 = complex.abstract_link(Vertex_handle(0)); - std::cout << "\n link(0):" << link_0.to_string() << endl; + std::cout << "\n link(0):" << link_0.to_string() << std::endl; auto link_geometric_0 = complex.link(Vertex_handle(0)); diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp index 6646734d..b5384318 100644 --- a/src/Skeleton_blocker/test/TestSimplifiable.cpp +++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp @@ -25,21 +25,16 @@ #include #include #include -#include "gudhi/Test.h" -#include "gudhi/Skeleton_blocker.h" +#include +#include -using namespace std; - -using namespace Gudhi; - -using namespace skeleton_blocker; - template class Skeleton_blocker_sub_complex; -typedef Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Root_vertex_handle Root_vertex_handle; -typedef Skeleton_blocker_simplex Simplex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simplex Simplex; // true iff v \in complex bool assert_vertex(Complex &complex, Vertex_handle v) { @@ -80,12 +75,12 @@ bool test_contraction1() { static_cast (y))); // Print result - cerr << "complex before complex" << complex.to_string() << endl; + std::cerr << "complex before complex" << complex.to_string() << std::endl; - cerr << endl << endl; + std::cerr << std::endl << std::endl; complex.contract_edge(static_cast (a), static_cast (b)); // Print result - cerr << "ContractEdge(0,1)\n"; + std::cerr << "ContractEdge(0,1)\n"; PRINT(complex.to_string()); // verification @@ -120,13 +115,13 @@ bool test_contraction2() { complex.add_blocker(blocker); // Print result - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; complex.contract_edge(static_cast (a), static_cast (b)); - cerr << "complex.ContractEdge(a,b)" << complex.to_string(); + std::cerr << "complex.ContractEdge(a,b)" << complex.to_string(); - cerr << endl << endl; + std::cerr << std::endl << std::endl; // there should be one blocker (a,c,d,e) in the complex bool test; @@ -145,8 +140,8 @@ bool test_link_condition1() { // Print result - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; bool weak_link_condition = complex.link_condition(Vertex_handle(1), Vertex_handle(2), true); @@ -162,17 +157,17 @@ bool test_collapse0() { complex.add_edge_without_blockers(static_cast (2), static_cast (4)); complex.add_edge_without_blockers(static_cast (3), static_cast (4)); // Print result - cerr << "initial complex :\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex :\n" << complex.to_string(); + std::cerr << std::endl << std::endl; Simplex simplex_123(static_cast (1), static_cast (2), static_cast (3)); complex.remove_star(simplex_123); - cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cerr << std::endl << std::endl; // verification bool blocker123_here = complex.contains_blocker(simplex_123); - cerr << "----> Ocomplex \n"; + std::cerr << "----> Ocomplex \n"; return blocker123_here; } @@ -181,18 +176,18 @@ bool test_collapse1() { build_complete(4, complex); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); // Print result - cerr << "initial complex :\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex :\n" << complex.to_string(); + std::cerr << std::endl << std::endl; Simplex simplex_123(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); complex.remove_star(simplex_123); - cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cerr << std::endl << std::endl; // verification bool res = complex.contains_blocker(simplex_123); res = res && complex.num_blockers() == 1; - cerr << "----> Ocomplex \n"; + std::cerr << "----> Ocomplex \n"; return res; } @@ -205,13 +200,13 @@ bool test_collapse2() { complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); // Print result - cerr << "initial complex :\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex :\n" << complex.to_string(); + std::cerr << std::endl << std::endl; Simplex sigma(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); complex.remove_star(sigma); - cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cerr << std::endl << std::endl; // verification bool blocker_removed = !complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); @@ -228,11 +223,11 @@ bool test_collapse3() { complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); // Print result - cerr << "initial complex:\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex:\n" << complex.to_string(); + std::cerr << std::endl << std::endl; complex.remove_star(static_cast (2)); - cerr << "complex after remove star of 2:\n" << complex.to_string(); + std::cerr << "complex after remove star of 2:\n" << complex.to_string(); bool blocker134_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4))); bool blocker1234_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); @@ -243,11 +238,11 @@ bool test_add_simplex() { Complex complex(4); build_complete(4, complex); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - cerr << "initial complex:\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex:\n" << complex.to_string(); + std::cerr << std::endl << std::endl; complex.add_simplex(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - cerr << "complex after add_simplex:\n" << complex.to_string(); + std::cerr << "complex after add_simplex:\n" << complex.to_string(); return complex.num_blockers() == 1 && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); } @@ -256,8 +251,8 @@ bool test_add_simplex2() { Complex complex; build_complete(4, complex); // Print result - cerr << "initial complex:\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex:\n" << complex.to_string(); + std::cerr << std::endl << std::endl; Complex copy(complex.num_vertices()); @@ -273,7 +268,7 @@ bool test_add_simplex2() { } - cerr << "complex after add_simplex:\n" << copy.to_string(); + std::cerr << "complex after add_simplex:\n" << copy.to_string(); return complex.num_blockers() == copy.num_blockers() && @@ -288,11 +283,11 @@ bool test_add_simplex3() { Simplex sigma(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); complex.add_blocker(sigma); // Print result - cerr << "initial complex:\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex:\n" << complex.to_string(); + std::cerr << std::endl << std::endl; complex.add_simplex(sigma); //should create two blockers 0123 and 0124 - cerr << "complex after adding simplex 012:\n" << complex.to_string(); + std::cerr << "complex after adding simplex 012:\n" << complex.to_string(); return complex.num_blockers() == 2 && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))) && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(4))); @@ -334,11 +329,11 @@ bool test_add_edge() { complex.add_edge(Vertex_handle(i), Vertex_handle((i + 1) % 4)); // Print result - cerr << "initial complex:\n" << complex.to_string(); - cerr << endl << endl; + std::cerr << "initial complex:\n" << complex.to_string(); + std::cerr << std::endl << std::endl; complex.add_edge(Vertex_handle(1), Vertex_handle(3)); //should create two blockers 013 and 012 - cerr << "complex after adding edge 13:\n" << complex.to_string(); + std::cerr << "complex after adding edge 13:\n" << complex.to_string(); return complex.num_blockers() == 2 && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))) && complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); @@ -355,12 +350,12 @@ bool test_remove_popable_blockers() { complex.add_blocker(sigma1); complex.add_blocker(sigma2); - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; - cerr << "complex.RemovePopableBlockers();" << endl; + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; + std::cerr << "complex.RemovePopableBlockers();" << std::endl; complex.remove_popable_blockers(); - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; bool test1 = (complex.num_blockers() == 1); @@ -380,13 +375,13 @@ bool test_remove_popable_blockers() { complex.add_blocker(sigma1); complex.add_blocker(sigma2); - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; - cerr << "complex.RemovePopableBlockers();" << endl; + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; + std::cerr << "complex.RemovePopableBlockers();" << std::endl; complex.remove_popable_blockers(); - cerr << "complex complex" << complex.to_string(); + std::cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; + std::cerr << std::endl << std::endl; bool test2 = (complex.num_blockers() == 0); return test1&&test2; } diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp index f61cffac..c74f591e 100644 --- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp +++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp @@ -24,18 +24,14 @@ #include #include #include -#include "gudhi/Debug_utils.h" -#include "gudhi/Test.h" -#include "gudhi/Skeleton_blocker.h" - -using namespace std; - -using namespace Gudhi; - -using namespace skeleton_blocker; - - -typedef Skeleton_blocker_complex Complex; +#include +#include +#include + +template class Skeleton_blocker_sub_complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_link_complex Skeleton_blocker_link_complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Root_vertex_handle Root_vertex_handle; typedef Complex::Simplex Simplex; @@ -120,10 +116,10 @@ bool test_num_simplices() { bool test_iterator_vertices1() { int n = 10; Complex complex(10); - cerr << "complex.num_vertices():" << complex.num_vertices() << endl; + std::cerr << "complex.num_vertices():" << complex.num_vertices() << std::endl; int num_vertex_seen = 0; for (auto vi : complex.vertex_range()) { - cerr << "vertex:" << vi << endl; + std::cerr << "vertex:" << vi << std::endl; ++num_vertex_seen; } return num_vertex_seen == n; @@ -133,11 +129,11 @@ bool test_iterator_vertices2() { int n = 10; Complex complex; build_complete(10, complex); - cerr << "complex.num_vertices():" << complex.num_vertices() << endl; - cerr << "complex.num_edges():" << complex.num_edges() << endl; + std::cerr << "complex.num_vertices():" << complex.num_vertices() << std::endl; + std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; int num_vertex_seen = 0; for (auto vi : complex.vertex_range(Vertex_handle(2))) { - cerr << "vertex:" << vi << endl; + std::cerr << "vertex:" << vi << std::endl; ++num_vertex_seen; } std::cerr << "num_vertex_seen:" << num_vertex_seen << std::endl; @@ -152,10 +148,10 @@ bool test_iterator_edge() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - cerr << "complex.num_edges():" << complex.num_edges() << endl; + std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; int num_edges_seen = 0; for (auto edge : complex.edge_range()) { - cerr << "edge :" << complex[edge] << endl; + std::cerr << "edge :" << complex[edge] << std::endl; ++num_edges_seen; } @@ -170,10 +166,10 @@ bool test_iterator_edge2() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - cerr << "complex.num_edges():" << complex.num_edges() << endl; + std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; int num_neigbors_seen = 0; for (auto neighbor : complex.vertex_range(Vertex_handle(2))) { - cerr << "neighbor" << neighbor << endl; + std::cerr << "neighbor" << neighbor << std::endl; ++num_neigbors_seen; } return num_neigbors_seen == 8; @@ -187,7 +183,7 @@ bool test_iterator_edge3() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - cerr << "complex.num_edges():" << complex.num_edges() << endl; + std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; int num_neigbors_seen = 0; for (auto edge : complex.edge_range(Vertex_handle(2))) { std::cerr << edge << std::endl; @@ -432,7 +428,7 @@ bool test_link0() { complex.add_edge_without_blockers(Vertex_handle(b), Vertex_handle(c)); complex.add_edge_without_blockers(Vertex_handle(c), Vertex_handle(d)); Simplex alpha = Simplex(Vertex_handle(c)); - Skeleton_blocker_link_complex L(complex, alpha); + Skeleton_blocker_link_complex L(complex, alpha); auto L2 = complex.link(alpha); if (L != L2) return false; @@ -461,7 +457,7 @@ bool test_link1() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); } Simplex alpha(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); + Skeleton_blocker_link_complex L(complex, alpha); // Complexes built auto L2 = complex.link(alpha); @@ -479,7 +475,7 @@ bool test_link1() { simplex.add_vertex(Root_vertex_handle(13)); bool test6(L.get_simplex_address(simplex)); bool test7 = L.contains(*(L.get_simplex_address(simplex))); - cerr << "----> Ocomplex \n"; + std::cerr << "----> Ocomplex \n"; return test1 && test2 && test3 && test4 && test5 && test6&&test7; } @@ -499,13 +495,13 @@ bool test_link2() { } complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(13))); alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); + Skeleton_blocker_link_complex L(complex, alpha); // Complexes built // Print result - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; - cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; + std::cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); auto L2 = complex.link(alpha); if (L != L2) return false; @@ -522,7 +518,7 @@ bool test_link2() { simplex.add_vertex(Root_vertex_handle(11)); simplex.add_vertex(Root_vertex_handle(13)); bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex))); - cerr << "----> Ocomplex \n"; + std::cerr << "----> Ocomplex \n"; return test1 && test2 && test3 && test4 && test5&&test6; } @@ -541,13 +537,13 @@ bool test_link3() { } complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); + Skeleton_blocker_link_complex L(complex, alpha); // Complexes built // Print result - cerr << "complex complex" << complex.to_string(); - cerr << endl << endl; - cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + std::cerr << "complex complex" << complex.to_string(); + std::cerr << std::endl << std::endl; + std::cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); auto L2 = complex.link(alpha); if (L != L2) return false; @@ -577,7 +573,7 @@ bool test_link4() { } complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12), Vertex_handle(13))); Simplex alpha(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); + Skeleton_blocker_link_complex L(complex, alpha); // Complexes built // verification @@ -591,7 +587,7 @@ bool test_link4() { simplex.add_vertex(Root_vertex_handle(11)); simplex.add_vertex(Root_vertex_handle(13)); bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex))); - cerr << "----> Ocomplex \n"; + std::cerr << "----> Ocomplex \n"; return test1 && test2 && test3 && test4 && test5&&test6; } @@ -605,11 +601,11 @@ bool test_link5() { Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - Skeleton_blocker_link_complex L(complex, alpha); // Complexes built + Skeleton_blocker_link_complex L(complex, alpha); // Complexes built // Print result PRINT(complex.to_string()); - cerr << endl << endl; + std::cerr << std::endl << std::endl; PRINT(L.to_string()); // verification @@ -624,13 +620,13 @@ bool test_link6() { Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - Skeleton_blocker_link_complex link_blocker_alpha; + Skeleton_blocker_link_complex link_blocker_alpha; build_link_of_blocker(complex, alpha, link_blocker_alpha); // Print result PRINT(complex.to_string()); - cerr << endl << endl; + std::cerr << std::endl << std::endl; PRINT(link_blocker_alpha.to_string()); // verification @@ -653,7 +649,7 @@ bool test_link7() { Simplex alpha(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5)); - Skeleton_blocker_link_complex link_blocker_alpha; + Skeleton_blocker_link_complex link_blocker_alpha; build_link_of_blocker(complex, alpha, link_blocker_alpha); @@ -661,10 +657,10 @@ bool test_link7() { // Print result PRINT(complex.to_string()); - cerr << endl << endl; + std::cerr << std::endl << std::endl; DBGVALUE(link_blocker_alpha.to_string()); - Skeleton_blocker_link_complex link_blocker_alpha_cpy = link_blocker_alpha; + Skeleton_blocker_link_complex link_blocker_alpha_cpy = link_blocker_alpha; DBGVALUE(link_blocker_alpha_cpy.to_string()); @@ -684,7 +680,7 @@ bool test_link7() { } template -void add_triangle_edges(int a, int b, int c, list& simplices) { +void add_triangle_edges(int a, int b, int c, std::list& simplices) { typedef SimplexHandle Simplex; typedef typename SimplexHandle::Vertex_handle Vertex_handle; @@ -694,14 +690,14 @@ void add_triangle_edges(int a, int b, int c, list& simplices) { } template -void add_triangle(int a, int b, int c, list& simplices) { +void add_triangle(int a, int b, int c, std::list& simplices) { typedef SimplexHandle Simplex; typedef typename SimplexHandle::Vertex_handle Vertex_handle; simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b), Vertex_handle(c))); } bool test_constructor() { - list simplices; + std::list simplices; simplices.push_back(Simplex(Vertex_handle(0))); simplices.push_back(Simplex(Vertex_handle(1))); @@ -732,8 +728,8 @@ bool test_constructor() { return ( complex.num_vertices() == 6 && complex.num_edges() == 10 && complex.num_blockers() == 2); } -list subfaces(Simplex top_face) { - list res; +std::list subfaces(Simplex top_face) { + std::list res; if (top_face.dimension() == -1) return res; if (top_face.dimension() == 0) { res.push_back(top_face); @@ -742,7 +738,7 @@ list subfaces(Simplex top_face) { Vertex_handle first_vertex = top_face.first_vertex(); top_face.remove_vertex(first_vertex); res = subfaces(top_face); - list copy = res; + std::list copy = res; for (auto& simplex : copy) { simplex.add_vertex(first_vertex); } @@ -757,7 +753,7 @@ bool test_constructor2() { for (int i = 0; i < 5; ++i) simplex.add_vertex(static_cast (i)); - list simplices(subfaces(simplex)); + std::list simplices(subfaces(simplex)); simplices.remove(simplex); Complex complex(simplices.begin(), simplices.end()); @@ -765,7 +761,7 @@ bool test_constructor2() { PRINT(complex.to_string()); for (auto b : complex.const_blocker_range()) { - cout << "b:" << b << endl; + std::cout << "b:" << b << std::endl; } return ( complex.num_vertices() == 5 && complex.num_edges() == 10 && complex.num_blockers() == 1); @@ -873,7 +869,7 @@ bool test_constructor7() { simplices.push_back(Sh(Vh(3), Vh(0), Vh(1))); //get complex from top faces - Complex complex(make_complex_from_top_faces(simplices.begin(), simplices.end())); + Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); DBGVALUE(complex.to_string()); @@ -895,7 +891,7 @@ bool test_constructor8() { simplices.push_back(Sh(Vh(2), Vh(3))); //get complex from top faces - Complex complex(make_complex_from_top_faces(simplices.begin(), simplices.end())); + Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); DBGVALUE(complex.to_string()); -- cgit v1.2.3 From 1b5c8012bf843edcf4ae927fb0b46a2a42dfd3d6 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 15 Sep 2016 15:19:44 +0000 Subject: fix cpplint git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1504 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: b0036e77dafec3301dd9f130265e1513a82cddf4 --- src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h | 2 +- .../Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h index 6017df1a..477464c4 100644 --- a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h +++ b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h @@ -34,7 +34,7 @@ namespace skeleton_blocker { * Graph_edge must specify how to access to an index. * */ -//todo the index is just for contraction, to remove +// TODO(DS): the index is just for contraction, to remove template struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS { diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h index 20d5600c..2acdb555 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h @@ -337,7 +337,7 @@ public boost::iterator_facade < Simplex_coboundary_iteratorvertex_range(); current_vertex = link_vertex_range.begin(); -- cgit v1.2.3 From ef4ee52fdc6c52629c8c3959c7a15b5280a40373 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 15 Sep 2016 15:27:51 +0000 Subject: remove concept dir for Contraction (empty) remove unused using namespace git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1505 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 32785bb7a8062d828069f22b0d410afa3e57f702 --- src/Contraction/example/Garland_heckbert.cpp | 1 - src/Contraction/example/Rips_contraction.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Contraction/example/Garland_heckbert.cpp b/src/Contraction/example/Garland_heckbert.cpp index cbc46e91..5347830c 100644 --- a/src/Contraction/example/Garland_heckbert.cpp +++ b/src/Contraction/example/Garland_heckbert.cpp @@ -35,7 +35,6 @@ #include "Garland_heckbert/Error_quadric.h" -using namespace std; using namespace Gudhi; using namespace skeleton_blocker; using namespace contraction; diff --git a/src/Contraction/example/Rips_contraction.cpp b/src/Contraction/example/Rips_contraction.cpp index 978dd1cb..7f19e239 100644 --- a/src/Contraction/example/Rips_contraction.cpp +++ b/src/Contraction/example/Rips_contraction.cpp @@ -27,7 +27,6 @@ #include #include -using namespace std; using namespace Gudhi; using namespace skeleton_blocker; using namespace contraction; -- cgit v1.2.3 From 63f15e8f3cab97b12539ad82c4423de6d361204a Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 16 Sep 2016 14:34:07 +0000 Subject: Rewrite tests wit BOOST tests git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1506 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 5afe034e18381c4921987457fd75f15c21b3aed1 --- src/Skeleton_blocker/test/TestGeometricComplex.cpp | 83 ++-- src/Skeleton_blocker/test/TestSimplifiable.cpp | 277 +++++------ .../test/TestSkeletonBlockerComplex.cpp | 540 ++++++++------------- 3 files changed, 373 insertions(+), 527 deletions(-) diff --git a/src/Skeleton_blocker/test/TestGeometricComplex.cpp b/src/Skeleton_blocker/test/TestGeometricComplex.cpp index c5351b04..d035b2c3 100644 --- a/src/Skeleton_blocker/test/TestGeometricComplex.cpp +++ b/src/Skeleton_blocker/test/TestGeometricComplex.cpp @@ -25,9 +25,13 @@ #include #include #include -#include -#include +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_geometric_complex" +#include +#include + +#include struct Geometry_trait { typedef std::vector Point; @@ -37,24 +41,22 @@ typedef Geometry_trait::Point Point; typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; typedef Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; typedef Complex::Vertex_handle Vertex_handle; +typedef Complex_geometric_traits::Root_vertex_handle Root_vertex_handle; -bool test_constructor1() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_off_reader_writer) { Complex complex; Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); - if (!off_reader.is_valid()) { - std::cerr << "Unable to read file" << std::endl; - return false; - } - - + BOOST_CHECK(off_reader.is_valid()); + std::cout << "complex has " << complex.num_vertices() << " vertices, " << complex.num_blockers() << " blockers, " << - complex.num_edges() << " edges and" << + complex.num_edges() << " edges and " << complex.num_triangles() << " triangles."; - if (complex.num_vertices() != 7 || complex.num_edges() != 12 || complex.num_triangles() != 6) - return false; + BOOST_CHECK(complex.num_vertices() == 7); + BOOST_CHECK(complex.num_edges() == 12); + BOOST_CHECK(complex.num_triangles() == 6); Gudhi::skeleton_blocker::Skeleton_blocker_off_writer off_writer("tmp.off", complex); Complex same; @@ -63,31 +65,47 @@ bool test_constructor1() { std::cout << "\ncomplex:" << complex.to_string() << std::endl; std::cout << "\nsame:" << same.to_string() << std::endl; - return (complex == same); + BOOST_CHECK(complex == same); } -bool test_constructor2() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_abstract_link) { Complex complex; Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); - if (!off_reader.is_valid()) { - std::cerr << "Unable to read file" << std::endl; - return false; - } + BOOST_CHECK(off_reader.is_valid()); + std::cout << "complex has " << complex.num_vertices() << " vertices, " << complex.num_blockers() << " blockers, " << - complex.num_edges() << " edges and" << + complex.num_edges() << " edges and " << complex.num_triangles() << " triangles."; - if (complex.num_vertices() != 7 || complex.num_edges() != 12 || complex.num_triangles() != 6) - return false; + BOOST_CHECK(complex.num_vertices() == 7); + BOOST_CHECK(complex.num_edges() == 12); + BOOST_CHECK(complex.num_triangles() == 6); auto link_0 = complex.abstract_link(Vertex_handle(0)); - std::cout << "\n link(0):" << link_0.to_string() << std::endl; + BOOST_CHECK(link_0.num_vertices() == 2); + BOOST_CHECK(link_0.num_edges() == 1); + BOOST_CHECK(link_0.num_blockers() == 0); + + // Check the 2 link vertices + auto vertex_handle = link_0.vertex_range().begin(); + BOOST_CHECK(link_0[*vertex_handle].get_id() == Root_vertex_handle(1)); + vertex_handle++; + BOOST_CHECK(link_0[*(vertex_handle)].get_id() == Root_vertex_handle(4)); + + // Check the lonely link edge + auto edge_handle = link_0.edge_range().begin(); + BOOST_CHECK(link_0[*edge_handle].first() == Root_vertex_handle(1)); + BOOST_CHECK(link_0[*(edge_handle)].second() == Root_vertex_handle(4)); + auto link_geometric_0 = complex.link(Vertex_handle(0)); + std::cout << "\n link_geometric(0):" << link_geometric_0.to_string() << std::endl; + + BOOST_CHECK(link_0 == link_geometric_0); auto print_point = [&](Vertex_handle v) { for (auto x : link_geometric_0.point(v)) std::cout << x << " "; @@ -96,19 +114,12 @@ bool test_constructor2() { std::for_each(link_geometric_0.vertex_range().begin(), link_geometric_0.vertex_range().end(), print_point); - // for(auto v : link_geometric_0.vertex_range()) - // std::cout<<"point("< point_1 = {0,2,0}; + std::vector point_4 = {-1,1,0}; + BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_1); + vertex_handle++; + BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_4); - if (tests_geometric_complex.run()) - return EXIT_SUCCESS; - else - return EXIT_FAILURE; } diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp index b5384318..360b91db 100644 --- a/src/Skeleton_blocker/test/TestSimplifiable.cpp +++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp @@ -25,9 +25,13 @@ #include #include #include -#include -#include +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_simplifiable" +#include +#include + +#include template class Skeleton_blocker_sub_complex; typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; @@ -35,22 +39,7 @@ typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Root_vertex_handle Root_vertex_handle; typedef Gudhi::skeleton_blocker::Skeleton_blocker_simplex Simplex; -// true iff v \in complex - -bool assert_vertex(Complex &complex, Vertex_handle v) { - Simplex simplex(v); - bool test = complex.contains(simplex); - assert(test); - return test; -} - -// true iff the blocker (a,b,c) is in complex -bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) { - - return complex.contains_blocker(Simplex(*complex.get_address(a), *complex.get_address(b), *complex.get_address(c))); - //return complex.contains_blocker((a),(b),(c)); -} void build_complete(int n, Complex& complex) { complex.clear(); @@ -61,11 +50,8 @@ void build_complete(int n, Complex& complex) { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); } -bool test_contraction1() { - - enum { - a, b, x, y, z, n - }; +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction1) { + enum { a, b, x, y, z, n }; Complex complex(n); build_complete(n, complex); complex.remove_edge(static_cast (b), static_cast (z)); @@ -75,35 +61,35 @@ bool test_contraction1() { static_cast (y))); // Print result - std::cerr << "complex before complex" << complex.to_string() << std::endl; + std::cout << "complex before complex" << complex.to_string() << std::endl; - std::cerr << std::endl << std::endl; + std::cout << std::endl << std::endl; complex.contract_edge(static_cast (a), static_cast (b)); // Print result - std::cerr << "ContractEdge(0,1)\n"; + std::cout << "ContractEdge(0,1)\n"; PRINT(complex.to_string()); // verification for (int i = 0; i < 5; i++) - if (i != 1) assert_vertex(complex, static_cast (i)); - bool test1 = !complex.contains_edge(static_cast (a), static_cast (b)); - bool test2 = assert_blocker(complex, Root_vertex_handle(a), Root_vertex_handle(x), Root_vertex_handle(y)); - bool test3 = complex.num_edges() == 6; - bool test4 = complex.num_blockers() == 1; + if (i != 1) BOOST_CHECK(complex.contains(Simplex(static_cast (i)))); + BOOST_CHECK(!complex.contains_edge(static_cast (a), static_cast (b))); + + BOOST_CHECK(complex.contains_blocker(Simplex(*complex.get_address(Root_vertex_handle(a)), + *complex.get_address(Root_vertex_handle(x)), + *complex.get_address(Root_vertex_handle(y))))); + + BOOST_CHECK(complex.num_edges() == 6); + BOOST_CHECK(complex.num_blockers() == 1); Simplex sigma; sigma.add_vertex(static_cast (a)); sigma.add_vertex(static_cast (x)); sigma.add_vertex(static_cast (y)); sigma.add_vertex(static_cast (z)); - bool test5 = !(complex.contains(sigma)); - return test1 && test2 && test3 && test4&&test5; + BOOST_CHECK(!(complex.contains(sigma))); } -bool test_contraction2() { - - enum { - a, b, x, y, z, n - }; +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction2) { + enum { a, b, x, y, z, n }; Complex complex(n); build_complete(n, complex); complex.remove_edge(static_cast (b), static_cast (x)); @@ -115,83 +101,73 @@ bool test_contraction2() { complex.add_blocker(blocker); // Print result - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; complex.contract_edge(static_cast (a), static_cast (b)); - std::cerr << "complex.ContractEdge(a,b)" << complex.to_string(); + std::cout << "complex.ContractEdge(a,b)" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << std::endl << std::endl; // there should be one blocker (a,c,d,e) in the complex - bool test; - test = complex.contains_blocker(Simplex(static_cast (a), static_cast (x), - static_cast (y), static_cast (z))); - test = test && complex.num_blockers() == 1; - return test; + BOOST_CHECK(complex.contains_blocker(Simplex(static_cast (a), static_cast (x), + static_cast (y), static_cast (z)))); + BOOST_CHECK(complex.num_blockers() == 1); } -bool test_link_condition1() { - +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_link_condition1) { Complex complex(0); // Build the complexes build_complete(4, complex); complex.add_blocker(Simplex(static_cast (0), static_cast (1), static_cast (2))); - // Print result - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; - bool weak_link_condition = complex.link_condition(Vertex_handle(1), Vertex_handle(2), true); + BOOST_CHECK(complex.link_condition(Vertex_handle(1), Vertex_handle(2), true)); - bool strong_link_condition = complex.link_condition(Vertex_handle(1), Vertex_handle(2), false); - - return weak_link_condition && !strong_link_condition; + BOOST_CHECK(!complex.link_condition(Vertex_handle(1), Vertex_handle(2), false)); } -bool test_collapse0() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse0) { Complex complex(5); build_complete(4, complex); complex.add_vertex(); complex.add_edge_without_blockers(static_cast (2), static_cast (4)); complex.add_edge_without_blockers(static_cast (3), static_cast (4)); // Print result - std::cerr << "initial complex :\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; Simplex simplex_123(static_cast (1), static_cast (2), static_cast (3)); complex.remove_star(simplex_123); - std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; // verification - bool blocker123_here = complex.contains_blocker(simplex_123); - std::cerr << "----> Ocomplex \n"; - return blocker123_here; + BOOST_CHECK(complex.contains_blocker(simplex_123)); } -bool test_collapse1() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse1) { Complex complex(5); build_complete(4, complex); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); // Print result - std::cerr << "initial complex :\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; Simplex simplex_123(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); complex.remove_star(simplex_123); - std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; // verification - bool res = complex.contains_blocker(simplex_123); - res = res && complex.num_blockers() == 1; - std::cerr << "----> Ocomplex \n"; - return res; + BOOST_CHECK(complex.contains_blocker(simplex_123)); + BOOST_CHECK(complex.num_blockers() == 1); } -bool test_collapse2() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse2) { Complex complex(5); build_complete(4, complex); complex.add_vertex(); @@ -200,21 +176,21 @@ bool test_collapse2() { complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); // Print result - std::cerr << "initial complex :\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; Simplex sigma(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); complex.remove_star(sigma); - std::cerr << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; // verification - bool blocker_removed = !complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); - bool blocker123_here = complex.contains_blocker(sigma); - return blocker_removed && blocker123_here; + BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), + Vertex_handle(3), Vertex_handle(4)))); + BOOST_CHECK(complex.contains_blocker(sigma)); } -bool test_collapse3() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse3) { Complex complex(5); build_complete(4, complex); complex.add_vertex(); @@ -223,36 +199,37 @@ bool test_collapse3() { complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); // Print result - std::cerr << "initial complex:\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; complex.remove_star(static_cast (2)); - std::cerr << "complex after remove star of 2:\n" << complex.to_string(); + std::cout << "complex after remove star of 2:\n" << complex.to_string(); - bool blocker134_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4))); - bool blocker1234_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); - return blocker134_here && !blocker1234_here; + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4)))); + BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), + Vertex_handle(3), Vertex_handle(4)))); } -bool test_add_simplex() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex) { Complex complex(4); build_complete(4, complex); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - std::cerr << "initial complex:\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; complex.add_simplex(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - std::cerr << "complex after add_simplex:\n" << complex.to_string(); - return complex.num_blockers() == 1 - && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); + std::cout << "complex after add_simplex:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(3)))); } -bool test_add_simplex2() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex2) { Complex complex; build_complete(4, complex); // Print result - std::cerr << "initial complex:\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; Complex copy(complex.num_vertices()); @@ -267,33 +244,33 @@ bool test_add_simplex2() { copy.add_simplex(simplex); } + std::cout << "complex after add_simplex:\n" << copy.to_string(); - std::cerr << "complex after add_simplex:\n" << copy.to_string(); - - - return complex.num_blockers() == copy.num_blockers() && - complex.num_edges() == copy.num_edges() && - complex.num_vertices() == copy.num_vertices(); + BOOST_CHECK(complex.num_blockers() == copy.num_blockers()); + BOOST_CHECK(complex.num_edges() == copy.num_edges()); + BOOST_CHECK(complex.num_vertices() == copy.num_vertices()); } -bool test_add_simplex3() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex3) { Complex complex(5); build_complete(5, complex); complex.remove_edge(Vertex_handle(3), Vertex_handle(4)); Simplex sigma(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); complex.add_blocker(sigma); // Print result - std::cerr << "initial complex:\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; complex.add_simplex(sigma); //should create two blockers 0123 and 0124 - std::cerr << "complex after adding simplex 012:\n" << complex.to_string(); - return complex.num_blockers() == 2 - && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))) - && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(4))); + std::cout << "complex after adding simplex 012:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(3)))); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(4)))); } -bool test_add_simplex4() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex4) { int n = 6; Complex complex(n); @@ -306,40 +283,38 @@ bool test_add_simplex4() { complex.add_simplex(s); //at step i there is only blocker 0..i - if (i < 2 && complex.num_blockers() > 0) - return false; + BOOST_CHECK(!(i < 2 && complex.num_blockers() > 0)); if (i >= 2 && complex.num_blockers() != 1) { Simplex b; for (int k = 0; k < i; k++) b.add_vertex(Vertex_handle(i)); - if (!complex.contains_blocker(b)) - return false; + BOOST_CHECK(complex.contains_blocker(b)); } - TESTVALUE(complex.blockers_to_string()); } Simplex s; for (int k = 0; k < n; k++) s.add_vertex(Vertex_handle(k)); - return complex.num_blockers() == 1 && complex.contains_blocker(s); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.contains_blocker(s)); } -bool test_add_edge() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_edge) { Complex complex(4); for (unsigned i = 0u; i < 4; i++) complex.add_edge(Vertex_handle(i), Vertex_handle((i + 1) % 4)); // Print result - std::cerr << "initial complex:\n" << complex.to_string(); - std::cerr << std::endl << std::endl; + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; complex.add_edge(Vertex_handle(1), Vertex_handle(3)); //should create two blockers 013 and 012 - std::cerr << "complex after adding edge 13:\n" << complex.to_string(); - return complex.num_blockers() == 2 - && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))) - && complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); + std::cout << "complex after adding edge 13:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)))); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)))); } -bool test_remove_popable_blockers() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_remove_popable_blockers) { Complex complex; build_complete(4, complex); complex.add_vertex(); @@ -350,15 +325,14 @@ bool test_remove_popable_blockers() { complex.add_blocker(sigma1); complex.add_blocker(sigma2); - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; - std::cerr << "complex.RemovePopableBlockers();" << std::endl; + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "complex.RemovePopableBlockers();" << std::endl; complex.remove_popable_blockers(); - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; - - bool test1 = (complex.num_blockers() == 1); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + BOOST_CHECK(complex.num_blockers() == 1); // test 2 complex.clear(); @@ -375,41 +349,12 @@ bool test_remove_popable_blockers() { complex.add_blocker(sigma1); complex.add_blocker(sigma2); - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; - std::cerr << "complex.RemovePopableBlockers();" << std::endl; + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "complex.RemovePopableBlockers();" << std::endl; complex.remove_popable_blockers(); - std::cerr << "complex complex" << complex.to_string(); - - std::cerr << std::endl << std::endl; - bool test2 = (complex.num_blockers() == 0); - return test1&&test2; -} - -int main(int argc, char *argv[]) { - Tests tests_simplifiable_complex; - tests_simplifiable_complex.add("Test contraction 1", test_contraction1); - tests_simplifiable_complex.add("Test contraction 2", test_contraction2); - tests_simplifiable_complex.add("Test Link condition 1", test_link_condition1); - tests_simplifiable_complex.add("Test remove popable blockers", test_remove_popable_blockers); - - - tests_simplifiable_complex.add("Test collapse 0", test_collapse0); - tests_simplifiable_complex.add("Test collapse 1", test_collapse1); - tests_simplifiable_complex.add("Test collapse 2", test_collapse2); - tests_simplifiable_complex.add("Test collapse 3", test_collapse3); - - tests_simplifiable_complex.add("Test add edge", test_add_edge); - tests_simplifiable_complex.add("Test add simplex", test_add_simplex); - tests_simplifiable_complex.add("Test add simplex2", test_add_simplex2); - tests_simplifiable_complex.add("Test add simplex3", test_add_simplex3); - tests_simplifiable_complex.add("Test add simplex4", test_add_simplex4); - - - tests_simplifiable_complex.run(); + std::cout << "complex complex" << complex.to_string(); - if (tests_simplifiable_complex.run()) - return EXIT_SUCCESS; - else - return EXIT_FAILURE; + std::cout << std::endl << std::endl; + BOOST_CHECK(complex.num_blockers() == 0); } diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp index c74f591e..f94c756e 100644 --- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp +++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp @@ -24,8 +24,12 @@ #include #include #include -#include -#include + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_complex" +#include +#include + #include template class Skeleton_blocker_sub_complex; @@ -39,8 +43,6 @@ typedef Complex::Root_simplex_handle Root_simplex_handle; typedef Simplex::Simplex_vertex_const_iterator Simplex_vertex_const_iterator; typedef Complex::Edge_handle Edge_handle; -// true if v in complex - bool assert_vertex(Complex &complex, Vertex_handle v) { //assert(complex.contains(v)); return complex.contains(static_cast (v)); @@ -72,75 +74,59 @@ void build_complete(int n, Complex& complex) { for (int i = 0; i < n; i++) complex.add_vertex(); - // for(int i=n-1;i>=0;i--) - // for(int j=i-1;j>=0;j--) - // complex.add_edge_without_blockers(Vertex_handle(i),Vertex_handle(j)); - for (int i = 0; i < n; i++) for (int j = 0; j < i; j++) complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); } -bool test_simplex() { - // PRINT("test simplex"); +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplex) { Simplex simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - for (auto i = simplex.begin(); i != simplex.end(); ++i) { - PRINT(*i); - auto j = i; - for (++j; - j != simplex.end(); - ++j) { - PRINT(*j); - } - } - return simplex.dimension() == 3; + BOOST_CHECK(simplex.dimension() == 3); } -bool test_num_simplices() { +BOOST_AUTO_TEST_CASE(test_skeleton_num_simplices) { int n = 4; Complex complex; build_complete(n, complex); size_t sum = 0; for (int i = 0; i < n; i++) { - PRINT(complex.num_simplices(i)); sum += complex.num_simplices(i); } - return - complex.num_vertices() == n && - complex.num_edges() == 6 && - sum == 15 && - complex.num_simplices() == 15; + BOOST_CHECK(complex.num_vertices() == n); + BOOST_CHECK(complex.num_edges() == 6); + BOOST_CHECK(sum == 15); + BOOST_CHECK(complex.num_simplices() == 15); } -bool test_iterator_vertices1() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices1) { int n = 10; Complex complex(10); - std::cerr << "complex.num_vertices():" << complex.num_vertices() << std::endl; + std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; int num_vertex_seen = 0; for (auto vi : complex.vertex_range()) { - std::cerr << "vertex:" << vi << std::endl; + std::cout << "vertex:" << vi << std::endl; ++num_vertex_seen; } - return num_vertex_seen == n; + BOOST_CHECK(num_vertex_seen == n); } -bool test_iterator_vertices2() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices2) { int n = 10; Complex complex; build_complete(10, complex); - std::cerr << "complex.num_vertices():" << complex.num_vertices() << std::endl; - std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; + std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; int num_vertex_seen = 0; for (auto vi : complex.vertex_range(Vertex_handle(2))) { - std::cerr << "vertex:" << vi << std::endl; + std::cout << "vertex:" << vi << std::endl; ++num_vertex_seen; } - std::cerr << "num_vertex_seen:" << num_vertex_seen << std::endl; - return num_vertex_seen == (n - 1); + std::cout << "num_vertex_seen:" << num_vertex_seen << std::endl; + BOOST_CHECK(num_vertex_seen == (n -1)); } -bool test_iterator_edge() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge) { const int n = 10; Complex complex(n); for (int i = 0; i < n; i++) @@ -148,17 +134,17 @@ bool test_iterator_edge() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; int num_edges_seen = 0; for (auto edge : complex.edge_range()) { - std::cerr << "edge :" << complex[edge] << std::endl; + std::cout << "edge :" << complex[edge] << std::endl; ++num_edges_seen; } - return num_edges_seen == n * (n - 1) / 2 - 2; + BOOST_CHECK(num_edges_seen == n * (n - 1) / 2 - 2); } -bool test_iterator_edge2() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge2) { const int n = 10; Complex complex(n); for (int i = 0; i < n; i++) @@ -166,33 +152,16 @@ bool test_iterator_edge2() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; int num_neigbors_seen = 0; for (auto neighbor : complex.vertex_range(Vertex_handle(2))) { - std::cerr << "neighbor" << neighbor << std::endl; + std::cout << "neighbor" << neighbor << std::endl; ++num_neigbors_seen; } - return num_neigbors_seen == 8; + BOOST_CHECK(num_neigbors_seen == 8); } -bool test_iterator_edge3() { - const int n = 10; - Complex complex(n); - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); - complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - std::cerr << "complex.num_edges():" << complex.num_edges() << std::endl; - int num_neigbors_seen = 0; - for (auto edge : complex.edge_range(Vertex_handle(2))) { - std::cerr << edge << std::endl; - ++num_neigbors_seen; - } - return num_neigbors_seen == 8; -} - -bool test_iterator_triangles() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_triangles) { const int n = 7; Complex complex(n); //create a "ring" around '0' @@ -202,24 +171,20 @@ bool test_iterator_triangles() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(i + 1)); complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(6)); - PRINT(complex.to_string()); + std::cout << complex.to_string() << std::endl; int num_triangles_seen = 0; //for (auto t : complex.triangle_range(5)){ - TEST("triangles around 5 (should be 2 of them):"); for (auto t : complex.triangle_range(Vertex_handle(5))) { - PRINT(t); ++num_triangles_seen; } - bool test = (num_triangles_seen == 2); + BOOST_CHECK(num_triangles_seen == 2); num_triangles_seen = 0; - TEST("triangles around 0 (should be 6 of them):"); for (auto t : complex.triangle_range(Vertex_handle(0))) { - PRINT(t); ++num_triangles_seen; } - test = test && (num_triangles_seen == 6); + BOOST_CHECK(num_triangles_seen == 6); // we now add another triangle complex.add_vertex(); @@ -228,22 +193,14 @@ bool test_iterator_triangles() { complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(6))); num_triangles_seen = 0; - TEST("triangles (should be 6 of them):"); num_triangles_seen = 0; for (auto t : complex.triangle_range()) { - PRINT(t); ++num_triangles_seen; } - test = test && (num_triangles_seen == 6); - PRINT(num_triangles_seen); - - return test; + BOOST_CHECK(num_triangles_seen == 6); } - -//#include "combinatorics/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h" - -bool test_iterator_simplices() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices) { Complex complex(6); complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); @@ -258,8 +215,6 @@ bool test_iterator_simplices() { complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4), Vertex_handle(5))); - bool correct_number_simplices = true; - std::map expected_num_simplices; expected_num_simplices[Vertex_handle(0)] = 4; @@ -270,120 +225,108 @@ bool test_iterator_simplices() { expected_num_simplices[Vertex_handle(5)] = 7; for (auto pair : expected_num_simplices) { + std::cout << "found list: "; unsigned num_simplices_around = 0; for (const auto& simplex : complex.star_simplex_range(pair.first)) { simplex.dimension(); - DBGVALUE(simplex); + std::cout << simplex << " - "; ++num_simplices_around; } - correct_number_simplices = correct_number_simplices && (num_simplices_around == pair.second); + BOOST_CHECK(num_simplices_around == pair.second); - DBGMSG("current vertex:", pair.first); - DBGMSG("expected_num_simplices:", pair.second); - DBGMSG("found:", num_simplices_around); + std::cout << std::endl << "current vertex:" << pair.first << " - "; + std::cout << "expected_num_simplices:" << pair.second << " - "; + std::cout << "found:" << num_simplices_around << std::endl; } - return correct_number_simplices; } -bool test_iterator_simplices2() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices2) { Complex complex(2); complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); - for (const auto& s : complex.triangle_range()) { - s.dimension(); - return false; // there are no triangles - } - - unsigned num_simplices = 0; - - - DBGVALUE(complex.to_string()); - - for (const auto& simplex : complex.star_simplex_range(Vertex_handle(0))) { - simplex.dimension(); - DBGVALUE(simplex); - } - + // Check there is no triangle + BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); - for (const auto& simplex : complex.complex_simplex_range()) { - DBGVALUE(simplex); - simplex.dimension(); - ++num_simplices; - } - bool correct_number_simplices = (num_simplices == 3); - return correct_number_simplices; + // Star(0) is [{0},{0,1}] + BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), + complex.star_simplex_range(Vertex_handle(0)).end()) == 2); + + // No blocker + BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), + complex.blocker_range(Vertex_handle(0)).end()) == 0); + + // Complex is [{0},{0,1},{1}] + BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), + complex.complex_simplex_range().end()) == 3); } -bool test_iterator_simplices3() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices3) { Complex complex(3); complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0)); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); - unsigned num_simplices = 0; - - for (const auto& simplex : complex.star_simplex_range(Vertex_handle(0))) { - simplex.dimension(); - DBGVALUE(simplex); - } + // Check there is no triangle + BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); + // Star(0) is [{0},{0,1},{0,2}] + BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), + complex.star_simplex_range(Vertex_handle(0)).end()) == 3); - for (const auto& simplex : complex.complex_simplex_range()) { - DBGVALUE(simplex); - simplex.dimension(); - ++num_simplices; - } - bool correct_number_simplices = (num_simplices == 6); - return correct_number_simplices; + // blocker(0) is [{0,1,2}] + BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), + complex.blocker_range(Vertex_handle(0)).end()) == 1); + + // Complex is [{0},{0,1},{0,2},{1},{1,2},{2}] + BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), + complex.complex_simplex_range().end()) == 6); } -bool test_iterator_simplices4() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices4) { Complex empty_complex; for (auto v : empty_complex.vertex_range()) { - (void) v; + std::cout << v; + BOOST_CHECK(false); } for (auto e : empty_complex.edge_range()) { - empty_complex[e]; + std::cout << e; + BOOST_CHECK(false); } for (auto t : empty_complex.triangle_range()) { - t.dimension(); + std::cout << t; + BOOST_CHECK(false); } for (auto s : empty_complex.complex_simplex_range()) { - s.dimension(); + std::cout << s; + BOOST_CHECK(false); } - return true; } -bool test_iterator_coboundary() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_coboundary) { Complex c; build_complete(4, c); c.remove_edge(Vertex_handle(1), Vertex_handle(3)); - PRINT(c.to_string()); + std::cout << c.to_string(); Simplex s02(Vertex_handle(0), Vertex_handle(2)); int n = 0; std::set expected; expected.insert(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); expected.insert(Simplex(Vertex_handle(0), Vertex_handle(2), Vertex_handle(3))); for (const auto & s : c.coboundary_range(s02)) { - PRINT(s); - if (expected.find(s) == expected.end()) - return false; + BOOST_CHECK(expected.find(s) != expected.end()); ++n; } - return n == 2; + BOOST_CHECK(n == 2); } - - - template auto blocker_range(Map map) -> decltype(map | boost::adaptors::map_values) { return map | boost::adaptors::map_values; } -bool test_iterator_blockers() { +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { Complex complex; Simplex alpha; Simplex vertex_set_expected; @@ -396,34 +339,36 @@ bool test_iterator_blockers() { complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); } - complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); - complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(1), Vertex_handle(10))); - complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(9), Vertex_handle(15))); - complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(9), Vertex_handle(8))); + std::vector myBlockers; + myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); + myBlockers.push_back(Simplex(Vertex_handle(2), Vertex_handle(1), Vertex_handle(10))); + myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(9), Vertex_handle(15))); + myBlockers.push_back(Simplex(Vertex_handle(1), Vertex_handle(9), Vertex_handle(8))); + + for (auto blocker : myBlockers) + complex.add_blocker(blocker); - // Print result int num_blockers = 0; for (auto blockers : complex.blocker_range(Vertex_handle(10))) { - TESTVALUE(*blockers); + // Only the first 3 blockers contain vertex 10 + BOOST_CHECK(*blockers == myBlockers[num_blockers]); num_blockers++; } - bool test = (num_blockers == 3); + BOOST_CHECK(num_blockers == 3); num_blockers = 0; for (auto blockers : complex.blocker_range()) { - TESTVALUE(*blockers); + for (auto block_ptr = myBlockers.begin(); block_ptr < myBlockers.end(); block_ptr++) + if (*block_ptr == *blockers) + myBlockers.erase(block_ptr); num_blockers++; } - test = test && (num_blockers == 4); - - return test; + BOOST_CHECK(num_blockers == 4); + BOOST_CHECK(myBlockers.empty()); } -bool test_link0() { - - enum { - a, b, c, d, n - }; +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link0) { + enum { a, b, c, d, n }; Complex complex(n); complex.add_edge_without_blockers(Vertex_handle(b), Vertex_handle(c)); complex.add_edge_without_blockers(Vertex_handle(c), Vertex_handle(d)); @@ -431,23 +376,19 @@ bool test_link0() { Skeleton_blocker_link_complex L(complex, alpha); auto L2 = complex.link(alpha); - if (L != L2) return false; - - PRINT(L.num_vertices()); - PRINT(L.to_string()); + BOOST_CHECK(L == L2); - bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(b))); - bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(d))); - bool test3 = L.num_edges() == 0; - bool test4 = L.num_blockers() == 0; - return test1 && test2 && test3&&test4; + std::cout << L.to_string(); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(b)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(d)))); + BOOST_CHECK(L.num_edges() == 0); + BOOST_CHECK(L.num_blockers() == 0); } -bool test_link1() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link1) { Complex complex; - // Build the complexes for (int i = 0; i < 20; i++) { complex.add_vertex(); @@ -461,26 +402,23 @@ bool test_link1() { // Complexes built auto L2 = complex.link(alpha); - if (L != L2) return false; + BOOST_CHECK(L == L2); // verification - bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10))); - bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11))); - bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13))); - bool test4 = L.num_edges() == 3; - bool test5 = L.num_blockers() == 0; + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 0); Root_simplex_handle simplex; simplex.add_vertex(Root_vertex_handle(10)); simplex.add_vertex(Root_vertex_handle(11)); simplex.add_vertex(Root_vertex_handle(13)); - bool test6(L.get_simplex_address(simplex)); - bool test7 = L.contains(*(L.get_simplex_address(simplex))); - std::cerr << "----> Ocomplex \n"; - return test1 && test2 && test3 && test4 && test5 && test6&&test7; - + BOOST_CHECK(L.get_simplex_address(simplex)); + BOOST_CHECK(L.contains(*(L.get_simplex_address(simplex)))); } -bool test_link2() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link2) { Complex complex; Simplex alpha; @@ -499,30 +437,28 @@ bool test_link2() { // Complexes built // Print result - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; - std::cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); auto L2 = complex.link(alpha); - if (L != L2) return false; + BOOST_CHECK(L == L2); // verification - bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10))); - bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11))); - bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13))); - bool test4 = L.num_edges() == 3; - bool test5 = L.num_blockers() == 1; + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 1); Root_simplex_handle simplex; simplex.add_vertex(Root_vertex_handle(10)); simplex.add_vertex(Root_vertex_handle(11)); simplex.add_vertex(Root_vertex_handle(13)); - bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex))); - std::cerr << "----> Ocomplex \n"; - return test1 && test2 && test3 && test4 && test5&&test6; + BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); } -bool test_link3() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link3) { Complex complex; Simplex alpha; @@ -541,26 +477,24 @@ bool test_link3() { // Complexes built // Print result - std::cerr << "complex complex" << complex.to_string(); - std::cerr << std::endl << std::endl; - std::cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); auto L2 = complex.link(alpha); - if (L != L2) return false; - + BOOST_CHECK(L == L2); // verification - bool test = assert_vertex(L, *L.get_address(Root_vertex_handle(10))); - test = test && assert_vertex(L, *L.get_address(Root_vertex_handle(11))); - test = test && assert_vertex(L, *L.get_address(Root_vertex_handle(13))); - test = test && L.num_edges() == 2; - test = test && L.contains_edge(*L.get_address(Root_vertex_handle(10)), *L.get_address(Root_vertex_handle(13))); - test = test && L.contains_edge(*L.get_address(Root_vertex_handle(13)), *L.get_address(Root_vertex_handle(11))); - test = test && L.num_blockers() == 0; - return test; + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(10))))); + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(11))))); + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(13))))); + BOOST_CHECK(L.num_edges() == 2); + BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(10)), *L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(13)), *L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.num_blockers() == 0); } -bool test_link4() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link4) { Complex complex; // Build the complexes @@ -577,42 +511,37 @@ bool test_link4() { // Complexes built // verification - bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10))); - bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11))); - bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13))); - bool test4 = L.num_edges() == 3; - bool test5 = L.num_blockers() == 1; + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 1); Root_simplex_handle simplex; simplex.add_vertex(Root_vertex_handle(10)); simplex.add_vertex(Root_vertex_handle(11)); simplex.add_vertex(Root_vertex_handle(13)); - bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex))); - std::cerr << "----> Ocomplex \n"; - return test1 && test2 && test3 && test4 && test5&&test6; - + BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); } -bool test_link5() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link5) { Complex complex(0); // Build the complexes build_complete(4, complex); complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - - - Skeleton_blocker_link_complex L(complex, alpha); // Complexes built + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built // Print result - PRINT(complex.to_string()); - std::cerr << std::endl << std::endl; - PRINT(L.to_string()); + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << L.to_string() << std::endl; // verification - return L.num_vertices() == 0; + BOOST_CHECK(L.num_vertices() == 0); } -bool test_link6() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link6) { Complex complex(0); // Build the complexes build_complete(4, complex); @@ -625,15 +554,14 @@ bool test_link6() { build_link_of_blocker(complex, alpha, link_blocker_alpha); // Print result - PRINT(complex.to_string()); - std::cerr << std::endl << std::endl; - PRINT(link_blocker_alpha.to_string()); + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; // verification - return link_blocker_alpha.num_vertices() == 1; + BOOST_CHECK(link_blocker_alpha.num_vertices() == 1); } -bool test_link7() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link7) { Complex complex(0); // Build the complexes build_complete(6, complex); @@ -656,27 +584,22 @@ bool test_link7() { //the result should be the edge {6,7} plus the blocker {0,1,2} // Print result - PRINT(complex.to_string()); - std::cerr << std::endl << std::endl; - DBGVALUE(link_blocker_alpha.to_string()); + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; Skeleton_blocker_link_complex link_blocker_alpha_cpy = link_blocker_alpha; - DBGVALUE(link_blocker_alpha_cpy.to_string()); - - bool equal_complexes = - (link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices()) - &&(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()) - &&(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges()) - ; - DBGVALUE((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())); - DBGVALUE((link_blocker_alpha.num_blockers())); - DBGVALUE((link_blocker_alpha_cpy.num_blockers())); + std::cout << "Link copy: " << link_blocker_alpha_cpy.to_string() << std::endl; - DBGVALUE(equal_complexes); + BOOST_CHECK(link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices()); + BOOST_CHECK(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()); + BOOST_CHECK(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges()); + BOOST_CHECK((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())); // verification - return link_blocker_alpha.num_vertices() == 5 && link_blocker_alpha.num_edges() == 4 && link_blocker_alpha.num_blockers() == 1 && equal_complexes; + BOOST_CHECK(link_blocker_alpha.num_vertices() == 5); + BOOST_CHECK(link_blocker_alpha.num_edges() == 4); + BOOST_CHECK(link_blocker_alpha.num_blockers() == 1); } template @@ -696,7 +619,7 @@ void add_triangle(int a, int b, int c, std::list& simplices) { simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b), Vertex_handle(c))); } -bool test_constructor() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor) { std::list simplices; simplices.push_back(Simplex(Vertex_handle(0))); @@ -714,7 +637,6 @@ bool test_constructor() { add_triangle_edges(1, 3, 4, simplices); add_triangle_edges(1, 2, 4, simplices); - add_triangle(0, 1, 5, simplices); add_triangle(1, 2, 3, simplices); add_triangle(1, 3, 4, simplices); @@ -723,9 +645,11 @@ bool test_constructor() { Complex complex(simplices.begin(), simplices.end()); - PRINT(complex.to_string()); + std::cout << "Constructor 1:\n" << complex.to_string(); - return ( complex.num_vertices() == 6 && complex.num_edges() == 10 && complex.num_blockers() == 2); + BOOST_CHECK(complex.num_vertices() == 6); + BOOST_CHECK(complex.num_edges() == 10); + BOOST_CHECK(complex.num_blockers() == 2); } std::list subfaces(Simplex top_face) { @@ -748,7 +672,7 @@ std::list subfaces(Simplex top_face) { } } -bool test_constructor2() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor2) { Simplex simplex; for (int i = 0; i < 5; ++i) simplex.add_vertex(static_cast (i)); @@ -758,37 +682,40 @@ bool test_constructor2() { Complex complex(simplices.begin(), simplices.end()); - PRINT(complex.to_string()); + std::cout << "Constructor 2:\n" << complex.to_string(); for (auto b : complex.const_blocker_range()) { std::cout << "b:" << b << std::endl; } - return ( complex.num_vertices() == 5 && complex.num_edges() == 10 && complex.num_blockers() == 1); + BOOST_CHECK(complex.num_vertices() == 5); + BOOST_CHECK(complex.num_edges() == 10); + BOOST_CHECK(complex.num_blockers() == 1); } -bool test_constructor3() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor3) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2)))); subf.pop_back(); //remove max face -> now a blocker 012 simplices.insert(simplices.begin(), subf.begin(), subf.end()); - DBGCONT(simplices); + Complex complex(simplices.begin(), simplices.end()); - DBGVALUE(complex.to_string()); + std::cout << "Constructor 3:\n" << complex.to_string(); - if (complex.num_blockers() != 1) return false; + BOOST_CHECK(complex.num_blockers() == 1); Sh expected_blocker(Vh(0), Vh(1), Vh(2)); for (auto b : complex.const_blocker_range()) - if (*b != expected_blocker) return false; + BOOST_CHECK(*b == expected_blocker); - return complex.num_vertices() == 3 && complex.num_blockers() == 1; + BOOST_CHECK(complex.num_vertices() == 3); + BOOST_CHECK(complex.num_blockers() == 1); } -bool test_constructor4() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor4) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; @@ -799,19 +726,20 @@ bool test_constructor4() { simplices.push_back(Sh(Vh(4), Vh(1))); simplices.push_back(Sh(Vh(4), Vh(0))); - DBGCONT(simplices); Complex complex(simplices.begin(), simplices.end()); - DBGVALUE(complex.to_string()); - if (complex.num_blockers() != 1) return false; + std::cout << "Constructor 4:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 1); Sh expected_blocker(Vh(0), Vh(1), Vh(4)); for (auto b : complex.const_blocker_range()) - if (*b != expected_blocker) return false; + BOOST_CHECK(*b == expected_blocker); - return complex.num_vertices() == 5 && complex.num_blockers() == 1 && complex.num_edges() == 8; + BOOST_CHECK(complex.num_vertices() == 5); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 8); } -bool test_constructor5() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor5) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; @@ -828,15 +756,16 @@ bool test_constructor5() { simplices.push_back(Sh(Vh(5), Vh(2))); simplices.push_back(Sh(Vh(5), Vh(0))); - DBGCONT(simplices); Complex complex(simplices.begin(), simplices.end()); - DBGVALUE(complex.to_string()); + std::cout << "Constructor 5:\n" << complex.to_string(); - return complex.num_vertices() == 6 && complex.num_blockers() == 3 && complex.num_edges() == 9; + BOOST_CHECK(complex.num_vertices() == 6); + BOOST_CHECK(complex.num_blockers() == 3); + BOOST_CHECK(complex.num_edges() == 9); } -bool test_constructor6() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor6) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; @@ -847,19 +776,19 @@ bool test_constructor6() { if (s != s1 && s != s2) simplices.push_back(s); } - DBGCONT(simplices); Complex complex(simplices.begin(), simplices.end()); - DBGVALUE(complex.to_string()); + std::cout << "Constructor 6:\n" << complex.to_string(); - if (complex.num_blockers() != 1) return false; + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 6); Sh expected_blocker(Vh(1), Vh(2), Vh(3)); for (auto b : complex.const_blocker_range()) - if (*b != expected_blocker) return false; - return complex.num_vertices() == 4 && complex.num_blockers() == 1 && complex.num_edges() == 6; + BOOST_CHECK(*b == expected_blocker); } -bool test_constructor7() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor7) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; @@ -871,16 +800,17 @@ bool test_constructor7() { //get complex from top faces Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); - DBGVALUE(complex.to_string()); + std::cout << "Constructor 7:\n" << complex.to_string(); - if (complex.num_blockers() != 1) return false; + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 6); Sh expected_blocker(Vh(0), Vh(1), Vh(2), Vh(3)); for (auto b : complex.const_blocker_range()) - if (*b != expected_blocker) return false; - return complex.num_vertices() == 4 && complex.num_blockers() == 1 && complex.num_edges() == 6; + BOOST_CHECK(*b == expected_blocker); } -bool test_constructor8() { +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor8) { typedef Vertex_handle Vh; typedef Simplex Sh; std::vector simplices; @@ -893,49 +823,9 @@ bool test_constructor8() { //get complex from top faces Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); - DBGVALUE(complex.to_string()); - - return complex.num_vertices() == 4 && complex.num_blockers() == 2 && complex.num_edges() == 5; -} - -int main(int argc, char *argv[]) { - Tests tests_complex; - tests_complex.add("test simplex", test_simplex); - tests_complex.add("test_num_simplices", test_num_simplices); - tests_complex.add("test_link0", test_link0); - tests_complex.add("test_link1", test_link1); - tests_complex.add("test_link2", test_link2); - tests_complex.add("test_link3", test_link3); - tests_complex.add("test_link4", test_link4); - tests_complex.add("test_link5", test_link5); - tests_complex.add("test_link6", test_link6); - tests_complex.add("test_link7", test_link7); - - tests_complex.add("test_constructor_list_simplices", test_constructor); - tests_complex.add("test_constructor_list_simplices2", test_constructor2); - tests_complex.add("test_constructor_list_simplices3", test_constructor3); - tests_complex.add("test_constructor_list_simplices4", test_constructor4); - tests_complex.add("test_constructor_list_simplices5", test_constructor5); - tests_complex.add("test_constructor_list_simplices6", test_constructor6); - tests_complex.add("test_constructor_list_simplices7", test_constructor7); - tests_complex.add("test_constructor_list_simplices8", test_constructor8); - - tests_complex.add("test iterator vertices 1", test_iterator_vertices1); - tests_complex.add("test iterator vertices 2", test_iterator_vertices2); - tests_complex.add("test iterator edges", test_iterator_edge); - tests_complex.add("test iterator edges 2", test_iterator_edge2); - tests_complex.add("test iterator edges 3", test_iterator_edge3); - tests_complex.add("test iterator blockers", test_iterator_blockers); - tests_complex.add("test_iterator_triangles", test_iterator_triangles); - tests_complex.add("test iterator simplices", test_iterator_simplices); - tests_complex.add("test iterator simplices2", test_iterator_simplices2); - tests_complex.add("test iterator simplices3", test_iterator_simplices3); - tests_complex.add("test iterator simplices4", test_iterator_simplices4); - tests_complex.add("test iterator coboundary", test_iterator_coboundary); - - if (tests_complex.run()) { - return EXIT_SUCCESS; - } else { - return EXIT_FAILURE; - } + std::cout << "Constructor 8:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.num_edges() == 5); } -- cgit v1.2.3 From 38c07937521e2b590034f76d568f7cdc8dd9701d Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 16 Sep 2016 14:38:29 +0000 Subject: Rename tests according to conventions. Add xml UT generation for the Boost tests git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1507 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 17a39f49058182586307f13511f78201ef2615dd --- src/Skeleton_blocker/test/CMakeLists.txt | 27 +- src/Skeleton_blocker/test/TestGeometricComplex.cpp | 125 ---- src/Skeleton_blocker/test/TestSimplifiable.cpp | 360 --------- .../test/TestSkeletonBlockerComplex.cpp | 831 --------------------- .../test/test_skeleton_blocker_complex.cpp | 831 +++++++++++++++++++++ .../test_skeleton_blocker_geometric_complex.cpp | 125 ++++ .../test/test_skeleton_blocker_simplifiable.cpp | 360 +++++++++ 7 files changed, 1335 insertions(+), 1324 deletions(-) delete mode 100644 src/Skeleton_blocker/test/TestGeometricComplex.cpp delete mode 100644 src/Skeleton_blocker/test/TestSimplifiable.cpp delete mode 100644 src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp create mode 100644 src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp create mode 100644 src/Skeleton_blocker/test/test_skeleton_blocker_geometric_complex.cpp create mode 100644 src/Skeleton_blocker/test/test_skeleton_blocker_simplifiable.cpp diff --git a/src/Skeleton_blocker/test/CMakeLists.txt b/src/Skeleton_blocker/test/CMakeLists.txt index a4576b36..f98517f0 100644 --- a/src/Skeleton_blocker/test/CMakeLists.txt +++ b/src/Skeleton_blocker/test/CMakeLists.txt @@ -10,15 +10,26 @@ if (GPROF_PATH) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") endif() -add_executable(TestSkeletonBlockerComplex TestSkeletonBlockerComplex.cpp) -add_executable(TestSimplifiable TestSimplifiable.cpp) -add_executable(TestGeometricComplex TestGeometricComplex.cpp) +add_executable ( test_skeleton_blocker_complex test_skeleton_blocker_complex.cpp ) +target_link_libraries(test_skeleton_blocker_complex ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) +add_executable ( test_skeleton_blocker_geometric_complex test_skeleton_blocker_geometric_complex.cpp ) +target_link_libraries(test_skeleton_blocker_geometric_complex ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) +add_executable ( test_skeleton_blocker_simplifiable test_skeleton_blocker_simplifiable.cpp ) +target_link_libraries(test_skeleton_blocker_simplifiable ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) # Do not forget to copy test files in current binary dir -file(COPY "test.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) file(COPY "test2.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) -add_test(TestSkeletonBlockerComplex ${CMAKE_CURRENT_BINARY_DIR}/TestSkeletonBlockerComplex) -add_test(TestSimplifiable ${CMAKE_CURRENT_BINARY_DIR}/TestSimplifiable) -add_test(TestGeometricComplex ${CMAKE_CURRENT_BINARY_DIR}/TestGeometricComplex) - +# Unitary tests +add_test(NAME test_skeleton_blocker_complex + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test_skeleton_blocker_complex + # XML format for Jenkins xUnit plugin + --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/skbl_complexUT.xml --log_level=test_suite --report_level=no) +add_test(NAME test_skeleton_blocker_geometric_complex + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test_skeleton_blocker_geometric_complex + # XML format for Jenkins xUnit plugin + --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/skbl_geometric_complexUT.xml --log_level=test_suite --report_level=no) +add_test(NAME test_skeleton_blocker_simplifiable + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test_skeleton_blocker_simplifiable + # XML format for Jenkins xUnit plugin + --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/skbl_simplifiableUT.xml --log_level=test_suite --report_level=no) diff --git a/src/Skeleton_blocker/test/TestGeometricComplex.cpp b/src/Skeleton_blocker/test/TestGeometricComplex.cpp deleted file mode 100644 index d035b2c3..00000000 --- a/src/Skeleton_blocker/test/TestGeometricComplex.cpp +++ /dev/null @@ -1,125 +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): David Salinas - * - * 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 - -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "skeleton_blocker_geometric_complex" -#include -#include - -#include - -struct Geometry_trait { - typedef std::vector Point; -}; - -typedef Geometry_trait::Point Point; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; -typedef Complex::Vertex_handle Vertex_handle; -typedef Complex_geometric_traits::Root_vertex_handle Root_vertex_handle; - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_off_reader_writer) { - Complex complex; - Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); - BOOST_CHECK(off_reader.is_valid()); - - std::cout << "complex has " << - complex.num_vertices() << " vertices, " << - complex.num_blockers() << " blockers, " << - complex.num_edges() << " edges and " << - complex.num_triangles() << " triangles."; - - BOOST_CHECK(complex.num_vertices() == 7); - BOOST_CHECK(complex.num_edges() == 12); - BOOST_CHECK(complex.num_triangles() == 6); - - Gudhi::skeleton_blocker::Skeleton_blocker_off_writer off_writer("tmp.off", complex); - Complex same; - Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader2("tmp.off", same); - - std::cout << "\ncomplex:" << complex.to_string() << std::endl; - std::cout << "\nsame:" << same.to_string() << std::endl; - - BOOST_CHECK(complex == same); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_abstract_link) { - Complex complex; - Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); - BOOST_CHECK(off_reader.is_valid()); - - std::cout << "complex has " << - complex.num_vertices() << " vertices, " << - complex.num_blockers() << " blockers, " << - complex.num_edges() << " edges and " << - complex.num_triangles() << " triangles."; - - BOOST_CHECK(complex.num_vertices() == 7); - BOOST_CHECK(complex.num_edges() == 12); - BOOST_CHECK(complex.num_triangles() == 6); - - auto link_0 = complex.abstract_link(Vertex_handle(0)); - - std::cout << "\n link(0):" << link_0.to_string() << std::endl; - - BOOST_CHECK(link_0.num_vertices() == 2); - BOOST_CHECK(link_0.num_edges() == 1); - BOOST_CHECK(link_0.num_blockers() == 0); - - // Check the 2 link vertices - auto vertex_handle = link_0.vertex_range().begin(); - BOOST_CHECK(link_0[*vertex_handle].get_id() == Root_vertex_handle(1)); - vertex_handle++; - BOOST_CHECK(link_0[*(vertex_handle)].get_id() == Root_vertex_handle(4)); - - // Check the lonely link edge - auto edge_handle = link_0.edge_range().begin(); - BOOST_CHECK(link_0[*edge_handle].first() == Root_vertex_handle(1)); - BOOST_CHECK(link_0[*(edge_handle)].second() == Root_vertex_handle(4)); - - auto link_geometric_0 = complex.link(Vertex_handle(0)); - std::cout << "\n link_geometric(0):" << link_geometric_0.to_string() << std::endl; - - BOOST_CHECK(link_0 == link_geometric_0); - - auto print_point = [&](Vertex_handle v) { - for (auto x : link_geometric_0.point(v)) std::cout << x << " "; - std::cout << std::endl; - }; - - std::for_each(link_geometric_0.vertex_range().begin(), link_geometric_0.vertex_range().end(), print_point); - - // Check the 2 link vertices - vertex_handle = link_geometric_0.vertex_range().begin(); - std::vector point_1 = {0,2,0}; - std::vector point_4 = {-1,1,0}; - BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_1); - vertex_handle++; - BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_4); - -} diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp deleted file mode 100644 index 360b91db..00000000 --- a/src/Skeleton_blocker/test/TestSimplifiable.cpp +++ /dev/null @@ -1,360 +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): David Salinas - * - * 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 - -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "skeleton_blocker_simplifiable" -#include -#include - -#include - -template class Skeleton_blocker_sub_complex; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; -typedef Complex::Vertex_handle Vertex_handle; -typedef Complex::Root_vertex_handle Root_vertex_handle; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_simplex Simplex; - - -void build_complete(int n, Complex& complex) { - complex.clear(); - for (int i = 0; i < n; i++) - complex.add_vertex(); - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction1) { - enum { a, b, x, y, z, n }; - Complex complex(n); - build_complete(n, complex); - complex.remove_edge(static_cast (b), static_cast (z)); - complex.add_blocker(Simplex(static_cast (a), static_cast (x), - static_cast (y))); - complex.add_blocker(Simplex(static_cast (b), static_cast (x), - static_cast (y))); - - // Print result - std::cout << "complex before complex" << complex.to_string() << std::endl; - - std::cout << std::endl << std::endl; - complex.contract_edge(static_cast (a), static_cast (b)); - // Print result - std::cout << "ContractEdge(0,1)\n"; - PRINT(complex.to_string()); - - // verification - for (int i = 0; i < 5; i++) - if (i != 1) BOOST_CHECK(complex.contains(Simplex(static_cast (i)))); - BOOST_CHECK(!complex.contains_edge(static_cast (a), static_cast (b))); - - BOOST_CHECK(complex.contains_blocker(Simplex(*complex.get_address(Root_vertex_handle(a)), - *complex.get_address(Root_vertex_handle(x)), - *complex.get_address(Root_vertex_handle(y))))); - - BOOST_CHECK(complex.num_edges() == 6); - BOOST_CHECK(complex.num_blockers() == 1); - Simplex sigma; - sigma.add_vertex(static_cast (a)); - sigma.add_vertex(static_cast (x)); - sigma.add_vertex(static_cast (y)); - sigma.add_vertex(static_cast (z)); - BOOST_CHECK(!(complex.contains(sigma))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction2) { - enum { a, b, x, y, z, n }; - Complex complex(n); - build_complete(n, complex); - complex.remove_edge(static_cast (b), static_cast (x)); - Simplex blocker; - blocker.add_vertex(static_cast (a)); - blocker.add_vertex(static_cast (y)); - blocker.add_vertex(static_cast (z)); - - complex.add_blocker(blocker); - - // Print result - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - complex.contract_edge(static_cast (a), static_cast (b)); - - std::cout << "complex.ContractEdge(a,b)" << complex.to_string(); - - std::cout << std::endl << std::endl; - - // there should be one blocker (a,c,d,e) in the complex - BOOST_CHECK(complex.contains_blocker(Simplex(static_cast (a), static_cast (x), - static_cast (y), static_cast (z)))); - BOOST_CHECK(complex.num_blockers() == 1); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_link_condition1) { - Complex complex(0); - // Build the complexes - build_complete(4, complex); - complex.add_blocker(Simplex(static_cast (0), static_cast (1), static_cast (2))); - - // Print result - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - - BOOST_CHECK(complex.link_condition(Vertex_handle(1), Vertex_handle(2), true)); - - BOOST_CHECK(!complex.link_condition(Vertex_handle(1), Vertex_handle(2), false)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse0) { - Complex complex(5); - build_complete(4, complex); - complex.add_vertex(); - complex.add_edge_without_blockers(static_cast (2), static_cast (4)); - complex.add_edge_without_blockers(static_cast (3), static_cast (4)); - // Print result - std::cout << "initial complex :\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - Simplex simplex_123(static_cast (1), static_cast (2), static_cast (3)); - complex.remove_star(simplex_123); - std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - // verification - BOOST_CHECK(complex.contains_blocker(simplex_123)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse1) { - Complex complex(5); - build_complete(4, complex); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); - // Print result - std::cout << "initial complex :\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - Simplex simplex_123(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - complex.remove_star(simplex_123); - std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - // verification - BOOST_CHECK(complex.contains_blocker(simplex_123)); - BOOST_CHECK(complex.num_blockers() == 1); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse2) { - Complex complex(5); - build_complete(4, complex); - complex.add_vertex(); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); - complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); - // Print result - std::cout << "initial complex :\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - Simplex sigma(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - complex.remove_star(sigma); - std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - // verification - BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), - Vertex_handle(3), Vertex_handle(4)))); - BOOST_CHECK(complex.contains_blocker(sigma)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse3) { - Complex complex(5); - build_complete(4, complex); - complex.add_vertex(); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); - complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); - // Print result - std::cout << "initial complex:\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - complex.remove_star(static_cast (2)); - std::cout << "complex after remove star of 2:\n" << complex.to_string(); - - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4)))); - BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), - Vertex_handle(3), Vertex_handle(4)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex) { - Complex complex(4); - build_complete(4, complex); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - std::cout << "initial complex:\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - complex.add_simplex(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); - std::cout << "complex after add_simplex:\n" << complex.to_string(); - BOOST_CHECK(complex.num_blockers() == 1); - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), - Vertex_handle(2), Vertex_handle(3)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex2) { - Complex complex; - build_complete(4, complex); - // Print result - std::cout << "initial complex:\n" << complex.to_string(); - std::cout << std::endl << std::endl; - - Complex copy(complex.num_vertices()); - - std::vector simplices(complex.complex_simplex_range().begin(), complex.complex_simplex_range().end()); - sort(simplices.begin(), simplices.end(), [&](const Simplex& s1, const Simplex & s2) { - return s1.dimension() < s2.dimension(); - }); - for (const auto & simplex : simplices) { - if (!copy.contains(simplex) && simplex.dimension() == 1) - copy.add_edge_without_blockers(simplex.first_vertex(), simplex.last_vertex()); - if (!copy.contains(simplex) && simplex.dimension() > 1) - copy.add_simplex(simplex); - } - - std::cout << "complex after add_simplex:\n" << copy.to_string(); - - BOOST_CHECK(complex.num_blockers() == copy.num_blockers()); - BOOST_CHECK(complex.num_edges() == copy.num_edges()); - BOOST_CHECK(complex.num_vertices() == copy.num_vertices()); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex3) { - Complex complex(5); - build_complete(5, complex); - complex.remove_edge(Vertex_handle(3), Vertex_handle(4)); - Simplex sigma(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - complex.add_blocker(sigma); - // Print result - std::cout << "initial complex:\n" << complex.to_string(); - std::cout << std::endl << std::endl; - complex.add_simplex(sigma); - //should create two blockers 0123 and 0124 - std::cout << "complex after adding simplex 012:\n" << complex.to_string(); - BOOST_CHECK(complex.num_blockers() == 2); - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), - Vertex_handle(2), Vertex_handle(3)))); - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), - Vertex_handle(2), Vertex_handle(4)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex4) { - int n = 6; - Complex complex(n); - - // add all simplex 0..n without i - for (int i = 0; i < n; i++) { - Simplex s; - for (int k = 0; k < n; k++) - s.add_vertex(Vertex_handle(k)); - s.remove_vertex(Vertex_handle(i)); - complex.add_simplex(s); - - //at step i there is only blocker 0..i - BOOST_CHECK(!(i < 2 && complex.num_blockers() > 0)); - if (i >= 2 && complex.num_blockers() != 1) { - Simplex b; - for (int k = 0; k < i; k++) - b.add_vertex(Vertex_handle(i)); - BOOST_CHECK(complex.contains_blocker(b)); - } - } - Simplex s; - for (int k = 0; k < n; k++) - s.add_vertex(Vertex_handle(k)); - BOOST_CHECK(complex.num_blockers() == 1); - BOOST_CHECK(complex.contains_blocker(s)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_edge) { - Complex complex(4); - for (unsigned i = 0u; i < 4; i++) - complex.add_edge(Vertex_handle(i), Vertex_handle((i + 1) % 4)); - - // Print result - std::cout << "initial complex:\n" << complex.to_string(); - std::cout << std::endl << std::endl; - complex.add_edge(Vertex_handle(1), Vertex_handle(3)); - //should create two blockers 013 and 012 - std::cout << "complex after adding edge 13:\n" << complex.to_string(); - BOOST_CHECK(complex.num_blockers() == 2); - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)))); - BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_remove_popable_blockers) { - Complex complex; - build_complete(4, complex); - complex.add_vertex(); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); - Simplex sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - Simplex sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)); - - complex.add_blocker(sigma1); - complex.add_blocker(sigma2); - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - std::cout << "complex.RemovePopableBlockers();" << std::endl; - complex.remove_popable_blockers(); - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - - BOOST_CHECK(complex.num_blockers() == 1); - - // test 2 - complex.clear(); - build_complete(4, complex); - complex.add_vertex(); - complex.add_vertex(); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5)); - complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5)); - sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)); - - complex.add_blocker(sigma1); - complex.add_blocker(sigma2); - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - std::cout << "complex.RemovePopableBlockers();" << std::endl; - complex.remove_popable_blockers(); - std::cout << "complex complex" << complex.to_string(); - - std::cout << std::endl << std::endl; - BOOST_CHECK(complex.num_blockers() == 0); -} diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp deleted file mode 100644 index f94c756e..00000000 --- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp +++ /dev/null @@ -1,831 +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): David Salinas - * - * 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 - -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "skeleton_blocker_complex" -#include -#include - -#include - -template class Skeleton_blocker_sub_complex; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; -typedef Gudhi::skeleton_blocker::Skeleton_blocker_link_complex Skeleton_blocker_link_complex; -typedef Complex::Vertex_handle Vertex_handle; -typedef Complex::Root_vertex_handle Root_vertex_handle; -typedef Complex::Simplex Simplex; -typedef Complex::Root_simplex_handle Root_simplex_handle; -typedef Simplex::Simplex_vertex_const_iterator Simplex_vertex_const_iterator; -typedef Complex::Edge_handle Edge_handle; - -bool assert_vertex(Complex &complex, Vertex_handle v) { - //assert(complex.contains(v)); - return complex.contains(static_cast (v)); -} - -bool assert_simplex(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) { - return true; - // AddressSimplex simplex((a),(b),(c)); - // return complex.contains(&simplex); -} - -// true iff the blocker (a,b,c) is in complex - -bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) { - return true; - //return complex.contains_blocker((a),(b),(c)); -} - -// true iff the blocker (a,b,c,d) is in complex - -bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c, Root_vertex_handle d) { - return true; - //Simplex blocker (a,b,c,d); - //return complex.contains_blocker(&blocker); -} - -void build_complete(int n, Complex& complex) { - complex.clear(); - for (int i = 0; i < n; i++) - complex.add_vertex(); - - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplex) { - Simplex simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); - BOOST_CHECK(simplex.dimension() == 3); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_num_simplices) { - int n = 4; - Complex complex; - build_complete(n, complex); - size_t sum = 0; - for (int i = 0; i < n; i++) { - sum += complex.num_simplices(i); - } - BOOST_CHECK(complex.num_vertices() == n); - BOOST_CHECK(complex.num_edges() == 6); - BOOST_CHECK(sum == 15); - BOOST_CHECK(complex.num_simplices() == 15); -} - - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices1) { - int n = 10; - Complex complex(10); - std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; - int num_vertex_seen = 0; - for (auto vi : complex.vertex_range()) { - std::cout << "vertex:" << vi << std::endl; - ++num_vertex_seen; - } - BOOST_CHECK(num_vertex_seen == n); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices2) { - int n = 10; - Complex complex; - build_complete(10, complex); - std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; - std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; - int num_vertex_seen = 0; - for (auto vi : complex.vertex_range(Vertex_handle(2))) { - std::cout << "vertex:" << vi << std::endl; - ++num_vertex_seen; - } - std::cout << "num_vertex_seen:" << num_vertex_seen << std::endl; - BOOST_CHECK(num_vertex_seen == (n -1)); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge) { - const int n = 10; - Complex complex(n); - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); - complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; - int num_edges_seen = 0; - for (auto edge : complex.edge_range()) { - std::cout << "edge :" << complex[edge] << std::endl; - ++num_edges_seen; - } - - BOOST_CHECK(num_edges_seen == n * (n - 1) / 2 - 2); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge2) { - const int n = 10; - Complex complex(n); - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); - complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); - std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; - int num_neigbors_seen = 0; - for (auto neighbor : complex.vertex_range(Vertex_handle(2))) { - std::cout << "neighbor" << neighbor << std::endl; - ++num_neigbors_seen; - } - BOOST_CHECK(num_neigbors_seen == 8); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_triangles) { - const int n = 7; - Complex complex(n); - //create a "ring" around '0' - for (int i = 1; i < n; i++) - complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(i)); - for (int i = 1; i < n - 1; i++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(i + 1)); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(6)); - - std::cout << complex.to_string() << std::endl; - - int num_triangles_seen = 0; - //for (auto t : complex.triangle_range(5)){ - for (auto t : complex.triangle_range(Vertex_handle(5))) { - ++num_triangles_seen; - } - BOOST_CHECK(num_triangles_seen == 2); - - num_triangles_seen = 0; - for (auto t : complex.triangle_range(Vertex_handle(0))) { - ++num_triangles_seen; - } - BOOST_CHECK(num_triangles_seen == 6); - - // we now add another triangle - complex.add_vertex(); - complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(7)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(7)); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(6))); - num_triangles_seen = 0; - - num_triangles_seen = 0; - for (auto t : complex.triangle_range()) { - ++num_triangles_seen; - } - BOOST_CHECK(num_triangles_seen == 6); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices) { - Complex complex(6); - complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0)); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(3)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(3)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); - complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5)); - complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); - - complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4), Vertex_handle(5))); - - std::map expected_num_simplices; - - expected_num_simplices[Vertex_handle(0)] = 4; - expected_num_simplices[Vertex_handle(1)] = 6; - expected_num_simplices[Vertex_handle(2)] = 11; - expected_num_simplices[Vertex_handle(3)] = 9; - expected_num_simplices[Vertex_handle(4)] = 7; - expected_num_simplices[Vertex_handle(5)] = 7; - - for (auto pair : expected_num_simplices) { - std::cout << "found list: "; - unsigned num_simplices_around = 0; - for (const auto& simplex : complex.star_simplex_range(pair.first)) { - simplex.dimension(); - std::cout << simplex << " - "; - ++num_simplices_around; - } - - BOOST_CHECK(num_simplices_around == pair.second); - - std::cout << std::endl << "current vertex:" << pair.first << " - "; - std::cout << "expected_num_simplices:" << pair.second << " - "; - std::cout << "found:" << num_simplices_around << std::endl; - } -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices2) { - Complex complex(2); - complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); - - // Check there is no triangle - BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); - - // Star(0) is [{0},{0,1}] - BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), - complex.star_simplex_range(Vertex_handle(0)).end()) == 2); - - // No blocker - BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), - complex.blocker_range(Vertex_handle(0)).end()) == 0); - - // Complex is [{0},{0,1},{1}] - BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), - complex.complex_simplex_range().end()) == 3); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices3) { - Complex complex(3); - complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); - complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); - complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0)); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); - - // Check there is no triangle - BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); - - // Star(0) is [{0},{0,1},{0,2}] - BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), - complex.star_simplex_range(Vertex_handle(0)).end()) == 3); - - // blocker(0) is [{0,1,2}] - BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), - complex.blocker_range(Vertex_handle(0)).end()) == 1); - - // Complex is [{0},{0,1},{0,2},{1},{1,2},{2}] - BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), - complex.complex_simplex_range().end()) == 6); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices4) { - Complex empty_complex; - for (auto v : empty_complex.vertex_range()) { - std::cout << v; - BOOST_CHECK(false); - } - for (auto e : empty_complex.edge_range()) { - std::cout << e; - BOOST_CHECK(false); - } - for (auto t : empty_complex.triangle_range()) { - std::cout << t; - BOOST_CHECK(false); - } - for (auto s : empty_complex.complex_simplex_range()) { - std::cout << s; - BOOST_CHECK(false); - } -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_coboundary) { - Complex c; - build_complete(4, c); - c.remove_edge(Vertex_handle(1), Vertex_handle(3)); - std::cout << c.to_string(); - Simplex s02(Vertex_handle(0), Vertex_handle(2)); - int n = 0; - std::set expected; - expected.insert(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); - expected.insert(Simplex(Vertex_handle(0), Vertex_handle(2), Vertex_handle(3))); - for (const auto & s : c.coboundary_range(s02)) { - BOOST_CHECK(expected.find(s) != expected.end()); - ++n; - } - BOOST_CHECK(n == 2); -} - -template -auto blocker_range(Map map) -> decltype(map | boost::adaptors::map_values) { - return map | boost::adaptors::map_values; -} - -BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { - Complex complex; - Simplex alpha; - Simplex vertex_set_expected; - // Build the complexes - for (int i = 0; i < 20; i++) { - complex.add_vertex(); - } - for (int i = 10; i < 15; i++) { - for (int j = i + 1; j < 15; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - } - - std::vector myBlockers; - myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); - myBlockers.push_back(Simplex(Vertex_handle(2), Vertex_handle(1), Vertex_handle(10))); - myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(9), Vertex_handle(15))); - myBlockers.push_back(Simplex(Vertex_handle(1), Vertex_handle(9), Vertex_handle(8))); - - for (auto blocker : myBlockers) - complex.add_blocker(blocker); - - int num_blockers = 0; - for (auto blockers : complex.blocker_range(Vertex_handle(10))) { - // Only the first 3 blockers contain vertex 10 - BOOST_CHECK(*blockers == myBlockers[num_blockers]); - num_blockers++; - } - BOOST_CHECK(num_blockers == 3); - - num_blockers = 0; - for (auto blockers : complex.blocker_range()) { - for (auto block_ptr = myBlockers.begin(); block_ptr < myBlockers.end(); block_ptr++) - if (*block_ptr == *blockers) - myBlockers.erase(block_ptr); - num_blockers++; - } - BOOST_CHECK(num_blockers == 4); - BOOST_CHECK(myBlockers.empty()); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link0) { - enum { a, b, c, d, n }; - Complex complex(n); - complex.add_edge_without_blockers(Vertex_handle(b), Vertex_handle(c)); - complex.add_edge_without_blockers(Vertex_handle(c), Vertex_handle(d)); - Simplex alpha = Simplex(Vertex_handle(c)); - Skeleton_blocker_link_complex L(complex, alpha); - - auto L2 = complex.link(alpha); - BOOST_CHECK(L == L2); - - std::cout << L.to_string(); - - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(b)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(d)))); - BOOST_CHECK(L.num_edges() == 0); - BOOST_CHECK(L.num_blockers() == 0); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link1) { - Complex complex; - - // Build the complexes - for (int i = 0; i < 20; i++) { - complex.add_vertex(); - } - for (int i = 10; i < 15; i++) { - for (int j = i + 1; j < 15; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - } - Simplex alpha(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); - // Complexes built - - auto L2 = complex.link(alpha); - BOOST_CHECK(L == L2); - - // verification - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); - BOOST_CHECK(L.num_edges() == 3); - BOOST_CHECK(L.num_blockers() == 0); - Root_simplex_handle simplex; - simplex.add_vertex(Root_vertex_handle(10)); - simplex.add_vertex(Root_vertex_handle(11)); - simplex.add_vertex(Root_vertex_handle(13)); - BOOST_CHECK(L.get_simplex_address(simplex)); - BOOST_CHECK(L.contains(*(L.get_simplex_address(simplex)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link2) { - Complex complex; - - Simplex alpha; - Simplex vertex_set_expected; - // Build the complexes - for (int i = 0; i < 20; i++) { - complex.add_vertex(); - } - for (int i = 10; i < 15; i++) { - for (int j = i + 1; j < 15; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - } - complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(13))); - alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); - // Complexes built - - // Print result - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); - - auto L2 = complex.link(alpha); - BOOST_CHECK(L == L2); - - - // verification - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); - BOOST_CHECK(L.num_edges() == 3); - BOOST_CHECK(L.num_blockers() == 1); - Root_simplex_handle simplex; - simplex.add_vertex(Root_vertex_handle(10)); - simplex.add_vertex(Root_vertex_handle(11)); - simplex.add_vertex(Root_vertex_handle(13)); - BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link3) { - Complex complex; - - Simplex alpha; - Simplex vertex_set_expected; - // Build the complexes - for (int i = 0; i < 20; i++) { - complex.add_vertex(); - } - for (int i = 10; i < 15; i++) { - for (int j = i + 1; j < 15; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - } - complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); - alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); - // Complexes built - - // Print result - std::cout << "complex complex" << complex.to_string(); - std::cout << std::endl << std::endl; - std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); - - auto L2 = complex.link(alpha); - BOOST_CHECK(L == L2); - - // verification - BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(10))))); - BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(11))))); - BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(13))))); - BOOST_CHECK(L.num_edges() == 2); - BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(10)), *L.get_address(Root_vertex_handle(13)))); - BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(13)), *L.get_address(Root_vertex_handle(11)))); - BOOST_CHECK(L.num_blockers() == 0); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link4) { - Complex complex; - - // Build the complexes - for (int i = 0; i < 20; i++) { - complex.add_vertex(); - } - for (int i = 10; i < 15; i++) { - for (int j = i + 1; j < 15; j++) - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); - } - complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12), Vertex_handle(13))); - Simplex alpha(Vertex_handle(12), Vertex_handle(14)); - Skeleton_blocker_link_complex L(complex, alpha); - // Complexes built - - // verification - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); - BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); - BOOST_CHECK(L.num_edges() == 3); - BOOST_CHECK(L.num_blockers() == 1); - Root_simplex_handle simplex; - simplex.add_vertex(Root_vertex_handle(10)); - simplex.add_vertex(Root_vertex_handle(11)); - simplex.add_vertex(Root_vertex_handle(13)); - BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link5) { - Complex complex(0); - // Build the complexes - build_complete(4, complex); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); - - Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - Skeleton_blocker_link_complex L(complex, alpha); - // Complexes built - - // Print result - std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; - std::cout << "Link: " << L.to_string() << std::endl; - - // verification - BOOST_CHECK(L.num_vertices() == 0); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link6) { - Complex complex(0); - // Build the complexes - build_complete(4, complex); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); - - Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); - - Skeleton_blocker_link_complex link_blocker_alpha; - - build_link_of_blocker(complex, alpha, link_blocker_alpha); - - // Print result - std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; - std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; - - // verification - BOOST_CHECK(link_blocker_alpha.num_vertices() == 1); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link7) { - Complex complex(0); - // Build the complexes - build_complete(6, complex); - complex.add_vertex(); - complex.add_vertex(); - for (int i = 3; i < 6; ++i) { - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(6)); - complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(7)); - } - complex.add_edge_without_blockers(Vertex_handle(6), Vertex_handle(7)); - complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); - complex.add_blocker(Simplex(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5))); - - Simplex alpha(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5)); - - Skeleton_blocker_link_complex link_blocker_alpha; - - build_link_of_blocker(complex, alpha, link_blocker_alpha); - - //the result should be the edge {6,7} plus the blocker {0,1,2} - - // Print result - std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; - std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; - - Skeleton_blocker_link_complex link_blocker_alpha_cpy = link_blocker_alpha; - - std::cout << "Link copy: " << link_blocker_alpha_cpy.to_string() << std::endl; - - BOOST_CHECK(link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices()); - BOOST_CHECK(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()); - BOOST_CHECK(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges()); - BOOST_CHECK((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())); - - // verification - BOOST_CHECK(link_blocker_alpha.num_vertices() == 5); - BOOST_CHECK(link_blocker_alpha.num_edges() == 4); - BOOST_CHECK(link_blocker_alpha.num_blockers() == 1); -} - -template -void add_triangle_edges(int a, int b, int c, std::list& simplices) { - typedef SimplexHandle Simplex; - typedef typename SimplexHandle::Vertex_handle Vertex_handle; - - simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b))); - simplices.push_back(Simplex(Vertex_handle(b), Vertex_handle(c))); - simplices.push_back(Simplex(Vertex_handle(c), Vertex_handle(a))); -} - -template -void add_triangle(int a, int b, int c, std::list& simplices) { - typedef SimplexHandle Simplex; - typedef typename SimplexHandle::Vertex_handle Vertex_handle; - simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b), Vertex_handle(c))); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor) { - std::list simplices; - - simplices.push_back(Simplex(Vertex_handle(0))); - simplices.push_back(Simplex(Vertex_handle(1))); - simplices.push_back(Simplex(Vertex_handle(2))); - simplices.push_back(Simplex(Vertex_handle(3))); - simplices.push_back(Simplex(Vertex_handle(4))); - simplices.push_back(Simplex(Vertex_handle(5))); - - simplices.push_back(Simplex(Vertex_handle(3), Vertex_handle(5))); - - add_triangle_edges(0, 1, 5, simplices); - add_triangle_edges(1, 2, 3, simplices); - add_triangle_edges(2, 3, 4, simplices); - add_triangle_edges(1, 3, 4, simplices); - add_triangle_edges(1, 2, 4, simplices); - - add_triangle(0, 1, 5, simplices); - add_triangle(1, 2, 3, simplices); - add_triangle(1, 3, 4, simplices); - add_triangle(1, 2, 4, simplices); - add_triangle(2, 3, 4, simplices); - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 1:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_vertices() == 6); - BOOST_CHECK(complex.num_edges() == 10); - BOOST_CHECK(complex.num_blockers() == 2); -} - -std::list subfaces(Simplex top_face) { - std::list res; - if (top_face.dimension() == -1) return res; - if (top_face.dimension() == 0) { - res.push_back(top_face); - return res; - } else { - Vertex_handle first_vertex = top_face.first_vertex(); - top_face.remove_vertex(first_vertex); - res = subfaces(top_face); - std::list copy = res; - for (auto& simplex : copy) { - simplex.add_vertex(first_vertex); - } - res.push_back(Simplex(first_vertex)); - res.splice(res.end(), copy); - return res; - } -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor2) { - Simplex simplex; - for (int i = 0; i < 5; ++i) - simplex.add_vertex(static_cast (i)); - - std::list simplices(subfaces(simplex)); - simplices.remove(simplex); - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 2:\n" << complex.to_string(); - - for (auto b : complex.const_blocker_range()) { - std::cout << "b:" << b << std::endl; - } - - BOOST_CHECK(complex.num_vertices() == 5); - BOOST_CHECK(complex.num_edges() == 10); - BOOST_CHECK(complex.num_blockers() == 1); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor3) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2)))); - subf.pop_back(); //remove max face -> now a blocker 012 - simplices.insert(simplices.begin(), subf.begin(), subf.end()); - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 3:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_blockers() == 1); - Sh expected_blocker(Vh(0), Vh(1), Vh(2)); - for (auto b : complex.const_blocker_range()) - BOOST_CHECK(*b == expected_blocker); - - - BOOST_CHECK(complex.num_vertices() == 3); - BOOST_CHECK(complex.num_blockers() == 1); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor4) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3)))); - simplices.insert(simplices.begin(), subf.begin(), subf.end()); - - simplices.push_back(Sh(Vh(4))); - simplices.push_back(Sh(Vh(4), Vh(1))); - simplices.push_back(Sh(Vh(4), Vh(0))); - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 4:\n" << complex.to_string(); - BOOST_CHECK(complex.num_blockers() == 1); - Sh expected_blocker(Vh(0), Vh(1), Vh(4)); - for (auto b : complex.const_blocker_range()) - BOOST_CHECK(*b == expected_blocker); - - BOOST_CHECK(complex.num_vertices() == 5); - BOOST_CHECK(complex.num_blockers() == 1); - BOOST_CHECK(complex.num_edges() == 8); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor5) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2)))); - simplices.insert(simplices.begin(), subf.begin(), subf.end()); - - simplices.push_back(Sh(Vh(3))); - simplices.push_back(Sh(Vh(3), Vh(1))); - simplices.push_back(Sh(Vh(3), Vh(2))); - simplices.push_back(Sh(Vh(4))); - simplices.push_back(Sh(Vh(4), Vh(1))); - simplices.push_back(Sh(Vh(4), Vh(0))); - simplices.push_back(Sh(Vh(5))); - simplices.push_back(Sh(Vh(5), Vh(2))); - simplices.push_back(Sh(Vh(5), Vh(0))); - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 5:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_vertices() == 6); - BOOST_CHECK(complex.num_blockers() == 3); - BOOST_CHECK(complex.num_edges() == 9); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor6) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3)))); - for (auto s : subf) { - Sh s1(Vh(0), Vh(1), Vh(2), Vh(3)); - Sh s2(Vh(1), Vh(2), Vh(3)); - if (s != s1 && s != s2) simplices.push_back(s); - } - - Complex complex(simplices.begin(), simplices.end()); - - std::cout << "Constructor 6:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_vertices() == 4); - BOOST_CHECK(complex.num_blockers() == 1); - BOOST_CHECK(complex.num_edges() == 6); - Sh expected_blocker(Vh(1), Vh(2), Vh(3)); - for (auto b : complex.const_blocker_range()) - BOOST_CHECK(*b == expected_blocker); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor7) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - simplices.push_back(Sh(Vh(0), Vh(1), Vh(2))); - simplices.push_back(Sh(Vh(1), Vh(2), Vh(3))); - simplices.push_back(Sh(Vh(3), Vh(0), Vh(2))); - simplices.push_back(Sh(Vh(3), Vh(0), Vh(1))); - - //get complex from top faces - Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); - - std::cout << "Constructor 7:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_vertices() == 4); - BOOST_CHECK(complex.num_blockers() == 1); - BOOST_CHECK(complex.num_edges() == 6); - Sh expected_blocker(Vh(0), Vh(1), Vh(2), Vh(3)); - for (auto b : complex.const_blocker_range()) - BOOST_CHECK(*b == expected_blocker); -} - -BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor8) { - typedef Vertex_handle Vh; - typedef Simplex Sh; - std::vector simplices; - simplices.push_back(Sh(Vh(0), Vh(1))); - simplices.push_back(Sh(Vh(2), Vh(1))); - simplices.push_back(Sh(Vh(0), Vh(2))); - simplices.push_back(Sh(Vh(3), Vh(1))); - simplices.push_back(Sh(Vh(2), Vh(3))); - - //get complex from top faces - Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); - - std::cout << "Constructor 8:\n" << complex.to_string(); - - BOOST_CHECK(complex.num_vertices() == 4); - BOOST_CHECK(complex.num_blockers() == 2); - BOOST_CHECK(complex.num_edges() == 5); -} diff --git a/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp new file mode 100644 index 00000000..f94c756e --- /dev/null +++ b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp @@ -0,0 +1,831 @@ +/* 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): David Salinas + * + * 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 + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_complex" +#include +#include + +#include + +template class Skeleton_blocker_sub_complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_link_complex Skeleton_blocker_link_complex; +typedef Complex::Vertex_handle Vertex_handle; +typedef Complex::Root_vertex_handle Root_vertex_handle; +typedef Complex::Simplex Simplex; +typedef Complex::Root_simplex_handle Root_simplex_handle; +typedef Simplex::Simplex_vertex_const_iterator Simplex_vertex_const_iterator; +typedef Complex::Edge_handle Edge_handle; + +bool assert_vertex(Complex &complex, Vertex_handle v) { + //assert(complex.contains(v)); + return complex.contains(static_cast (v)); +} + +bool assert_simplex(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) { + return true; + // AddressSimplex simplex((a),(b),(c)); + // return complex.contains(&simplex); +} + +// true iff the blocker (a,b,c) is in complex + +bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) { + return true; + //return complex.contains_blocker((a),(b),(c)); +} + +// true iff the blocker (a,b,c,d) is in complex + +bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c, Root_vertex_handle d) { + return true; + //Simplex blocker (a,b,c,d); + //return complex.contains_blocker(&blocker); +} + +void build_complete(int n, Complex& complex) { + complex.clear(); + for (int i = 0; i < n; i++) + complex.add_vertex(); + + for (int i = 0; i < n; i++) + for (int j = 0; j < i; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplex) { + Simplex simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); + BOOST_CHECK(simplex.dimension() == 3); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_num_simplices) { + int n = 4; + Complex complex; + build_complete(n, complex); + size_t sum = 0; + for (int i = 0; i < n; i++) { + sum += complex.num_simplices(i); + } + BOOST_CHECK(complex.num_vertices() == n); + BOOST_CHECK(complex.num_edges() == 6); + BOOST_CHECK(sum == 15); + BOOST_CHECK(complex.num_simplices() == 15); +} + + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices1) { + int n = 10; + Complex complex(10); + std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; + int num_vertex_seen = 0; + for (auto vi : complex.vertex_range()) { + std::cout << "vertex:" << vi << std::endl; + ++num_vertex_seen; + } + BOOST_CHECK(num_vertex_seen == n); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_vertices2) { + int n = 10; + Complex complex; + build_complete(10, complex); + std::cout << "complex.num_vertices():" << complex.num_vertices() << std::endl; + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; + int num_vertex_seen = 0; + for (auto vi : complex.vertex_range(Vertex_handle(2))) { + std::cout << "vertex:" << vi << std::endl; + ++num_vertex_seen; + } + std::cout << "num_vertex_seen:" << num_vertex_seen << std::endl; + BOOST_CHECK(num_vertex_seen == (n -1)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge) { + const int n = 10; + Complex complex(n); + for (int i = 0; i < n; i++) + for (int j = 0; j < i; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); + complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; + int num_edges_seen = 0; + for (auto edge : complex.edge_range()) { + std::cout << "edge :" << complex[edge] << std::endl; + ++num_edges_seen; + } + + BOOST_CHECK(num_edges_seen == n * (n - 1) / 2 - 2); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_edge2) { + const int n = 10; + Complex complex(n); + for (int i = 0; i < n; i++) + for (int j = 0; j < i; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + complex.remove_edge(Vertex_handle(2), Vertex_handle(3)); + complex.remove_edge(Vertex_handle(3), Vertex_handle(5)); + std::cout << "complex.num_edges():" << complex.num_edges() << std::endl; + int num_neigbors_seen = 0; + for (auto neighbor : complex.vertex_range(Vertex_handle(2))) { + std::cout << "neighbor" << neighbor << std::endl; + ++num_neigbors_seen; + } + BOOST_CHECK(num_neigbors_seen == 8); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_triangles) { + const int n = 7; + Complex complex(n); + //create a "ring" around '0' + for (int i = 1; i < n; i++) + complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(i)); + for (int i = 1; i < n - 1; i++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(i + 1)); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(6)); + + std::cout << complex.to_string() << std::endl; + + int num_triangles_seen = 0; + //for (auto t : complex.triangle_range(5)){ + for (auto t : complex.triangle_range(Vertex_handle(5))) { + ++num_triangles_seen; + } + BOOST_CHECK(num_triangles_seen == 2); + + num_triangles_seen = 0; + for (auto t : complex.triangle_range(Vertex_handle(0))) { + ++num_triangles_seen; + } + BOOST_CHECK(num_triangles_seen == 6); + + // we now add another triangle + complex.add_vertex(); + complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(7)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(7)); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(6))); + num_triangles_seen = 0; + + num_triangles_seen = 0; + for (auto t : complex.triangle_range()) { + ++num_triangles_seen; + } + BOOST_CHECK(num_triangles_seen == 6); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices) { + Complex complex(6); + complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0)); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(3)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(3)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); + + complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4), Vertex_handle(5))); + + std::map expected_num_simplices; + + expected_num_simplices[Vertex_handle(0)] = 4; + expected_num_simplices[Vertex_handle(1)] = 6; + expected_num_simplices[Vertex_handle(2)] = 11; + expected_num_simplices[Vertex_handle(3)] = 9; + expected_num_simplices[Vertex_handle(4)] = 7; + expected_num_simplices[Vertex_handle(5)] = 7; + + for (auto pair : expected_num_simplices) { + std::cout << "found list: "; + unsigned num_simplices_around = 0; + for (const auto& simplex : complex.star_simplex_range(pair.first)) { + simplex.dimension(); + std::cout << simplex << " - "; + ++num_simplices_around; + } + + BOOST_CHECK(num_simplices_around == pair.second); + + std::cout << std::endl << "current vertex:" << pair.first << " - "; + std::cout << "expected_num_simplices:" << pair.second << " - "; + std::cout << "found:" << num_simplices_around << std::endl; + } +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices2) { + Complex complex(2); + complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); + + // Check there is no triangle + BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); + + // Star(0) is [{0},{0,1}] + BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), + complex.star_simplex_range(Vertex_handle(0)).end()) == 2); + + // No blocker + BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), + complex.blocker_range(Vertex_handle(0)).end()) == 0); + + // Complex is [{0},{0,1},{1}] + BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), + complex.complex_simplex_range().end()) == 3); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices3) { + Complex complex(3); + complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1)); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0)); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); + + // Check there is no triangle + BOOST_CHECK(std::distance(complex.triangle_range().begin(), complex.triangle_range().end()) == 0); + + // Star(0) is [{0},{0,1},{0,2}] + BOOST_CHECK(std::distance(complex.star_simplex_range(Vertex_handle(0)).begin(), + complex.star_simplex_range(Vertex_handle(0)).end()) == 3); + + // blocker(0) is [{0,1,2}] + BOOST_CHECK(std::distance(complex.blocker_range(Vertex_handle(0)).begin(), + complex.blocker_range(Vertex_handle(0)).end()) == 1); + + // Complex is [{0},{0,1},{0,2},{1},{1,2},{2}] + BOOST_CHECK(std::distance(complex.complex_simplex_range().begin(), + complex.complex_simplex_range().end()) == 6); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_simplices4) { + Complex empty_complex; + for (auto v : empty_complex.vertex_range()) { + std::cout << v; + BOOST_CHECK(false); + } + for (auto e : empty_complex.edge_range()) { + std::cout << e; + BOOST_CHECK(false); + } + for (auto t : empty_complex.triangle_range()) { + std::cout << t; + BOOST_CHECK(false); + } + for (auto s : empty_complex.complex_simplex_range()) { + std::cout << s; + BOOST_CHECK(false); + } +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_coboundary) { + Complex c; + build_complete(4, c); + c.remove_edge(Vertex_handle(1), Vertex_handle(3)); + std::cout << c.to_string(); + Simplex s02(Vertex_handle(0), Vertex_handle(2)); + int n = 0; + std::set expected; + expected.insert(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); + expected.insert(Simplex(Vertex_handle(0), Vertex_handle(2), Vertex_handle(3))); + for (const auto & s : c.coboundary_range(s02)) { + BOOST_CHECK(expected.find(s) != expected.end()); + ++n; + } + BOOST_CHECK(n == 2); +} + +template +auto blocker_range(Map map) -> decltype(map | boost::adaptors::map_values) { + return map | boost::adaptors::map_values; +} + +BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { + Complex complex; + Simplex alpha; + Simplex vertex_set_expected; + // Build the complexes + for (int i = 0; i < 20; i++) { + complex.add_vertex(); + } + for (int i = 10; i < 15; i++) { + for (int j = i + 1; j < 15; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + } + + std::vector myBlockers; + myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); + myBlockers.push_back(Simplex(Vertex_handle(2), Vertex_handle(1), Vertex_handle(10))); + myBlockers.push_back(Simplex(Vertex_handle(10), Vertex_handle(9), Vertex_handle(15))); + myBlockers.push_back(Simplex(Vertex_handle(1), Vertex_handle(9), Vertex_handle(8))); + + for (auto blocker : myBlockers) + complex.add_blocker(blocker); + + int num_blockers = 0; + for (auto blockers : complex.blocker_range(Vertex_handle(10))) { + // Only the first 3 blockers contain vertex 10 + BOOST_CHECK(*blockers == myBlockers[num_blockers]); + num_blockers++; + } + BOOST_CHECK(num_blockers == 3); + + num_blockers = 0; + for (auto blockers : complex.blocker_range()) { + for (auto block_ptr = myBlockers.begin(); block_ptr < myBlockers.end(); block_ptr++) + if (*block_ptr == *blockers) + myBlockers.erase(block_ptr); + num_blockers++; + } + BOOST_CHECK(num_blockers == 4); + BOOST_CHECK(myBlockers.empty()); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link0) { + enum { a, b, c, d, n }; + Complex complex(n); + complex.add_edge_without_blockers(Vertex_handle(b), Vertex_handle(c)); + complex.add_edge_without_blockers(Vertex_handle(c), Vertex_handle(d)); + Simplex alpha = Simplex(Vertex_handle(c)); + Skeleton_blocker_link_complex L(complex, alpha); + + auto L2 = complex.link(alpha); + BOOST_CHECK(L == L2); + + std::cout << L.to_string(); + + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(b)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(d)))); + BOOST_CHECK(L.num_edges() == 0); + BOOST_CHECK(L.num_blockers() == 0); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link1) { + Complex complex; + + // Build the complexes + for (int i = 0; i < 20; i++) { + complex.add_vertex(); + } + for (int i = 10; i < 15; i++) { + for (int j = i + 1; j < 15; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + } + Simplex alpha(Vertex_handle(12), Vertex_handle(14)); + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built + + auto L2 = complex.link(alpha); + BOOST_CHECK(L == L2); + + // verification + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 0); + Root_simplex_handle simplex; + simplex.add_vertex(Root_vertex_handle(10)); + simplex.add_vertex(Root_vertex_handle(11)); + simplex.add_vertex(Root_vertex_handle(13)); + BOOST_CHECK(L.get_simplex_address(simplex)); + BOOST_CHECK(L.contains(*(L.get_simplex_address(simplex)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link2) { + Complex complex; + + Simplex alpha; + Simplex vertex_set_expected; + // Build the complexes + for (int i = 0; i < 20; i++) { + complex.add_vertex(); + } + for (int i = 10; i < 15; i++) { + for (int j = i + 1; j < 15; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + } + complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(13))); + alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built + + // Print result + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + + auto L2 = complex.link(alpha); + BOOST_CHECK(L == L2); + + + // verification + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 1); + Root_simplex_handle simplex; + simplex.add_vertex(Root_vertex_handle(10)); + simplex.add_vertex(Root_vertex_handle(11)); + simplex.add_vertex(Root_vertex_handle(13)); + BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link3) { + Complex complex; + + Simplex alpha; + Simplex vertex_set_expected; + // Build the complexes + for (int i = 0; i < 20; i++) { + complex.add_vertex(); + } + for (int i = 10; i < 15; i++) { + for (int j = i + 1; j < 15; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + } + complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12))); + alpha = Simplex(Vertex_handle(12), Vertex_handle(14)); + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built + + // Print result + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "L= Link_complex(" << alpha << ") : \n" << L.to_string(); + + auto L2 = complex.link(alpha); + BOOST_CHECK(L == L2); + + // verification + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(10))))); + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(11))))); + BOOST_CHECK(L.contains(static_cast (*L.get_address(Root_vertex_handle(13))))); + BOOST_CHECK(L.num_edges() == 2); + BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(10)), *L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.contains_edge(*L.get_address(Root_vertex_handle(13)), *L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.num_blockers() == 0); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link4) { + Complex complex; + + // Build the complexes + for (int i = 0; i < 20; i++) { + complex.add_vertex(); + } + for (int i = 10; i < 15; i++) { + for (int j = i + 1; j < 15; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); + } + complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12), Vertex_handle(13))); + Simplex alpha(Vertex_handle(12), Vertex_handle(14)); + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built + + // verification + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(10)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(11)))); + BOOST_CHECK(L.contains_vertex(*L.get_address(Root_vertex_handle(13)))); + BOOST_CHECK(L.num_edges() == 3); + BOOST_CHECK(L.num_blockers() == 1); + Root_simplex_handle simplex; + simplex.add_vertex(Root_vertex_handle(10)); + simplex.add_vertex(Root_vertex_handle(11)); + simplex.add_vertex(Root_vertex_handle(13)); + BOOST_CHECK(L.contains_blocker(*(L.get_simplex_address(simplex)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link5) { + Complex complex(0); + // Build the complexes + build_complete(4, complex); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); + + Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); + Skeleton_blocker_link_complex L(complex, alpha); + // Complexes built + + // Print result + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << L.to_string() << std::endl; + + // verification + BOOST_CHECK(L.num_vertices() == 0); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link6) { + Complex complex(0); + // Build the complexes + build_complete(4, complex); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); + + Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); + + Skeleton_blocker_link_complex link_blocker_alpha; + + build_link_of_blocker(complex, alpha, link_blocker_alpha); + + // Print result + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; + + // verification + BOOST_CHECK(link_blocker_alpha.num_vertices() == 1); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link7) { + Complex complex(0); + // Build the complexes + build_complete(6, complex); + complex.add_vertex(); + complex.add_vertex(); + for (int i = 3; i < 6; ++i) { + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(6)); + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(7)); + } + complex.add_edge_without_blockers(Vertex_handle(6), Vertex_handle(7)); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2))); + complex.add_blocker(Simplex(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5))); + + Simplex alpha(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5)); + + Skeleton_blocker_link_complex link_blocker_alpha; + + build_link_of_blocker(complex, alpha, link_blocker_alpha); + + //the result should be the edge {6,7} plus the blocker {0,1,2} + + // Print result + std::cout << "Complex: " << complex.to_string()<< std::endl << std::endl; + std::cout << "Link: " << link_blocker_alpha.to_string() << std::endl; + + Skeleton_blocker_link_complex link_blocker_alpha_cpy = link_blocker_alpha; + + std::cout << "Link copy: " << link_blocker_alpha_cpy.to_string() << std::endl; + + BOOST_CHECK(link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices()); + BOOST_CHECK(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()); + BOOST_CHECK(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges()); + BOOST_CHECK((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())); + + // verification + BOOST_CHECK(link_blocker_alpha.num_vertices() == 5); + BOOST_CHECK(link_blocker_alpha.num_edges() == 4); + BOOST_CHECK(link_blocker_alpha.num_blockers() == 1); +} + +template +void add_triangle_edges(int a, int b, int c, std::list& simplices) { + typedef SimplexHandle Simplex; + typedef typename SimplexHandle::Vertex_handle Vertex_handle; + + simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b))); + simplices.push_back(Simplex(Vertex_handle(b), Vertex_handle(c))); + simplices.push_back(Simplex(Vertex_handle(c), Vertex_handle(a))); +} + +template +void add_triangle(int a, int b, int c, std::list& simplices) { + typedef SimplexHandle Simplex; + typedef typename SimplexHandle::Vertex_handle Vertex_handle; + simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b), Vertex_handle(c))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor) { + std::list simplices; + + simplices.push_back(Simplex(Vertex_handle(0))); + simplices.push_back(Simplex(Vertex_handle(1))); + simplices.push_back(Simplex(Vertex_handle(2))); + simplices.push_back(Simplex(Vertex_handle(3))); + simplices.push_back(Simplex(Vertex_handle(4))); + simplices.push_back(Simplex(Vertex_handle(5))); + + simplices.push_back(Simplex(Vertex_handle(3), Vertex_handle(5))); + + add_triangle_edges(0, 1, 5, simplices); + add_triangle_edges(1, 2, 3, simplices); + add_triangle_edges(2, 3, 4, simplices); + add_triangle_edges(1, 3, 4, simplices); + add_triangle_edges(1, 2, 4, simplices); + + add_triangle(0, 1, 5, simplices); + add_triangle(1, 2, 3, simplices); + add_triangle(1, 3, 4, simplices); + add_triangle(1, 2, 4, simplices); + add_triangle(2, 3, 4, simplices); + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 1:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 6); + BOOST_CHECK(complex.num_edges() == 10); + BOOST_CHECK(complex.num_blockers() == 2); +} + +std::list subfaces(Simplex top_face) { + std::list res; + if (top_face.dimension() == -1) return res; + if (top_face.dimension() == 0) { + res.push_back(top_face); + return res; + } else { + Vertex_handle first_vertex = top_face.first_vertex(); + top_face.remove_vertex(first_vertex); + res = subfaces(top_face); + std::list copy = res; + for (auto& simplex : copy) { + simplex.add_vertex(first_vertex); + } + res.push_back(Simplex(first_vertex)); + res.splice(res.end(), copy); + return res; + } +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor2) { + Simplex simplex; + for (int i = 0; i < 5; ++i) + simplex.add_vertex(static_cast (i)); + + std::list simplices(subfaces(simplex)); + simplices.remove(simplex); + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 2:\n" << complex.to_string(); + + for (auto b : complex.const_blocker_range()) { + std::cout << "b:" << b << std::endl; + } + + BOOST_CHECK(complex.num_vertices() == 5); + BOOST_CHECK(complex.num_edges() == 10); + BOOST_CHECK(complex.num_blockers() == 1); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor3) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2)))); + subf.pop_back(); //remove max face -> now a blocker 012 + simplices.insert(simplices.begin(), subf.begin(), subf.end()); + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 3:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_blockers() == 1); + Sh expected_blocker(Vh(0), Vh(1), Vh(2)); + for (auto b : complex.const_blocker_range()) + BOOST_CHECK(*b == expected_blocker); + + + BOOST_CHECK(complex.num_vertices() == 3); + BOOST_CHECK(complex.num_blockers() == 1); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor4) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3)))); + simplices.insert(simplices.begin(), subf.begin(), subf.end()); + + simplices.push_back(Sh(Vh(4))); + simplices.push_back(Sh(Vh(4), Vh(1))); + simplices.push_back(Sh(Vh(4), Vh(0))); + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 4:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 1); + Sh expected_blocker(Vh(0), Vh(1), Vh(4)); + for (auto b : complex.const_blocker_range()) + BOOST_CHECK(*b == expected_blocker); + + BOOST_CHECK(complex.num_vertices() == 5); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 8); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor5) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2)))); + simplices.insert(simplices.begin(), subf.begin(), subf.end()); + + simplices.push_back(Sh(Vh(3))); + simplices.push_back(Sh(Vh(3), Vh(1))); + simplices.push_back(Sh(Vh(3), Vh(2))); + simplices.push_back(Sh(Vh(4))); + simplices.push_back(Sh(Vh(4), Vh(1))); + simplices.push_back(Sh(Vh(4), Vh(0))); + simplices.push_back(Sh(Vh(5))); + simplices.push_back(Sh(Vh(5), Vh(2))); + simplices.push_back(Sh(Vh(5), Vh(0))); + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 5:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 6); + BOOST_CHECK(complex.num_blockers() == 3); + BOOST_CHECK(complex.num_edges() == 9); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor6) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3)))); + for (auto s : subf) { + Sh s1(Vh(0), Vh(1), Vh(2), Vh(3)); + Sh s2(Vh(1), Vh(2), Vh(3)); + if (s != s1 && s != s2) simplices.push_back(s); + } + + Complex complex(simplices.begin(), simplices.end()); + + std::cout << "Constructor 6:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 6); + Sh expected_blocker(Vh(1), Vh(2), Vh(3)); + for (auto b : complex.const_blocker_range()) + BOOST_CHECK(*b == expected_blocker); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor7) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + simplices.push_back(Sh(Vh(0), Vh(1), Vh(2))); + simplices.push_back(Sh(Vh(1), Vh(2), Vh(3))); + simplices.push_back(Sh(Vh(3), Vh(0), Vh(2))); + simplices.push_back(Sh(Vh(3), Vh(0), Vh(1))); + + //get complex from top faces + Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); + + std::cout << "Constructor 7:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.num_edges() == 6); + Sh expected_blocker(Vh(0), Vh(1), Vh(2), Vh(3)); + for (auto b : complex.const_blocker_range()) + BOOST_CHECK(*b == expected_blocker); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_constructor8) { + typedef Vertex_handle Vh; + typedef Simplex Sh; + std::vector simplices; + simplices.push_back(Sh(Vh(0), Vh(1))); + simplices.push_back(Sh(Vh(2), Vh(1))); + simplices.push_back(Sh(Vh(0), Vh(2))); + simplices.push_back(Sh(Vh(3), Vh(1))); + simplices.push_back(Sh(Vh(2), Vh(3))); + + //get complex from top faces + Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces(simplices.begin(), simplices.end())); + + std::cout << "Constructor 8:\n" << complex.to_string(); + + BOOST_CHECK(complex.num_vertices() == 4); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.num_edges() == 5); +} diff --git a/src/Skeleton_blocker/test/test_skeleton_blocker_geometric_complex.cpp b/src/Skeleton_blocker/test/test_skeleton_blocker_geometric_complex.cpp new file mode 100644 index 00000000..d035b2c3 --- /dev/null +++ b/src/Skeleton_blocker/test/test_skeleton_blocker_geometric_complex.cpp @@ -0,0 +1,125 @@ +/* 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): David Salinas + * + * 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 + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_geometric_complex" +#include +#include + +#include + +struct Geometry_trait { + typedef std::vector Point; +}; + +typedef Geometry_trait::Point Point; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits Complex_geometric_traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex; +typedef Complex::Vertex_handle Vertex_handle; +typedef Complex_geometric_traits::Root_vertex_handle Root_vertex_handle; + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_off_reader_writer) { + Complex complex; + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); + BOOST_CHECK(off_reader.is_valid()); + + std::cout << "complex has " << + complex.num_vertices() << " vertices, " << + complex.num_blockers() << " blockers, " << + complex.num_edges() << " edges and " << + complex.num_triangles() << " triangles."; + + BOOST_CHECK(complex.num_vertices() == 7); + BOOST_CHECK(complex.num_edges() == 12); + BOOST_CHECK(complex.num_triangles() == 6); + + Gudhi::skeleton_blocker::Skeleton_blocker_off_writer off_writer("tmp.off", complex); + Complex same; + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader2("tmp.off", same); + + std::cout << "\ncomplex:" << complex.to_string() << std::endl; + std::cout << "\nsame:" << same.to_string() << std::endl; + + BOOST_CHECK(complex == same); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_abstract_link) { + Complex complex; + Gudhi::skeleton_blocker::Skeleton_blocker_off_reader off_reader("test2.off", complex); + BOOST_CHECK(off_reader.is_valid()); + + std::cout << "complex has " << + complex.num_vertices() << " vertices, " << + complex.num_blockers() << " blockers, " << + complex.num_edges() << " edges and " << + complex.num_triangles() << " triangles."; + + BOOST_CHECK(complex.num_vertices() == 7); + BOOST_CHECK(complex.num_edges() == 12); + BOOST_CHECK(complex.num_triangles() == 6); + + auto link_0 = complex.abstract_link(Vertex_handle(0)); + + std::cout << "\n link(0):" << link_0.to_string() << std::endl; + + BOOST_CHECK(link_0.num_vertices() == 2); + BOOST_CHECK(link_0.num_edges() == 1); + BOOST_CHECK(link_0.num_blockers() == 0); + + // Check the 2 link vertices + auto vertex_handle = link_0.vertex_range().begin(); + BOOST_CHECK(link_0[*vertex_handle].get_id() == Root_vertex_handle(1)); + vertex_handle++; + BOOST_CHECK(link_0[*(vertex_handle)].get_id() == Root_vertex_handle(4)); + + // Check the lonely link edge + auto edge_handle = link_0.edge_range().begin(); + BOOST_CHECK(link_0[*edge_handle].first() == Root_vertex_handle(1)); + BOOST_CHECK(link_0[*(edge_handle)].second() == Root_vertex_handle(4)); + + auto link_geometric_0 = complex.link(Vertex_handle(0)); + std::cout << "\n link_geometric(0):" << link_geometric_0.to_string() << std::endl; + + BOOST_CHECK(link_0 == link_geometric_0); + + auto print_point = [&](Vertex_handle v) { + for (auto x : link_geometric_0.point(v)) std::cout << x << " "; + std::cout << std::endl; + }; + + std::for_each(link_geometric_0.vertex_range().begin(), link_geometric_0.vertex_range().end(), print_point); + + // Check the 2 link vertices + vertex_handle = link_geometric_0.vertex_range().begin(); + std::vector point_1 = {0,2,0}; + std::vector point_4 = {-1,1,0}; + BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_1); + vertex_handle++; + BOOST_CHECK(link_geometric_0.point(*vertex_handle) == point_4); + +} diff --git a/src/Skeleton_blocker/test/test_skeleton_blocker_simplifiable.cpp b/src/Skeleton_blocker/test/test_skeleton_blocker_simplifiable.cpp new file mode 100644 index 00000000..360b91db --- /dev/null +++ b/src/Skeleton_blocker/test/test_skeleton_blocker_simplifiable.cpp @@ -0,0 +1,360 @@ +/* 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): David Salinas + * + * 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 + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "skeleton_blocker_simplifiable" +#include +#include + +#include + +template class Skeleton_blocker_sub_complex; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex Complex; +typedef Complex::Vertex_handle Vertex_handle; +typedef Complex::Root_vertex_handle Root_vertex_handle; +typedef Gudhi::skeleton_blocker::Skeleton_blocker_simplex Simplex; + + +void build_complete(int n, Complex& complex) { + complex.clear(); + for (int i = 0; i < n; i++) + complex.add_vertex(); + for (int i = 0; i < n; i++) + for (int j = 0; j < i; j++) + complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction1) { + enum { a, b, x, y, z, n }; + Complex complex(n); + build_complete(n, complex); + complex.remove_edge(static_cast (b), static_cast (z)); + complex.add_blocker(Simplex(static_cast (a), static_cast (x), + static_cast (y))); + complex.add_blocker(Simplex(static_cast (b), static_cast (x), + static_cast (y))); + + // Print result + std::cout << "complex before complex" << complex.to_string() << std::endl; + + std::cout << std::endl << std::endl; + complex.contract_edge(static_cast (a), static_cast (b)); + // Print result + std::cout << "ContractEdge(0,1)\n"; + PRINT(complex.to_string()); + + // verification + for (int i = 0; i < 5; i++) + if (i != 1) BOOST_CHECK(complex.contains(Simplex(static_cast (i)))); + BOOST_CHECK(!complex.contains_edge(static_cast (a), static_cast (b))); + + BOOST_CHECK(complex.contains_blocker(Simplex(*complex.get_address(Root_vertex_handle(a)), + *complex.get_address(Root_vertex_handle(x)), + *complex.get_address(Root_vertex_handle(y))))); + + BOOST_CHECK(complex.num_edges() == 6); + BOOST_CHECK(complex.num_blockers() == 1); + Simplex sigma; + sigma.add_vertex(static_cast (a)); + sigma.add_vertex(static_cast (x)); + sigma.add_vertex(static_cast (y)); + sigma.add_vertex(static_cast (z)); + BOOST_CHECK(!(complex.contains(sigma))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_contraction2) { + enum { a, b, x, y, z, n }; + Complex complex(n); + build_complete(n, complex); + complex.remove_edge(static_cast (b), static_cast (x)); + Simplex blocker; + blocker.add_vertex(static_cast (a)); + blocker.add_vertex(static_cast (y)); + blocker.add_vertex(static_cast (z)); + + complex.add_blocker(blocker); + + // Print result + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + complex.contract_edge(static_cast (a), static_cast (b)); + + std::cout << "complex.ContractEdge(a,b)" << complex.to_string(); + + std::cout << std::endl << std::endl; + + // there should be one blocker (a,c,d,e) in the complex + BOOST_CHECK(complex.contains_blocker(Simplex(static_cast (a), static_cast (x), + static_cast (y), static_cast (z)))); + BOOST_CHECK(complex.num_blockers() == 1); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_link_condition1) { + Complex complex(0); + // Build the complexes + build_complete(4, complex); + complex.add_blocker(Simplex(static_cast (0), static_cast (1), static_cast (2))); + + // Print result + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + + BOOST_CHECK(complex.link_condition(Vertex_handle(1), Vertex_handle(2), true)); + + BOOST_CHECK(!complex.link_condition(Vertex_handle(1), Vertex_handle(2), false)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse0) { + Complex complex(5); + build_complete(4, complex); + complex.add_vertex(); + complex.add_edge_without_blockers(static_cast (2), static_cast (4)); + complex.add_edge_without_blockers(static_cast (3), static_cast (4)); + // Print result + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + Simplex simplex_123(static_cast (1), static_cast (2), static_cast (3)); + complex.remove_star(simplex_123); + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + // verification + BOOST_CHECK(complex.contains_blocker(simplex_123)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse1) { + Complex complex(5); + build_complete(4, complex); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3))); + // Print result + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + Simplex simplex_123(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); + complex.remove_star(simplex_123); + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + // verification + BOOST_CHECK(complex.contains_blocker(simplex_123)); + BOOST_CHECK(complex.num_blockers() == 1); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse2) { + Complex complex(5); + build_complete(4, complex); + complex.add_vertex(); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); + complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); + // Print result + std::cout << "initial complex :\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + Simplex sigma(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); + complex.remove_star(sigma); + std::cout << "complex.remove_star(1,2,3):\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + // verification + BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), + Vertex_handle(3), Vertex_handle(4)))); + BOOST_CHECK(complex.contains_blocker(sigma)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_collapse3) { + Complex complex(5); + build_complete(4, complex); + complex.add_vertex(); + complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); + complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4))); + // Print result + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + complex.remove_star(static_cast (2)); + std::cout << "complex after remove star of 2:\n" << complex.to_string(); + + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4)))); + BOOST_CHECK(!complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), + Vertex_handle(3), Vertex_handle(4)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex) { + Complex complex(4); + build_complete(4, complex); + complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + complex.add_simplex(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3))); + std::cout << "complex after add_simplex:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(3)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex2) { + Complex complex; + build_complete(4, complex); + // Print result + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; + + Complex copy(complex.num_vertices()); + + std::vector simplices(complex.complex_simplex_range().begin(), complex.complex_simplex_range().end()); + sort(simplices.begin(), simplices.end(), [&](const Simplex& s1, const Simplex & s2) { + return s1.dimension() < s2.dimension(); + }); + for (const auto & simplex : simplices) { + if (!copy.contains(simplex) && simplex.dimension() == 1) + copy.add_edge_without_blockers(simplex.first_vertex(), simplex.last_vertex()); + if (!copy.contains(simplex) && simplex.dimension() > 1) + copy.add_simplex(simplex); + } + + std::cout << "complex after add_simplex:\n" << copy.to_string(); + + BOOST_CHECK(complex.num_blockers() == copy.num_blockers()); + BOOST_CHECK(complex.num_edges() == copy.num_edges()); + BOOST_CHECK(complex.num_vertices() == copy.num_vertices()); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex3) { + Complex complex(5); + build_complete(5, complex); + complex.remove_edge(Vertex_handle(3), Vertex_handle(4)); + Simplex sigma(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)); + complex.add_blocker(sigma); + // Print result + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; + complex.add_simplex(sigma); + //should create two blockers 0123 and 0124 + std::cout << "complex after adding simplex 012:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(3)))); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), + Vertex_handle(2), Vertex_handle(4)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_simplex4) { + int n = 6; + Complex complex(n); + + // add all simplex 0..n without i + for (int i = 0; i < n; i++) { + Simplex s; + for (int k = 0; k < n; k++) + s.add_vertex(Vertex_handle(k)); + s.remove_vertex(Vertex_handle(i)); + complex.add_simplex(s); + + //at step i there is only blocker 0..i + BOOST_CHECK(!(i < 2 && complex.num_blockers() > 0)); + if (i >= 2 && complex.num_blockers() != 1) { + Simplex b; + for (int k = 0; k < i; k++) + b.add_vertex(Vertex_handle(i)); + BOOST_CHECK(complex.contains_blocker(b)); + } + } + Simplex s; + for (int k = 0; k < n; k++) + s.add_vertex(Vertex_handle(k)); + BOOST_CHECK(complex.num_blockers() == 1); + BOOST_CHECK(complex.contains_blocker(s)); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_add_edge) { + Complex complex(4); + for (unsigned i = 0u; i < 4; i++) + complex.add_edge(Vertex_handle(i), Vertex_handle((i + 1) % 4)); + + // Print result + std::cout << "initial complex:\n" << complex.to_string(); + std::cout << std::endl << std::endl; + complex.add_edge(Vertex_handle(1), Vertex_handle(3)); + //should create two blockers 013 and 012 + std::cout << "complex after adding edge 13:\n" << complex.to_string(); + BOOST_CHECK(complex.num_blockers() == 2); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)))); + BOOST_CHECK(complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)))); +} + +BOOST_AUTO_TEST_CASE(test_skeleton_blocker_simplifiable_remove_popable_blockers) { + Complex complex; + build_complete(4, complex); + complex.add_vertex(); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); + Simplex sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); + Simplex sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)); + + complex.add_blocker(sigma1); + complex.add_blocker(sigma2); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "complex.RemovePopableBlockers();" << std::endl; + complex.remove_popable_blockers(); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + + BOOST_CHECK(complex.num_blockers() == 1); + + // test 2 + complex.clear(); + build_complete(4, complex); + complex.add_vertex(); + complex.add_vertex(); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4)); + complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5)); + complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5)); + complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5)); + sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)); + sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)); + + complex.add_blocker(sigma1); + complex.add_blocker(sigma2); + std::cout << "complex complex" << complex.to_string(); + std::cout << std::endl << std::endl; + std::cout << "complex.RemovePopableBlockers();" << std::endl; + complex.remove_popable_blockers(); + std::cout << "complex complex" << complex.to_string(); + + std::cout << std::endl << std::endl; + BOOST_CHECK(complex.num_blockers() == 0); +} -- cgit v1.2.3 From efe9b0f91eb63640941fa04153d921061e099d99 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 16 Sep 2016 14:47:23 +0000 Subject: No more need of Test.h git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1508 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: a0436136ab366116b61d0630a3da2b6407291db9 --- src/common/include/gudhi/Test.h | 105 ---------------------------------------- 1 file changed, 105 deletions(-) delete mode 100644 src/common/include/gudhi/Test.h diff --git a/src/common/include/gudhi/Test.h b/src/common/include/gudhi/Test.h deleted file mode 100644 index 6024c822..00000000 --- a/src/common/include/gudhi/Test.h +++ /dev/null @@ -1,105 +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): David Salinas - * - * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (France) - * - * 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 TEST_H_ -#define TEST_H_ - -#include -#include -#include -#include -#include - - -#define TEST(a) std::cout << "TEST: " << (a) << std::endl -#define TESTMSG(a, b) std::cout << "TEST: " << a << b << std::endl -#define TESTVALUE(a) std::cout << "TEST: " << #a << ": " << a << std::endl - -/** - * Class to perform test - */ - -class Test { - private: - std::string name; - bool (*test)(); - - std::string separation() const { - return "+++++++++++++++++++++++++++++++++++++++++++++++++\n"; - } - - std::string print_between_plus(std::string& s) const { - std::stringstream res; - res << "+++++++++++++++++" << s << "+++++++++++++++++\n"; - return res.str(); - } - - public: - Test(std::string name_, bool (*test_)()) { - name = name_; - test = test_; - } - - bool run() { - std::cout << print_between_plus(name); - return test(); - } - - std::string getName() { - return name; - } -}; - -class Tests { - private: - std::list tests; - - public: - void add(std::string name_, bool (*test_)()) { - Test test(name_, test_); - tests.push_back(test); - } - - bool run() { - bool tests_succesful(true); - std::vector res; - for (Test test : tests) { - res.push_back(test.run()); - } - std::cout << "\n\n results of tests : " << std::endl; - int i = 0; - for (Test t : tests) { - std::cout << "Test " << i << " \"" << t.getName() << "\" --> "; - if (res[i++]) { - std::cout << "OK" << std::endl; - } else { - std::cout << "Fail" << std::endl; - tests_succesful = false; - break; - } - } - return tests_succesful; - } -}; - -#endif // TEST_H_ -- cgit v1.2.3 From ca4f5e87e79701e48bb8697b19250be1b67c5f77 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 19 Sep 2016 09:03:18 +0000 Subject: Don't know why this test fails on win64 : assertion failed vector iterator not incrementable Workaround git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1509 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 4e29928ca7198b9c98aee8d961900910d51cd5f3 --- src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp index f94c756e..7b303935 100644 --- a/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp +++ b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp @@ -358,13 +358,17 @@ BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { num_blockers = 0; for (auto blockers : complex.blocker_range()) { +#ifndef _WIN64 for (auto block_ptr = myBlockers.begin(); block_ptr < myBlockers.end(); block_ptr++) if (*block_ptr == *blockers) myBlockers.erase(block_ptr); +#endif num_blockers++; } BOOST_CHECK(num_blockers == 4); +#ifndef _WIN64 BOOST_CHECK(myBlockers.empty()); +#endif } BOOST_AUTO_TEST_CASE(test_skeleton_blocker_complex_link0) { -- cgit v1.2.3 From e54574c7290b28543b9c1e7d1b9a16f42825ae26 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 19 Sep 2016 17:27:24 +0000 Subject: Rename off file reader as stands in convention. Add an example with a vector of double for point type. Fix SO3 OFF files accordingly to OFF file standard. git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@1510 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: ff61bed1f1895bc5bf1af4ae946e2a84a692c390 --- data/points/SO3_10000.off | 4 +- data/points/SO3_50000.off | 4 +- src/common/example/CGAL_3D_points_off_reader.cpp | 41 ------------------- src/common/example/CGAL_points_off_reader.cpp | 46 ---------------------- src/common/example/CMakeLists.txt | 18 +++++---- .../example/example_CGAL_3D_points_off_reader.cpp | 41 +++++++++++++++++++ .../example/example_CGAL_points_off_reader.cpp | 46 ++++++++++++++++++++++ .../example_vector_double_points_off_reader.cpp | 41 +++++++++++++++++++ src/common/include/gudhi/Points_off_io.h | 11 +++--- 9 files changed, 148 insertions(+), 104 deletions(-) delete mode 100644 src/common/example/CGAL_3D_points_off_reader.cpp delete mode 100644 src/common/example/CGAL_points_off_reader.cpp create mode 100644 src/common/example/example_CGAL_3D_points_off_reader.cpp create mode 100644 src/common/example/example_CGAL_points_off_reader.cpp create mode 100644 src/common/example/example_vector_double_points_off_reader.cpp diff --git a/data/points/SO3_10000.off b/data/points/SO3_10000.off index fbf9b273..3f2a3cda 100644 --- a/data/points/SO3_10000.off +++ b/data/points/SO3_10000.off @@ -1,5 +1,5 @@ -OFF -10000 1 0 +nOFF +9 10000 1 0 2.08167e-17 0 -1 -0.500001 0.866026 0 0.866026 0.500001 -2.08167e-17 0 0 -1 0.500001 -0.866026 0 -0.866026 -0.500001 0 0 0 -1 -1 0 0 0 1 0 diff --git a/data/points/SO3_50000.off b/data/points/SO3_50000.off index 635e8988..9b23a78f 100644 --- a/data/points/SO3_50000.off +++ b/data/points/SO3_50000.off @@ -1,5 +1,5 @@ -OFF -50000 1 0 +nOFF +9 50000 1 0 2.08167e-17 0 -1 -0.500001 0.866026 0 0.866026 0.500001 -2.08167e-17 0 0 -1 0.500001 -0.866026 0 -0.866026 -0.500001 0 0 0 -1 -1 0 0 0 1 0 diff --git a/src/common/example/CGAL_3D_points_off_reader.cpp b/src/common/example/CGAL_3D_points_off_reader.cpp deleted file mode 100644 index d48bb17d..00000000 --- a/src/common/example/CGAL_3D_points_off_reader.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include - -#include - -#include -#include -#include - -using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; -using Point_3 = Kernel::Point_3; - -void usage(char * const progName) { - std::cerr << "Usage: " << progName << " inputFile.off" << std::endl; - exit(-1); -} - -int main(int argc, char **argv) { - if (argc != 2) { - std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl; - usage(argv[0]); - } - - std::string offInputFile(argv[1]); - // Read the OFF file (input file name given as parameter) and triangulate points - Gudhi::Points_3D_off_reader off_reader(offInputFile); - // Check the read operation was correct - if (!off_reader.is_valid()) { - std::cerr << "Unable to read file " << offInputFile << std::endl; - usage(argv[0]); - } - - // Retrieve the triangulation - std::vector point_cloud = off_reader.get_point_cloud(); - - int n {0}; - for (auto point : point_cloud) { - ++n; - std::cout << "Point[" << n << "] = (" << point[0] << ", " << point[1] << ", " << point[2] << ")\n"; - } - return 0; -} diff --git a/src/common/example/CGAL_points_off_reader.cpp b/src/common/example/CGAL_points_off_reader.cpp deleted file mode 100644 index d1ca166d..00000000 --- a/src/common/example/CGAL_points_off_reader.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include - -// For CGAL points type in dimension d -// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html -#include - -#include -#include -#include - -using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >; -using Point_d = Kernel::Point_d; - -void usage(char * const progName) { - std::cerr << "Usage: " << progName << " inputFile.off" << std::endl; - exit(-1); -} - -int main(int argc, char **argv) { - if (argc != 2) { - std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl; - usage(argv[0]); - } - - std::string offInputFile(argv[1]); - // Read the OFF file (input file name given as parameter) and triangulate points - Gudhi::Points_off_reader off_reader(offInputFile); - // Check the read operation was correct - if (!off_reader.is_valid()) { - std::cerr << "Unable to read file " << offInputFile << std::endl; - usage(argv[0]); - } - - // Retrieve the triangulation - std::vector point_cloud = off_reader.get_point_cloud(); - - int n {0}; - for (auto point : point_cloud) { - std::cout << "Point[" << n << "] = "; - for (int i {0}; i < point.dimension(); i++) - std::cout << point[i] << " "; - std::cout << "\n"; - ++n; - } - return 0; -} diff --git a/src/common/example/CMakeLists.txt b/src/common/example/CMakeLists.txt index 0da3dcc0..b0c6d69a 100644 --- a/src/common/example/CMakeLists.txt +++ b/src/common/example/CMakeLists.txt @@ -1,17 +1,21 @@ cmake_minimum_required(VERSION 2.6) project(Common_examples) -# need CGAL 4.7 +add_executable ( vector_double_off_reader example_vector_double_points_off_reader.cpp ) +target_link_libraries(vector_double_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY}) +add_test(vector_double_off_reader ${CMAKE_CURRENT_BINARY_DIR}/vector_double_off_reader ${CMAKE_SOURCE_DIR}/data/points/SO3_10000.off) + if(CGAL_FOUND) - add_executable ( cgal3Doffreader CGAL_3D_points_off_reader.cpp ) - target_link_libraries(cgal3Doffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY}) - add_test(cgal3Doffreader ${CMAKE_CURRENT_BINARY_DIR}/cgal3Doffreader ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off) + add_executable ( cgal_3D_off_reader example_CGAL_3D_points_off_reader.cpp ) + target_link_libraries(cgal_3D_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY}) + add_test(cgal_3D_off_reader ${CMAKE_CURRENT_BINARY_DIR}/cgal_3D_off_reader ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off) + # need CGAL 4.7 if (NOT CGAL_VERSION VERSION_LESS 4.7.0) if (EIGEN3_FOUND) - add_executable ( cgaloffreader CGAL_points_off_reader.cpp ) - target_link_libraries(cgaloffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY}) - add_test(cgaloffreader ${CMAKE_CURRENT_BINARY_DIR}/cgaloffreader ${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off) + add_executable ( cgal_off_reader example_CGAL_points_off_reader.cpp ) + target_link_libraries(cgal_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY}) + add_test(cgal_off_reader ${CMAKE_CURRENT_BINARY_DIR}/cgal_off_reader ${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off) endif(EIGEN3_FOUND) endif (NOT CGAL_VERSION VERSION_LESS 4.7.0) endif() diff --git a/src/common/example/example_CGAL_3D_points_off_reader.cpp b/src/common/example/example_CGAL_3D_points_off_reader.cpp new file mode 100644 index 00000000..d48bb17d --- /dev/null +++ b/src/common/example/example_CGAL_3D_points_off_reader.cpp @@ -0,0 +1,41 @@ +#include + +#include + +#include +#include +#include + +using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_3 = Kernel::Point_3; + +void usage(char * const progName) { + std::cerr << "Usage: " << progName << " inputFile.off" << std::endl; + exit(-1); +} + +int main(int argc, char **argv) { + if (argc != 2) { + std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl; + usage(argv[0]); + } + + std::string offInputFile(argv[1]); + // Read the OFF file (input file name given as parameter) and triangulate points + Gudhi::Points_3D_off_reader off_reader(offInputFile); + // Check the read operation was correct + if (!off_reader.is_valid()) { + std::cerr << "Unable to read file " << offInputFile << std::endl; + usage(argv[0]); + } + + // Retrieve the triangulation + std::vector point_cloud = off_reader.get_point_cloud(); + + int n {0}; + for (auto point : point_cloud) { + ++n; + std::cout << "Point[" << n << "] = (" << point[0] << ", " << point[1] << ", " << point[2] << ")\n"; + } + return 0; +} diff --git a/src/common/example/example_CGAL_points_off_reader.cpp b/src/common/example/example_CGAL_points_off_reader.cpp new file mode 100644 index 00000000..264231b2 --- /dev/null +++ b/src/common/example/example_CGAL_points_off_reader.cpp @@ -0,0 +1,46 @@ +#include + +// For CGAL points type in dimension d +// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html +#include + +#include +#include +#include + +using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >; +using Point_d = Kernel::Point_d; + +void usage(char * const progName) { + std::cerr << "Usage: " << progName << " inputFile.off" << std::endl; + exit(-1); +} + +int main(int argc, char **argv) { + if (argc != 2) { + std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl; + usage(argv[0]); + } + + std::string offInputFile(argv[1]); + // Read the OFF file (input file name given as parameter) and triangulate points + Gudhi::Points_off_reader off_reader(offInputFile); + // Check the read operation was correct + if (!off_reader.is_valid()) { + std::cerr << "Unable to read file " << offInputFile << std::endl; + usage(argv[0]); + } + + // Retrieve the triangulation + std::vector point_cloud = off_reader.get_point_cloud(); + + int n {0}; + for (auto point : point_cloud) { + std::cout << "Point[" << n << "] = "; + for (int i {0}; i < point.size(); i++) + std::cout << point[i] << " "; + std::cout << "\n"; + ++n; + } + return 0; +} diff --git a/src/common/example/example_vector_double_points_off_reader.cpp b/src/common/example/example_vector_double_points_off_reader.cpp new file mode 100644 index 00000000..f691db92 --- /dev/null +++ b/src/common/example/example_vector_double_points_off_reader.cpp @@ -0,0 +1,41 @@ +#include + +#include +#include +#include + +using Point_d = std::vector; + +void usage(char * const progName) { + std::cerr << "Usage: " << progName << " inputFile.off" << std::endl; + exit(-1); +} + +int main(int argc, char **argv) { + if (argc != 2) { + std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl; + usage(argv[0]); + } + + std::string offInputFile(argv[1]); + // Read the OFF file (input file name given as parameter) and triangulate points + Gudhi::Points_off_reader off_reader(offInputFile); + // Check the read operation was correct + if (!off_reader.is_valid()) { + std::cerr << "Unable to read file " << offInputFile << std::endl; + usage(argv[0]); + } + + // Retrieve the triangulation + std::vector point_cloud = off_reader.get_point_cloud(); + + int n {0}; + for (auto point : point_cloud) { + std::cout << "Point[" << n << "] = "; + for (int i {0}; i < point.size(); i++) + std::cout << point[i] << " "; + std::cout << "\n"; + ++n; + } + return 0; +} diff --git a/src/common/include/gudhi/Points_off_io.h b/src/common/include/gudhi/Points_off_io.h index 74b49386..18b23e84 100644 --- a/src/common/include/gudhi/Points_off_io.h +++ b/src/common/include/gudhi/Points_off_io.h @@ -73,9 +73,8 @@ class Points_off_visitor_reader { * @details * Point_d must have a constructor with the following form: * - * @code template Point_d::Point_d(int d, InputIterator first, InputIterator last) @endcode + * @code template Point_d::Point_d(InputIterator first, InputIterator last) @endcode * - * where d is the point dimension. */ void point(const std::vector& point) { #ifdef DEBUG_TRACES @@ -86,7 +85,7 @@ class Points_off_visitor_reader { std::cout << std::endl; #endif // DEBUG_TRACES // Fill the point cloud - point_cloud.push_back(Point_d(point.size(), point.begin(), point.end())); + point_cloud.push_back(Point_d(point.begin(), point.end())); } // Off_reader visitor maximal_face implementation - Only points are read @@ -117,14 +116,14 @@ class Points_off_visitor_reader { * * \section Example * - * This example loads points from an OFF file and builds a vector of CGAL points in dimension d. + * This example loads points from an OFF file and builds a vector of points (vector of double). * Then, it is asked to display the points. * - * \include common/CGAL_points_off_reader.cpp + * \include common/example_vector_double_points_off_reader.cpp * * When launching: * - * \code $> ./cgaloffreader ../../data/points/alphacomplexdoc.off + * \code $> ./vector_double_off_reader ../../data/points/alphacomplexdoc.off * \endcode * * the program output is: -- cgit v1.2.3 From 5cdf5825e0e5a937c5bbc5cee49ed9aa34f0af0e Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Mon, 19 Sep 2016 19:40:44 +0000 Subject: use of std::vector for unitary test instead of CGAL points type rename unitary test as stands in convention git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@1511 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: b768b5a6bb0fe823abe6cbbea28d49c7ecb39a9d --- src/common/test/CMakeLists.txt | 27 +++------ src/common/test/points_off_reader_unit_test.cpp | 78 ------------------------- src/common/test/test_points_off_reader.cpp | 73 +++++++++++++++++++++++ 3 files changed, 81 insertions(+), 97 deletions(-) delete mode 100644 src/common/test/points_off_reader_unit_test.cpp create mode 100644 src/common/test/test_points_off_reader.cpp diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt index 0a88cf8e..7ccdb752 100644 --- a/src/common/test/CMakeLists.txt +++ b/src/common/test/CMakeLists.txt @@ -10,26 +10,15 @@ if (GPROF_PATH) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") endif() -# need CGAL 4.7 -if(CGAL_FOUND) - if (NOT CGAL_VERSION VERSION_LESS 4.7.0) - if (EIGEN3_FOUND) - add_executable ( poffreader_UT points_off_reader_unit_test.cpp ) - target_link_libraries(poffreader_UT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) +add_executable ( poffreader_UT test_points_off_reader.cpp ) +target_link_libraries(poffreader_UT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) - # 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}/) +# 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}/) - # Unitary tests - add_test(poffreader_UT ${CMAKE_CURRENT_BINARY_DIR}/poffreader_UT - # XML format for Jenkins xUnit plugin - --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/poffreader_UT.xml --log_level=test_suite --report_level=no) +# Unitary tests +add_test(poffreader_UT ${CMAKE_CURRENT_BINARY_DIR}/poffreader_UT + # XML format for Jenkins xUnit plugin + --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/poffreader_UT.xml --log_level=test_suite --report_level=no) - else() - message(WARNING "Eigen3 not found. Version 3.1.0 is required for points_off_reader unitary tests.") - endif() - else() - message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile points_off_reader unitary tests. Version 4.7.0 is required.") - endif () -endif() diff --git a/src/common/test/points_off_reader_unit_test.cpp b/src/common/test/points_off_reader_unit_test.cpp deleted file mode 100644 index dbcc0434..00000000 --- a/src/common/test/points_off_reader_unit_test.cpp +++ /dev/null @@ -1,78 +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) 2015 INRIA Saclay (France) - * - * 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 - -// For CGAL points type in dimension d -// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html -#include - -#include -#include -#include - -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "points_off_read_write" -#include - -typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel; -typedef Kernel::Point_d Point_d; - -BOOST_AUTO_TEST_CASE( points_doc_test ) -{ - // Read the OFF file (input file name given as parameter) and triangulates points - Gudhi::Points_off_reader off_reader("alphacomplexdoc.off"); - // Check the read operation was correct - BOOST_CHECK(off_reader.is_valid()); - - // Retrieve the triangulation - std::vector point_cloud = off_reader.get_point_cloud(); - BOOST_CHECK(point_cloud.size() == 7); - - std::vector expected_points; - std::vector point = {1.0, 1.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {7.0, 0.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {4.0, 6.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {9.0, 6.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {0.0, 14.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {2.0, 19.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - point = {9.0, 17.0}; - expected_points.push_back(Point_d(2, point.begin(), point.end())); - - BOOST_CHECK(point_cloud == expected_points); -} - -BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_read_test ) -{ - Gudhi::Points_off_reader off_reader("some_impossible_weird_file_name.off"); - // Check the read operation was correct - BOOST_CHECK(!off_reader.is_valid()); - - std::vector point_cloud = off_reader.get_point_cloud(); - BOOST_CHECK(point_cloud.size() == 0); -} diff --git a/src/common/test/test_points_off_reader.cpp b/src/common/test/test_points_off_reader.cpp new file mode 100644 index 00000000..b4f71182 --- /dev/null +++ b/src/common/test/test_points_off_reader.cpp @@ -0,0 +1,73 @@ +/* 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) 2015 INRIA Saclay (France) + * + * 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 + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "points_off_read_write" +#include + +using Point_d = std::vector; + +BOOST_AUTO_TEST_CASE( points_doc_test ) +{ + // Read the OFF file (input file name given as parameter) and triangulates points + Gudhi::Points_off_reader off_reader("alphacomplexdoc.off"); + // Check the read operation was correct + BOOST_CHECK(off_reader.is_valid()); + + // Retrieve the triangulation + std::vector point_cloud = off_reader.get_point_cloud(); + BOOST_CHECK(point_cloud.size() == 7); + + std::vector expected_points; + std::vector point = {1.0, 1.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {7.0, 0.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {4.0, 6.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {9.0, 6.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {0.0, 14.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {2.0, 19.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + point = {9.0, 17.0}; + expected_points.push_back(Point_d(point.begin(), point.end())); + + BOOST_CHECK(point_cloud == expected_points); +} + +BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_read_test ) +{ + Gudhi::Points_off_reader off_reader("some_impossible_weird_file_name.off"); + // Check the read operation was correct + BOOST_CHECK(!off_reader.is_valid()); + + std::vector point_cloud = off_reader.get_point_cloud(); + BOOST_CHECK(point_cloud.size() == 0); +} -- cgit v1.2.3 From 670b9654795474ea06035984ab03e7e7dd238a56 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Wed, 21 Sep 2016 11:06:25 +0000 Subject: Modify test that is not working under Windows git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@1525 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0f9eca7c8a11b7578fe9cb5acf3097e704288c2d --- src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp index 7b303935..4f9888ba 100644 --- a/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp +++ b/src/Skeleton_blocker/test/test_skeleton_blocker_complex.cpp @@ -358,7 +358,8 @@ BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { num_blockers = 0; for (auto blockers : complex.blocker_range()) { -#ifndef _WIN64 +// If not windows - _WIN32 is for windows 32 and 64 bits +#ifndef _WIN32 for (auto block_ptr = myBlockers.begin(); block_ptr < myBlockers.end(); block_ptr++) if (*block_ptr == *blockers) myBlockers.erase(block_ptr); @@ -366,7 +367,8 @@ BOOST_AUTO_TEST_CASE(test_skeleton_iterator_blockers) { num_blockers++; } BOOST_CHECK(num_blockers == 4); -#ifndef _WIN64 +// If not windows - _WIN32 is for windows 32 and 64 bits +#ifndef _WIN32 BOOST_CHECK(myBlockers.empty()); #endif } -- cgit v1.2.3 From f465e447fcc048d5c8f67224c88d9c84d6aaac76 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Thu, 22 Sep 2016 15:59:43 +0000 Subject: Fix a bug on gcc 4.2.1 reference to non-static member function must be called git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@1544 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: c5fdb03806241da2d7b0a92b73deb36791f74320 --- src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h index b0ee35f5..2c9602fa 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h @@ -147,7 +147,7 @@ struct Trie { } void remove_leaf() { - assert(is_leaf); + assert(is_leaf()); if (!is_root()) parent_->childs.erase(this); } -- cgit v1.2.3 From f4cae184ac11200a95c8b84efa8e029c870d7e2b Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 23 Sep 2016 11:07:56 +0000 Subject: Fix doxygen warnings git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/warning_fix@1550 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 39ef2513b5d84cb392677ba10718f5e47734884c --- src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h | 2 +- src/Contraction/include/gudhi/Edge_contraction.h | 2 +- src/Persistent_cohomology/doc/Intro_persistent_cohomology.h | 2 +- src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h | 8 ++++---- src/common/include/gudhi/Points_3D_off_io.h | 4 ++-- src/common/include/gudhi/Points_off_io.h | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h b/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h index 4c9c04d9..5963caa3 100644 --- a/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h +++ b/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h @@ -63,7 +63,7 @@ namespace cubical_complex { * For further details and theory of cubical complexes, please consult \cite kaczynski2004computational as well as the * following paper \cite peikert2012topological . * - * \section datastructure Data structure. + * \section cubicalcomplexdatastructure Data structure. * * The implementation of Cubical complex provides a representation of complexes that occupy a rectangular region in * \f$\mathbb{R}^n\f$. This extra assumption allows for a memory efficient way of storing cubical complexes in a form diff --git a/src/Contraction/include/gudhi/Edge_contraction.h b/src/Contraction/include/gudhi/Edge_contraction.h index 5af13c3e..61f2d945 100644 --- a/src/Contraction/include/gudhi/Edge_contraction.h +++ b/src/Contraction/include/gudhi/Edge_contraction.h @@ -41,7 +41,7 @@ namespace contraction { \author David Salinas -\section Introduction +\section edgecontractionintroduction Introduction The purpose of this package is to offer a user-friendly interface for edge contraction simplification of huge simplicial complexes. It uses the \ref skbl data-structure whose size remains small during simplification diff --git a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h index 0cba6361..433cfd3e 100644 --- a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h +++ b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h @@ -139,7 +139,7 @@ namespace persistent_cohomology { by increasing filtration values (breaking ties so as a simplex appears after its subsimplices of same filtration value) provides an indexing scheme. -\section Examples +\section pcohexamples Examples We provide several example files: run these examples with -h for details on their use, and read the README file. diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h index bd907131..32fe411c 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h @@ -42,7 +42,7 @@ namespace skeleton_blocker { \author David Salinas -\section Introduction +\section skblintroduction Introduction The Skeleton-Blocker data-structure proposes a light encoding for simplicial complexes by storing only an *implicit* representation of its simplices \cite socg_blockers_2011,\cite blockers2012. @@ -53,7 +53,7 @@ This data-structure handles all simplicial complexes operations such as are operations that do not require simplex enumeration such as edge iteration, link computation or simplex contraction. -\section Definitions +\section skbldefinitions Definitions We recall briefly classical definitions of simplicial complexes \cite Munkres-elementsalgtop1984. @@ -108,7 +108,7 @@ and point access in addition. -\subsection Visitor +\subsection skblvisitor Visitor The class Skeleton_blocker_complex has a visitor that is called when usual operations such as adding an edge or remove a vertex are called. You may want to use this visitor to compute statistics or to update another data-structure (for instance this visitor is heavily used in the \ref contr package). @@ -116,7 +116,7 @@ You may want to use this visitor to compute statistics or to update another data -\section Example +\section skblexample Example \subsection Iterating Iterating through vertices, edges, blockers and simplices diff --git a/src/common/include/gudhi/Points_3D_off_io.h b/src/common/include/gudhi/Points_3D_off_io.h index 2647f11e..b0d24998 100644 --- a/src/common/include/gudhi/Points_3D_off_io.h +++ b/src/common/include/gudhi/Points_3D_off_io.h @@ -132,12 +132,12 @@ class Points_3D_off_visitor_reader { * * @code template Point_3::Point_3(double x, double y, double z) @endcode * - * @section Example + * @section point3doffioexample Example * * This example loads points from an OFF file and builds a vector of CGAL points in dimension 3. * Then, it is asked to display the points. * - * @include common/CGAL_3D_points_off_reader.cpp + * @include common/example_CGAL_3D_points_off_reader.cpp * * When launching: * diff --git a/src/common/include/gudhi/Points_off_io.h b/src/common/include/gudhi/Points_off_io.h index 18b23e84..29af8a8a 100644 --- a/src/common/include/gudhi/Points_off_io.h +++ b/src/common/include/gudhi/Points_off_io.h @@ -114,7 +114,7 @@ class Points_off_visitor_reader { * * where d is the point dimension. * - * \section Example + * \section pointoffioexample Example * * This example loads points from an OFF file and builds a vector of points (vector of double). * Then, it is asked to display the points. -- cgit v1.2.3