/* 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 . */ #include #include #include #include #include #include "gudhi/Test.h" //#include "Skeleton_blocker/Simplex.h" #include "gudhi/Skeleton_blocker_complex.h" #include "gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h" #include "gudhi/Skeleton_blocker_simplifiable_complex.h" #include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h" using namespace std; using namespace Gudhi; using namespace skbl; template class Skeleton_blocker_sub_complex; typedef Skeleton_blocker_simplifiable_complex Complex; typedef Complex::Vertex_handle Vertex_handle; typedef Complex::Root_vertex_handle Root_vertex_handle; typedef Skeleton_blocker_simplex Simplex_handle; // true iff v \in complex bool assert_vertex(Complex &complex,Vertex_handle v){ Simplex_handle 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_handle(*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(); for(int i=0;i(b), static_cast(z)); complex.add_blocker(Simplex_handle(static_cast(a), static_cast(x), static_cast(y))); complex.add_blocker(Simplex_handle(static_cast(b), static_cast(x), static_cast(y))); // Print result cerr << "complex before complex"<< complex.to_string()<(a),static_cast(b)); // Print result cerr << "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; Simplex_handle 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; } bool test_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_handle 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 cerr << "complex complex"<< complex.to_string(); cerr <(a),static_cast(b)); cerr << "complex.ContractEdge(a,b)"<< complex.to_string(); cerr <(a), static_cast(x), static_cast(y),static_cast(z))); test = test && complex.num_blockers()==1; return test; } bool test_link_condition1(){ Complex complex(0); // Build the complexes build_complete(4,complex); complex.add_blocker(Simplex_handle(static_cast(0), static_cast(1), static_cast(2))); // Print result cerr << "complex complex"<< complex.to_string(); cerr <(2), static_cast(4)); complex.add_edge(static_cast(3), static_cast(4)); // Print result cerr << "initial complex :\n"<< complex.to_string(); cerr <(1), static_cast(2), static_cast(3)); complex.remove_star(simplex_123); cerr << "complex.remove_star(1,2,3):\n"<< complex.to_string(); cerr < Ocomplex \n"; return blocker123_here; } bool test_collapse1(){ Complex complex(5); build_complete(4,complex); complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3))); // Print result cerr << "initial complex :\n"<< complex.to_string(); cerr < Ocomplex \n"; return res; } bool test_collapse2(){ Complex complex(5); build_complete(4,complex); complex.add_vertex(); complex.add_edge(Vertex_handle(1),Vertex_handle(4)); complex.add_edge(Vertex_handle(2),Vertex_handle(4)); complex.add_edge(Vertex_handle(3),Vertex_handle(4)); complex.add_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4))); // Print result cerr << "initial complex :\n"<< complex.to_string(); cerr <(2)); cerr << "complex after remove star of 2:\n"<< complex.to_string(); bool blocker134_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(3),Vertex_handle(4))); bool blocker1234_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4))); return blocker134_here && !blocker1234_here; } bool test_add_simplex(){ Complex complex(5); build_complete(4,complex); complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2))); // Print result cerr << "initial complex:\n"<< complex.to_string(); cerr < simplices(complex.simplex_range().begin(),complex.simplex_range().end()); sort(simplices.begin(),simplices.end(),[&](const Simplex_handle& s1,const Simplex_handle& s2){ return s1.dimension()1) copy.add_simplex(simplex); } 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(); } bool test_remove_popable_blockers(){ Complex complex; build_complete(4,complex); complex.add_vertex(); complex.add_edge(Vertex_handle(3),Vertex_handle(4)); complex.add_edge(Vertex_handle(2),Vertex_handle(4)); Simplex_handle sigma1=Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)); Simplex_handle sigma2=Simplex_handle(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)); complex.add_blocker(sigma1); complex.add_blocker(sigma2); cerr << "complex complex"<< complex.to_string(); cerr <