From 0b903a02242c935e7621006818e9f9dc442f0e79 Mon Sep 17 00:00:00 2001 From: vrouvrea Date: Fri, 12 Oct 2018 14:06:01 +0000 Subject: Add some unitary tests num_maximum_simplices results are a bit strange git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/toplex_map@3950 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 86c7a4607f9d774c89c79dcc6d95f1ce2f5951d5 --- src/Toplex_map/benchmark/chrono.cpp | 56 +++++++++---------- src/Toplex_map/include/gudhi/Toplex_map.h | 4 +- src/Toplex_map/test/toplex_map_unit_test.cpp | 81 ++++++++++++++++++++++++---- 3 files changed, 96 insertions(+), 45 deletions(-) (limited to 'src/Toplex_map') diff --git a/src/Toplex_map/benchmark/chrono.cpp b/src/Toplex_map/benchmark/chrono.cpp index a745f099..db87e217 100644 --- a/src/Toplex_map/benchmark/chrono.cpp +++ b/src/Toplex_map/benchmark/chrono.cpp @@ -15,48 +15,40 @@ typedef std::pair< Simplex_tree<>::Simplex_handle, bool > typePairSimplexBool; class ST_wrapper { public: - void insert_simplex(const Simplex& tau); - bool membership(const Simplex& tau); - Vertex contraction(const Vertex x, const Vertex y); - std::size_t num_simplices(); - -private: - Simplex_tree<> simplexTree; - void erase_max(const Simplex& sigma); -}; - -void ST_wrapper::insert_simplex(const Simplex& tau){ + void insert_simplex(const Simplex& tau) { simplexTree.insert_simplex_and_subfaces(tau); -} + } -bool ST_wrapper::membership(const Simplex& tau) { + bool membership(const Simplex& tau) { return simplexTree.find(tau) != simplexTree.null_simplex(); -} - -void ST_wrapper::erase_max(const Simplex& sigma){ - if(membership(sigma)) - simplexTree.remove_maximal_simplex(simplexTree.find(sigma)); -} + } -Vertex ST_wrapper::contraction(const Vertex x, const Vertex y){ + Vertex contraction(const Vertex x, const Vertex y) { Simplex sx; sx.insert(x); auto hx = simplexTree.find(sx); if(hx != simplexTree.null_simplex()) - for(auto h : simplexTree.cofaces_simplex_range(hx,0)){ - auto sr = simplexTree.simplex_vertex_range(h); - Simplex sigma(sr.begin(),sr.end()); - erase_max(sigma); - sigma.erase(x); - sigma.insert(y); - insert_simplex(sigma); - } + for(auto h : simplexTree.cofaces_simplex_range(hx,0)){ + auto sr = simplexTree.simplex_vertex_range(h); + Simplex sigma(sr.begin(),sr.end()); + erase_max(sigma); + sigma.erase(x); + sigma.insert(y); + insert_simplex(sigma); + } return y; -} + } -std::size_t ST_wrapper::num_simplices(){ + std::size_t num_maximal_simplices() { return simplexTree.num_simplices(); -} + } +private: + Simplex_tree<> simplexTree; + void erase_max(const Simplex& sigma) { + if(membership(sigma)) + simplexTree.remove_maximal_simplex(simplexTree.find(sigma)); + } +}; int n = 300; @@ -120,7 +112,7 @@ void chrono(int n, int d){ end = std::chrono::system_clock::now(); auto c2 = std::chrono::duration_cast(end-start).count(); - std::cout << c1 << "\t \t" << c2 << "\t \t" << c3 << "\t \t" << K.num_simplices() << std::endl; + std::cout << c1 << "\t \t" << c2 << "\t \t" << c3 << "\t \t" << K.num_maximal_simplices() << std::endl; } int main(){ diff --git a/src/Toplex_map/include/gudhi/Toplex_map.h b/src/Toplex_map/include/gudhi/Toplex_map.h index 271d0970..4c6c4b02 100644 --- a/src/Toplex_map/include/gudhi/Toplex_map.h +++ b/src/Toplex_map/include/gudhi/Toplex_map.h @@ -8,8 +8,6 @@ #include #include -#define vertex_upper_bound std::numeric_limits::max() - namespace Gudhi { /** A Toplex_map represents the simplicial complex. @@ -85,6 +83,8 @@ protected: /** \internal The map from vertices to toplices */ std::unordered_map t0; + + const Toplex_map::Vertex vertex_upper_bound = std::numeric_limits::max(); }; // Pointers are also used as key in the hash sets. diff --git a/src/Toplex_map/test/toplex_map_unit_test.cpp b/src/Toplex_map/test/toplex_map_unit_test.cpp index c1540eb5..9ee5dff2 100644 --- a/src/Toplex_map/test/toplex_map_unit_test.cpp +++ b/src/Toplex_map/test/toplex_map_unit_test.cpp @@ -29,21 +29,21 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(common_toplex_map_functionnalities, Toplex_map, li K.insert_simplex(sigma6); K.insert_simplex(sigma7); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; BOOST_CHECK(K.membership(sigma4)); //BOOST_CHECK(!K.maximality(sigma3)); BOOST_CHECK(!K.membership(sigma5)); K.insert_simplex(sigma5); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; BOOST_CHECK(K.membership(sigma5)); std::vector sigma9 = {1, 2, 3}; std::vector sigma10 = {2, 7}; auto r = K.contraction(4,5); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; sigma9.emplace_back(r); sigma10.emplace_back(r); @@ -59,24 +59,83 @@ BOOST_AUTO_TEST_CASE(toplex_map_num_maximal_simplices) { using Vertex = Gudhi::Toplex_map::Vertex; Gudhi::Toplex_map K; - K.insert_simplex({1, 2, 3, 4}); - K.insert_simplex({5, 2, 3, 6}); - K.insert_simplex({4, 5, 3}); - K.insert_simplex({4, 5, 9}); + std::vector sigma1 = {1, 2, 3, 4}; + std::vector sigma2 = {5, 2, 3, 6}; + std::vector sigma3 = {4, 5, 3}; + std::vector sigma4 = {4, 5, 9}; + K.insert_simplex(sigma1); + K.insert_simplex(sigma2); + K.insert_simplex(sigma3); + K.insert_simplex(sigma4); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; BOOST_CHECK(K.num_maximal_simplices() == 4); - K.insert_simplex({5, 2, 7}); + std::vector sigma5 = {5, 2, 7}; + K.insert_simplex(sigma5); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; BOOST_CHECK(K.num_maximal_simplices() == 5); auto r = K.contraction(4,5); + std::cout << "r=" << r << std::endl; + BOOST_CHECK(r == 5); - std::cout << K.num_maximal_simplices(); + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; BOOST_CHECK(K.num_maximal_simplices() == 4); + std::vector sigma6 = {2, 7}; + K.remove_simplex(sigma6); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 4); + + K.remove_simplex(sigma2); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 6); +} + +BOOST_AUTO_TEST_CASE(lazy_toplex_map_num_maximal_simplices) { + using Vertex = Gudhi::Lazy_Toplex_map::Vertex; + + Gudhi::Lazy_Toplex_map K; + std::vector sigma1 = {1, 2, 3, 4}; + std::vector sigma2 = {5, 2, 3, 6}; + std::vector sigma3 = {4, 5, 3}; + std::vector sigma4 = {4, 5, 9}; + K.insert_simplex(sigma1); + K.insert_simplex(sigma2); + K.insert_simplex(sigma3); + K.insert_simplex(sigma4); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 4); + + std::vector sigma5 = {5, 2, 7}; + K.insert_simplex(sigma5); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 5); + + auto r = K.contraction(4,5); + std::cout << "r=" << r << std::endl; + BOOST_CHECK(r == 5); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 5); + + std::vector sigma6 = {2, 7}; + K.remove_simplex(sigma6); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 6); + + K.remove_simplex(sigma2); + + std::cout << "num_maximal_simplices" << K.num_maximal_simplices() << std::endl; + BOOST_CHECK(K.num_maximal_simplices() == 9); + } BOOST_AUTO_TEST_CASE(toplex_map_maximality) { -- cgit v1.2.3