From d74653ece0fd58ae797e50687bc62c02640cca13 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 28 Apr 2014 16:18:13 +0200 Subject: [PATCH 1/8] Replace std::map by boost::unordered_map in TDS_3::incident_edges --- .../Triangulation_3/incident_edges.cpp | 41 +++++++++++++++++++ .../CGAL/Triangulation_data_structure_3.h | 6 +++ 2 files changed, 47 insertions(+) create mode 100644 Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp diff --git a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp new file mode 100644 index 00000000000..60a1c96a793 --- /dev/null +++ b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp @@ -0,0 +1,41 @@ + +#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET + +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Delaunay_triangulation_3 DT; +typedef K::Point_3 Point_3; +typedef CGAL::Timer Timer; + +int main() +{ + + std::vector points; + Point_3 p; + + while(std::cin >> p){ + points.push_back(p); + } + DT dt; + dt.insert(points.begin(), points.end()); + + Timer timer; + timer.start(); + int N = 0; + for(int i = 0; i < 5; i++){ + for(DT::Vertex_iterator vit = dt.vertices_begin(); vit!= dt.vertices_end(); ++vit){ + std::vector E; + E.reserve(64); + dt.incident_edges(vit,std::back_inserter(E)); + N += E.size(); + } + } + timer.stop(); + + std::cerr << N << std::endl << timer.time() << " sec" << std::endl; + return 0; +} diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 29520c89443..6b410c7f8f9 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -33,6 +33,8 @@ #include #include +#include + #include #include @@ -820,7 +822,11 @@ public: template class Vertex_extractor { Vertex_handle v; +#ifdef CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET + boost::unordered_set tmp_vertices; +#else std::set tmp_vertices; +#endif Treatment treat; const Tds* t; Filter filter; From 3812e53d6464b4bbef54e2183b7f6ec1521bcbe4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 29 Apr 2014 06:47:32 +0200 Subject: [PATCH 2/8] Add flat_set --- .../benchmark/Triangulation_3/incident_edges.cpp | 3 ++- .../include/CGAL/Triangulation_data_structure_3.h | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp index 60a1c96a793..6a768f4683f 100644 --- a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp +++ b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp @@ -1,5 +1,6 @@ -#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET +//#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET +#define CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 6b410c7f8f9..a428a205d83 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -34,7 +34,7 @@ #include #include - +#include #include #include @@ -824,6 +824,8 @@ public: Vertex_handle v; #ifdef CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET boost::unordered_set tmp_vertices; +#elif defined (CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET) + boost::container::flat_set tmp_vertices; #else std::set tmp_vertices; #endif @@ -832,7 +834,12 @@ public: Filter filter; public: Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): - v(_v), treat(_output), t(_t), filter(_filter) {} + v(_v), treat(_output), t(_t), filter(_filter) { +#ifdef CGAL_VERTEX_EXTRACTOR_USE_FLAT_MAP + tmp_vertices.reserve(64); +#endif + } + void operator()(Cell_handle c) { for (int j=0; j<= t->dimension(); ++j) { Vertex_handle w = c->vertex(j); From 09876e23fa5f578d28c6615224e83d0e06fa9156 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 29 Apr 2014 14:04:27 +0200 Subject: [PATCH 3/8] Add bool visited to the Vertex in order to avoid a map --- .../Triangulation_3/incident_edges.cpp | 3 ++- .../CGAL/Triangulation_data_structure_3.h | 25 ++++++++++++++++--- .../CGAL/Triangulation_ds_vertex_base_3.h | 6 +++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp index 6a768f4683f..d28ac4ae3ff 100644 --- a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp +++ b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp @@ -1,6 +1,7 @@ //#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET -#define CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET +// #define CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET +#define CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index a428a205d83..fdad9a5d7cc 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -822,11 +822,11 @@ public: template class Vertex_extractor { Vertex_handle v; -#ifdef CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET +#if defined( CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET ) boost::unordered_set tmp_vertices; -#elif defined (CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET) +#elif defined( CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET ) boost::container::flat_set tmp_vertices; -#else +#elif defined( CGAL_VERTEX_EXTRACTOR_USE_SET ) std::set tmp_vertices; #endif Treatment treat; @@ -845,10 +845,18 @@ public: Vertex_handle w = c->vertex(j); if(filter(w)) continue; - if (w != v) + if (w != v){ +#if defined (CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX) + if(! w->visited){ + w->visited = true; + treat(c, v, j); + } +#else if(tmp_vertices.insert(w).second) { treat(c, v, j); } +#endif + } } } @@ -1046,6 +1054,15 @@ public: { (*cit)->tds_data().clear(); visit(*cit); + } + for(cit = tmp_cells.begin(); + cit != tmp_cells.end(); + ++cit) + { + (*cit)->vertex(0)->visited = false; + (*cit)->vertex(1)->visited = false; + (*cit)->vertex(2)->visited = false; + (*cit)->vertex(3)->visited = false; } return visit.result(); } diff --git a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h index 27f62fb3c0d..9d907900b9e 100644 --- a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h @@ -37,10 +37,10 @@ public: struct Rebind_TDS { typedef Triangulation_ds_vertex_base_3 Other; }; Triangulation_ds_vertex_base_3() - : _c() {} + : _c(), visited(false) {} Triangulation_ds_vertex_base_3(Cell_handle c) - : _c(c) {} + : _c(c), visited(false) {} Cell_handle cell() const { return _c; } @@ -64,6 +64,8 @@ public: private: Cell_handle _c; + public: + bool visited; }; template < class TDS > From d1a6046fcd3acc166b852205fbb4e4f6fec6cd9d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 7 May 2014 11:00:05 +0200 Subject: [PATCH 4/8] Vertex_extractor gets a partial specialisation for Vertex::Has_visited --- .../Triangulation_3/incident_edges.cpp | 2 +- .../CGAL/Triangulation_data_structure_3.h | 72 +++++++++++++++---- .../CGAL/Triangulation_ds_vertex_base_3.h | 1 + 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp index d28ac4ae3ff..c1643deea28 100644 --- a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp +++ b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp @@ -1,7 +1,7 @@ //#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET // #define CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET -#define CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX +//#define CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index fdad9a5d7cc..71efdddfc05 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -816,17 +816,19 @@ public: } }; + template + class Vertex_extractor; // Visitor for visit_incident_cells: // outputs the result of Treatment applied to the vertices template - class Vertex_extractor { + class Vertex_extractor { Vertex_handle v; #if defined( CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET ) boost::unordered_set tmp_vertices; #elif defined( CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET ) boost::container::flat_set tmp_vertices; -#elif defined( CGAL_VERTEX_EXTRACTOR_USE_SET ) +#else std::set tmp_vertices; #endif Treatment treat; @@ -835,7 +837,7 @@ public: public: Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): v(_v), treat(_output), t(_t), filter(_filter) { -#ifdef CGAL_VERTEX_EXTRACTOR_USE_FLAT_MAP +#if defined( CGAL_VERTEX_EXTRACTOR_USE_FLAT_MAP ) tmp_vertices.reserve(64); #endif } @@ -846,26 +848,68 @@ public: if(filter(w)) continue; if (w != v){ -#if defined (CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX) - if(! w->visited){ - w->visited = true; - treat(c, v, j); - } -#else + if(tmp_vertices.insert(w).second) { treat(c, v, j); } -#endif + } } } + CGAL::Emptyset_iterator facet_it() {return CGAL::Emptyset_iterator();} OutputIterator result() { return treat.result(); } }; + template + class Vertex_extractor { + Vertex_handle v; + std::vector tmp_vertices; + + Treatment treat; + const Tds* t; + Filter filter; + public: + Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): + v(_v), treat(_output), t(_t), filter(_filter) { + tmp_vertices.reserve(64); + } + + void operator()(Cell_handle c) { + for (int j=0; j<= t->dimension(); ++j) { + Vertex_handle w = c->vertex(j); + if(filter(w)) + continue; + if (w != v){ + + if(! w->visited){ + w->visited = true; + tmp_vertices.push_back(w); + treat(c, v, j); + } + } + } + } + + ~Vertex_extractor() + { + for(int i=0; i < tmp_vertices.size(); ++i){ + tmp_vertices[i]->visited = false; + } + } + + + CGAL::Emptyset_iterator facet_it() {return CGAL::Emptyset_iterator();} + OutputIterator result() { + return treat.result(); + } + }; + + + // Treatment for Vertex_extractor: // outputs the vertices template @@ -943,6 +987,8 @@ public: return incident_facets(v, facets); } + BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_member_visited,Has_visited,false) + template OutputIterator incident_edges(Vertex_handle v, OutputIterator edges, Filter f = Filter()) const @@ -965,7 +1011,7 @@ public: return edges; } return visit_incident_cells, - OutputIterator, Filter>, + OutputIterator, Filter, Has_member_visited::value>, OutputIterator>(v, edges, f); } @@ -1008,7 +1054,7 @@ public: return vertices; } return visit_incident_cells, - OutputIterator, Filter>, + OutputIterator, Filter, Has_member_visited::value>, OutputIterator>(v, vertices, f); } @@ -1055,6 +1101,7 @@ public: (*cit)->tds_data().clear(); visit(*cit); } +#if 0 // this is now done in ~Vertex_extractor() for(cit = tmp_cells.begin(); cit != tmp_cells.end(); ++cit) @@ -1064,6 +1111,7 @@ public: (*cit)->vertex(2)->visited = false; (*cit)->vertex(3)->visited = false; } +#endif return visit.result(); } diff --git a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h index 9d907900b9e..ab08f5429fb 100644 --- a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h @@ -65,6 +65,7 @@ public: private: Cell_handle _c; public: + //typedef bool Has_visited; bool visited; }; From 2ed094d23c1253fbceec284e26ba03013bea04af Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 7 May 2014 11:14:36 +0200 Subject: [PATCH 5/8] cleanup --- .../Triangulation_3/incident_edges.cpp | 3 -- .../CGAL/Triangulation_data_structure_3.h | 32 ++++--------------- .../CGAL/Triangulation_ds_vertex_base_3.h | 14 +++++--- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp index c1643deea28..380f16415fa 100644 --- a/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp +++ b/Triangulation_3/benchmark/Triangulation_3/incident_edges.cpp @@ -1,7 +1,4 @@ -//#define CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET -// #define CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET -//#define CGAL_VERTEX_EXTRACTOR_USE_BOOL_IN_VERTEX #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 71efdddfc05..463b3abca01 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -824,22 +823,15 @@ public: template class Vertex_extractor { Vertex_handle v; -#if defined( CGAL_VERTEX_EXTRACTOR_USE_UNORDERED_SET ) + boost::unordered_set tmp_vertices; -#elif defined( CGAL_VERTEX_EXTRACTOR_USE_FLAT_SET ) - boost::container::flat_set tmp_vertices; -#else - std::set tmp_vertices; -#endif + Treatment treat; const Tds* t; Filter filter; public: Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): v(_v), treat(_output), t(_t), filter(_filter) { -#if defined( CGAL_VERTEX_EXTRACTOR_USE_FLAT_MAP ) - tmp_vertices.reserve(64); -#endif } void operator()(Cell_handle c) { @@ -885,8 +877,8 @@ public: continue; if (w != v){ - if(! w->visited){ - w->visited = true; + if(! w->visited_for_vertex_extractor){ + w->visited_for_vertex_extractor = true; tmp_vertices.push_back(w); treat(c, v, j); } @@ -897,7 +889,7 @@ public: ~Vertex_extractor() { for(int i=0; i < tmp_vertices.size(); ++i){ - tmp_vertices[i]->visited = false; + tmp_vertices[i]->visited_for_vertex_extractor = false; } } @@ -987,7 +979,7 @@ public: return incident_facets(v, facets); } - BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_member_visited,Has_visited,false) + BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_member_visited,Has_visited_for_vertex_extractor,false) template OutputIterator @@ -1101,17 +1093,7 @@ public: (*cit)->tds_data().clear(); visit(*cit); } -#if 0 // this is now done in ~Vertex_extractor() - for(cit = tmp_cells.begin(); - cit != tmp_cells.end(); - ++cit) - { - (*cit)->vertex(0)->visited = false; - (*cit)->vertex(1)->visited = false; - (*cit)->vertex(2)->visited = false; - (*cit)->vertex(3)->visited = false; - } -#endif + return visit.result(); } diff --git a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h index ab08f5429fb..b60eb717c14 100644 --- a/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_ds_vertex_base_3.h @@ -37,10 +37,12 @@ public: struct Rebind_TDS { typedef Triangulation_ds_vertex_base_3 Other; }; Triangulation_ds_vertex_base_3() - : _c(), visited(false) {} + : _c(), visited_for_vertex_extractor(false) + {} Triangulation_ds_vertex_base_3(Cell_handle c) - : _c(c), visited(false) {} + : _c(c), visited_for_vertex_extractor(false) + {} Cell_handle cell() const { return _c; } @@ -64,9 +66,13 @@ public: private: Cell_handle _c; + + // The typedef and the bool are used by Triangulation_data_structure::Vertex_extractor + // The names are chooses complicated so that we do not have to document them + // (privacy by obfuscation) public: - //typedef bool Has_visited; - bool visited; + typedef bool Has_visited_for_vertex_extractor; + bool visited_for_vertex_extractor; }; template < class TDS > From 3cc64eb19e57f912e913a615b2c317d08d28c198 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 7 May 2014 11:51:25 +0200 Subject: [PATCH 6/8] Call unordered_set::reserve() --- Triangulation_3/include/CGAL/Triangulation_data_structure_3.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 463b3abca01..63b377db2b6 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -831,7 +831,9 @@ public: Filter filter; public: Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): - v(_v), treat(_output), t(_t), filter(_filter) { + v(_v), treat(_output), t(_t), filter(_filter) + { + tmp_vertices.reserve(64); } void operator()(Cell_handle c) { From 1ff9694206167784df17b7f041e354ce757b7585 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 8 May 2014 13:41:33 +0200 Subject: [PATCH 7/8] int -> std::size_t --- Triangulation_3/include/CGAL/Triangulation_data_structure_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 63b377db2b6..e7024c0a483 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -890,7 +890,7 @@ public: ~Vertex_extractor() { - for(int i=0; i < tmp_vertices.size(); ++i){ + for(std::size_t i=0; i < tmp_vertices.size(); ++i){ tmp_vertices[i]->visited_for_vertex_extractor = false; } } From 3d0e6f2a4f1ba2a9982c6c8055a89766b077b7ef Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 9 May 2014 11:08:38 +0200 Subject: [PATCH 8/8] boost::unorerdered_set::reserve() was only introduced with Boost 1.50 --- Triangulation_3/include/CGAL/Triangulation_data_structure_3.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index e7024c0a483..c0299a16fbc 100644 --- a/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -833,7 +833,9 @@ public: Vertex_extractor(Vertex_handle _v, OutputIterator _output, const Tds* _t, Filter _filter): v(_v), treat(_output), t(_t), filter(_filter) { +#if ( BOOST_VERSION >= 105000 ) tmp_vertices.reserve(64); +#endif } void operator()(Cell_handle c) {