summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--biblio/bibliography.bib72
-rwxr-xr-x[-rw-r--r--]scripts/generate_version.sh0
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/Contraction/example/Rips_contraction.cpp64
-rw-r--r--src/Contraction/include/gudhi/Contraction/Edge_profile.h27
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h27
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h30
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h31
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h27
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h28
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h31
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h29
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h31
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h31
-rw-r--r--src/Contraction/include/gudhi/Edge_contraction.h23
-rw-r--r--src/Contraction/include/gudhi/Skeleton_blocker_contractor.h33
-rw-r--r--src/Contraction/test/TestContraction.cpp28
-rw-r--r--src/Doxyfile19
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h58
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h27
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h27
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree.h2
-rw-r--r--src/Skeleton_blocker/concept/SkeletonBlockerDS.h12
-rw-r--r--src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h15
-rw-r--r--src/Skeleton_blocker/doc/SkeletonBlockerMainPage.h156
-rw-r--r--src/Skeleton_blocker/doc/blocker_curve.svg2177
-rw-r--r--src/Skeleton_blocker/doc/blockers_curve.pngbin0 -> 38135 bytes
-rw-r--r--src/Skeleton_blocker/doc/ds_representation.pngbin0 -> 36412 bytes
-rw-r--r--src/Skeleton_blocker/doc/ds_representation.svg470
-rw-r--r--src/Skeleton_blocker/doc/ds_scheme.svg477
-rw-r--r--src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp22
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h187
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h29
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h54
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h33
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h35
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h22
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h38
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h28
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h245
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h33
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h29
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h30
-rw-r--r--src/Skeleton_blocker/test/TestSimplifiable.cpp37
-rw-r--r--src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp41
-rw-r--r--src/common/doc/Gudhi_banner.jpgbin0 -> 34437 bytes
-rw-r--r--src/common/doc/main_page.h50
-rw-r--r--src/common/include/gudhi/Clock.h27
-rw-r--r--src/common/include/gudhi/Off_reader.h35
-rw-r--r--src/common/include/gudhi/Utils.h30
-rw-r--r--src/common/include/gudhi/iofile.h236
58 files changed, 4479 insertions, 911 deletions
diff --git a/biblio/bibliography.bib b/biblio/bibliography.bib
index eec8c14f..b02929ab 100644
--- a/biblio/bibliography.bib
+++ b/biblio/bibliography.bib
@@ -228,6 +228,42 @@ language={English},
}
%------------------------------------------------------------------
+@article{blockers2012,
+ author = {Dominique Attali and
+ Andr{\'e} Lieutier and
+ David Salinas},
+ title = {Efficient Data Structure for Representing and Simplifying
+ Simplicial complexes in High Dimensions},
+ journal = {Int. J. Comput. Geometry Appl.},
+ volume = {22},
+ number = {4},
+ year = {2012},
+ pages = {279-304},
+ ee = {http://dx.doi.org/10.1142/S0218195912600060},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+%------------------------------------------------------------------
+@article{rips2012,
+ hal_id = {hal-00785072},
+ url = {http://hal.archives-ouvertes.fr/hal-00785072},
+ title = {{Vietoris-Rips Complexes also Provide Topologically Correct Reconstructions of Sampled Shapes}},
+ author = {Attali, Dominique and Lieutier, Andr{\'e} and Salinas, David},
+ keywords = {Shape reconstruction \sep Rips complexes \sep clique complexes \sep \v Cech complexes ; homotopy equivalence ; collapses ; high dimensions},
+ language = {Anglais},
+ affiliation = {Grenoble Images Parole Signal Automatique - GIPSA-lab , Laboratoire Jean Kuntzmann - LJK},
+ pages = {448-465},
+ journal = {Computational Geometry},
+ volume = {46},
+ number = {4, special issue },
+ audience = {internationale },
+ doi = {10.1016/j.comgeo.2012.02.009 },
+ year = {2012},
+ pdf = {http://hal.archives-ouvertes.fr/hal-00785072/PDF/2012-cgta-Rips.pdf},
+}
+
+
+%------------------------------------------------------------------
@article{DBLP:journals/corr/abs-1210-1429,
author = {Pawel Dlotko and
Hubert Wagner},
@@ -373,6 +409,37 @@ proceedings{DBLP:conf/issac/1996,
bibsource = {DBLP, http://dblp.uni-trier.de}
}
+
+proceedings{DBLP:conf/issac/1996,
+ editor = {Erwin Engeler and
+ B. F. Caviness and
+ Yagati N. Lakshman},
+ title = {Proceedings of the 1996 International Symposium on Symbolic
+ and Algebraic Computation, ISSAC '96, Zurich, Switzerland,
+ July 24-26, 1996},
+ booktitle = {ISSAC},
+ publisher = {ACM},
+ year = {1996},
+ isbn = {0-89791-796-0},
+ ee = {http://dl.acm.org/citation.cfm?id=236869},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+
+@inproceedings{socg_blockers_2011,
+ author = {Attali, Dominique and Lieutier, Andr{\'e} and Salinas, David},
+ title = {Efficient data structure for representing and simplifying simplicial complexes in high dimensions},
+ booktitle = {Proceedings of the 27th annual ACM symposium on Computational geometry},
+ series = {SoCG '11},
+ year = {2011},
+ location = {Paris, France},
+ pages = {501--509},
+ numpages = {9},
+ keywords = {clique complexes, data structure, edge contraction, flag complexes, high dimensions, homotopy equivalence, shape reconstruction, shape simplification, simplicial complexes, vietoris-rips complexes},
+}
+
+
+
%------------------------------------------------------------------
%MISC
@@ -565,8 +632,7 @@ inproceedings{DBLP:conf/soda/1997,
-
-inproceedings{attali-rips_approx,
+@inproceedings{attali-rips_approx,
author = {Dominique Attali and
Andr{\'e} Lieutier and
David Salinas},
@@ -582,6 +648,8 @@ inproceedings{attali-rips_approx,
+
+
@article{Carlsson:2008:LBS:1325290.1325300,
author = {Carlsson, Gunnar and Ishkhanov, Tigran and Silva, Vin and Zomorodian, Afra},
title = {On the Local Behavior of Spaces of Natural Images},
diff --git a/scripts/generate_version.sh b/scripts/generate_version.sh
index 1a8ce4ab..1a8ce4ab 100644..100755
--- a/scripts/generate_version.sh
+++ b/scripts/generate_version.sh
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 04773b0a..c209a020 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -28,4 +28,5 @@ else()
add_subdirectory(example/Persistent_cohomology)
add_subdirectory(example/Skeleton_blocker)
add_subdirectory(example/Contraction)
+
endif()
diff --git a/src/Contraction/example/Rips_contraction.cpp b/src/Contraction/example/Rips_contraction.cpp
index acfb516d..2620b04f 100644
--- a/src/Contraction/example/Rips_contraction.cpp
+++ b/src/Contraction/example/Rips_contraction.cpp
@@ -1,9 +1,24 @@
-/*
- * Rips_contraction.cpp
- *
- * Created on: Nov 28, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#include <list>
#include <boost/timer/timer.hpp>
#include <iostream>
@@ -48,25 +63,28 @@ void build_rips(ComplexType& complex, double offset){
complex.add_edge(*p,*q);
}
+int main (int argc, char *argv[])
+{
+ if (argc!=3){
+ std::cerr << "Usage "<<argv[0]<<" GUDHIPATH/src/data/sphere3D.off 0.1 to load the file GUDHIPATH/src/data/sphere3D.off and contract the Rips complex built with paremeter 0.2.\n";
+ return -1;
+ }
-
-
-void test_contraction_rips(string name_file, double offset){
boost::timer::auto_cpu_timer t;
Complex complex;
// load the points
- Skeleton_blocker_off_reader<Complex> off_reader(name_file,complex,true);
+ Skeleton_blocker_off_reader<Complex> off_reader(argv[1],complex,true);
if(!off_reader.is_valid()){
- std::cerr << "Unable to read file:"<<name_file<<std::endl;
- return;
+ std::cerr << "Unable to read file:"<<argv[1]<<std::endl;
+ return EXIT_FAILURE;
}
- std::cerr << "build the Rips complex"<<std::endl;
+ std::cout << "build the Rips complex"<<std::endl;
- build_rips(complex,offset);
+ build_rips(complex,atof(argv[2]));
- std::cerr << "Initial complex has "<<
+ std::cout << "Initial complex has "<<
complex.num_vertices()<<" vertices, and "<<
complex.num_edges()<<" edges."<<std::endl;
@@ -77,24 +95,12 @@ void test_contraction_rips(string name_file, double offset){
contraction::make_remove_popable_blockers_visitor<Profile>());
contractor.contract_edges();
- std::cerr << "Resulting complex has "<<
+ std::cout << "Resulting complex has "<<
complex.num_vertices()<<" vertices, "<<
complex.num_edges()<<"edges and "<<
complex.num_blockers()<<" blockers"<<std::endl;
-
-}
-
-
-int main (int argc, char *argv[])
-{
- if (argc!=3){
- std::cerr << "Usage "<<argv[0]<<" GUDHIPATH/src/data/sphere3D.off 0.1 to load the file GUDHIPATH/src/data/sphere3D.off and contract the Rips complex built with paremeter 0.2.\n";
- return -1;
- }
-
- std::string name_file(argv[1]);
- test_contraction_rips(name_file,atof(argv[2]));
+ return EXIT_SUCCESS;
}
diff --git a/src/Contraction/include/gudhi/Contraction/Edge_profile.h b/src/Contraction/include/gudhi/Contraction/Edge_profile.h
index 7005f02c..f90bd71a 100644
--- a/src/Contraction/include/gudhi/Contraction/Edge_profile.h
+++ b/src/Contraction/include/gudhi/Contraction/Edge_profile.h
@@ -1,9 +1,24 @@
-/*
- * Edge_profile.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_EDGE_PROFILE_H_
#define GUDHI_EDGE_PROFILE_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h b/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
index ef670234..8ff19f20 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
@@ -1,9 +1,24 @@
-/*
- * Contraction_visitor.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_CONTRACTION_VISITOR_H_
#define GUDHI_CONTRACTION_VISITOR_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
index e183a74d..60ef3b5f 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
@@ -1,9 +1,24 @@
-/*
- * Cost_policy.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_COST_POLICY_H_
#define GUDHI_COST_POLICY_H_
@@ -14,6 +29,9 @@ namespace Gudhi{
namespace contraction {
+/**
+*@brief Policy to specify the cost of contracting an edge.
+*/
template< typename EdgeProfile> class Cost_policy{
public:
typedef typename EdgeProfile::Point Point;
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h b/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
index b0202fae..de473944 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
@@ -1,9 +1,24 @@
-/*
- * Dummy_valid_contraction.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_DUMMY_VALID_CONTRACTION_H_
#define GUDHI_DUMMY_VALID_CONTRACTION_H_
@@ -16,7 +31,9 @@ namespace contraction {
-
+ /**
+ *@brief Policy that accept all edge contraction.
+ */
template< typename EdgeProfile> class Dummy_valid_contraction : public Valid_contraction_policy<EdgeProfile>{
public:
typedef typename EdgeProfile::Point Point;
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h b/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
index 32c8768e..b22ada0d 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
@@ -1,9 +1,24 @@
-/*
- * Edge_length_cost.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_EDGE_LENGTH_COST_H_
#define GUDHI_EDGE_LENGTH_COST_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h b/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
index cad87e3e..93abac35 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
@@ -1,10 +1,24 @@
-/*
- * First_vertex_placement.h
- *
- * Created on: Feb 20, 2014
- * Author: David Salinas
- * Copyright 2013 INRIA. All rights reserved
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_FIRST_VERTEX_PLACEMENT_H_
#define GUDHI_FIRST_VERTEX_PLACEMENT_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h b/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
index 77fb6f95..31c02e43 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
@@ -1,9 +1,24 @@
-/*
- * Link_condition_valid_contraction.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_LINK_CONDITION_VALID_CONTRACTION_H_
#define GUDHI_LINK_CONDITION_VALID_CONTRACTION_H_
@@ -17,7 +32,9 @@ namespace Gudhi{
namespace contraction {
-
+ /**
+ *@brief Policy that only accept edges verifying the link condition (and therefore whose contraction preserving homotopy type).
+ */
template< typename EdgeProfile> class Link_condition_valid_contraction : public Valid_contraction_policy<EdgeProfile>{
public:
typedef typename EdgeProfile::Edge_handle Edge_handle;
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h b/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
index 872c6d80..30f0a570 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
@@ -1,9 +1,24 @@
-/*
- * Middle_placement.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_MIDDLE_PLACEMENT_H_
#define GUDHI_MIDDLE_PLACEMENT_H_
@@ -15,6 +30,8 @@ namespace Gudhi{
namespace contraction {
+
+
template< typename EdgeProfile> class Middle_placement : public Placement_policy<EdgeProfile>{
public:
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
index 78595f3b..37b36dfe 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
@@ -1,9 +1,24 @@
-/*
- * Placement_policy.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_PLACEMENT_POLICY_H_
#define GUDHI_PLACEMENT_POLICY_H_
@@ -13,6 +28,10 @@
namespace Gudhi {
namespace contraction {
+
+ /**
+ *@brief Policy to specify where the merged point had to be placed after an edge contraction.
+ */
template< typename EdgeProfile> class Placement_policy{
public:
typedef typename EdgeProfile::Point Point;
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
index f6016e2d..a053042b 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
@@ -1,15 +1,34 @@
-/*
- * Valid_contraction_policy.h
- *
- * Created on: Feb 13, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_VALID_CONTRACTION_POLICY_H_
#define GUDHI_VALID_CONTRACTION_POLICY_H_
namespace Gudhi {
namespace contraction {
+
+ /**
+ *@brief Policy to specify if an edge contraction is valid or not.
+ */
template< typename EdgeProfile> class Valid_contraction_policy{
public:
typedef typename EdgeProfile::Point Point;
diff --git a/src/Contraction/include/gudhi/Edge_contraction.h b/src/Contraction/include/gudhi/Edge_contraction.h
index 049e3d81..6b6dab69 100644
--- a/src/Contraction/include/gudhi/Edge_contraction.h
+++ b/src/Contraction/include/gudhi/Edge_contraction.h
@@ -1,8 +1,23 @@
-/*
- * Edge_contraction.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: Nov 28, 2014
- * Author: dsalinas
+ * 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 <http://www.gnu.org/licenses/>.
*/
#ifndef GUDHI_EDGE_CONTRACTION_H_
diff --git a/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h b/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
index 4dc7952c..56f4891f 100644
--- a/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
+++ b/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
@@ -1,8 +1,23 @@
-/*
- * Skeleton_blocker_contractor.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 11, 2014
- * Author: dsalinas
+ * 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 <http://www.gnu.org/licenses/>.
*/
#ifndef GUDHI_SKELETON_BLOCKER_CONTRACTOR_H_
@@ -13,7 +28,6 @@
// todo remove the queue to be independent from cgald
#include "gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h"
-//#include <CGAL/Modifiable_priority_queue.h>
#include <list>
@@ -53,7 +67,9 @@ Valid_contraction_policy<Profile>* make_link_valid_contraction(){
}
-// visitor that remove popable blockers after an edge contraction
+/**
+*@brief Visitor to remove popable blockers after an edge contraction.
+*/
template <class Profile>
class Contraction_visitor_remove_popable : public Contraction_visitor<Profile>{
public:
@@ -101,9 +117,9 @@ Contraction_visitor<Profile>* make_remove_popable_blockers_visitor(){
*@class Skeleton_blocker_contractor
*@brief Class that allows to contract iteratively edges of a simplicial complex.
*
- * @details Basically, the simplification algorithm consists in iteratively picking the
+ * @details The simplification algorithm consists in iteratively picking the
* edge with lowest cost and performing an edge contraction if the contraction is valid.
- * This class is policy based (and much inspired from the edge collapse package of CGAL).
+ * This class is policy based (and much inspired from the edge collapse package of CGAL http://doc.cgal.org/latest/Surface_mesh_simplification/index.html).
*
* Policies that can be changed are :
* - the cost policy : how much cost an edge contraction
@@ -111,7 +127,6 @@ Contraction_visitor<Profile>* make_remove_popable_blockers_visitor(){
* - the valid contraction policy : is the contraction valid. For instance, it can be
* a topological condition (link condition) or a geometrical condition (normals messed up).
*
- * TODO expliquer la pile
*/
template<
class GeometricSimplifiableComplex,
diff --git a/src/Contraction/test/TestContraction.cpp b/src/Contraction/test/TestContraction.cpp
index 1090c054..872f24a0 100644
--- a/src/Contraction/test/TestContraction.cpp
+++ b/src/Contraction/test/TestContraction.cpp
@@ -1,9 +1,24 @@
-/*
- * TestContraction.cxx
- *
- * Created on: Feb 11, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#include <ctime>
#include <list>
@@ -12,7 +27,6 @@
//#include "Skeleton_blocker/Simplex.h"
#include "gudhi/Skeleton_blocker_contractor.h"
#include "gudhi/Utils.h"
-#include "gudhi/iofile.h"
#include "gudhi/Test.h"
#include "gudhi/Skeleton_blocker_geometric_complex.h"
//#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
diff --git a/src/Doxyfile b/src/Doxyfile
index 3493d7c6..420824f4 100644
--- a/src/Doxyfile
+++ b/src/Doxyfile
@@ -831,7 +831,8 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH = doc/
+IMAGE_PATH = Skeleton_blocker/doc/ \
+ common/doc/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1895,7 +1896,7 @@ ENABLE_PREPROCESSING = YES
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-MACRO_EXPANSION = NO
+MACRO_EXPANSION = YES
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
@@ -1903,7 +1904,7 @@ MACRO_EXPANSION = NO
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_ONLY_PREDEF = NO
+EXPAND_ONLY_PREDEF = YES
# If the SEARCH_INCLUDES tag is set to YES the includes files in the
# INCLUDE_PATH will be searched if a #include is found.
@@ -1935,7 +1936,7 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED =
+PREDEFINED = protected=private
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
@@ -2018,7 +2019,7 @@ PERL_PATH = /usr/bin/perl
# powerful graphs.
# The default value is: YES.
-CLASS_DIAGRAMS = YES
+CLASS_DIAGRAMS = NO
# You can define message sequence charts within doxygen comments using the \msc
# command. Doxygen will then run the mscgen tool (see:
@@ -2091,7 +2092,7 @@ DOT_FONTPATH =
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-CLASS_GRAPH = YES
+CLASS_GRAPH = NO
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
@@ -2100,7 +2101,7 @@ CLASS_GRAPH = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-COLLABORATION_GRAPH = YES
+COLLABORATION_GRAPH = NO
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies.
@@ -2165,7 +2166,7 @@ INCLUDED_BY_GRAPH = YES
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-CALL_GRAPH = YES
+CALL_GRAPH = NO
# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
# dependency graph for every global function or class method.
@@ -2176,7 +2177,7 @@ CALL_GRAPH = YES
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-CALLER_GRAPH = YES
+CALLER_GRAPH = NO
# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
# hierarchy of all classes instead of a textual one.
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
index f638a0fb..27d64b8a 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
@@ -42,15 +42,22 @@ namespace Gudhi {
namespace persistent_cohomology {
-/** \defgroup persistent_cohomology Persistent Cohomology Package
- *
- * Computation of persistent cohomology using the algorithm of
- * \cite DBLP:journals/dcg/SilvaMV11 and \cite DBLP:journals/corr/abs-1208-5018
- * and the Compressed Annotation Matrix
- * implementation of \cite DBLP:conf/esa/BoissonnatDM13
- *
- *
- *
+/** \defgroup persistent_cohomology Persistent Cohomology
+ *
+
+ Computation of persistent cohomology using the algorithm of
+ \cite DBLP:journals/dcg/SilvaMV11 and \cite DBLP:journals/corr/abs-1208-5018
+ and the Compressed Annotation Matrix
+ implementation of \cite DBLP:conf/esa/BoissonnatDM13
+
+ The theory of homology consists in attaching to a topological space a sequence of
+ (homology) groups,
+ capturing global topological features
+ like connected components, holes, cavities, etc. Persistent homology studies the evolution
+ -- birth, life and death -- of
+ these features when the topological space is changing. Consequently, the theory is essentially
+ composed of three elements:
+ topological spaces, their homology groups and an evolution scheme.
The theory of homology consists in attaching to a topological space a sequence of
(homology) groups,
@@ -154,18 +161,19 @@ 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
+ We provide several example files: run these examples with -h for details on their use, and read the README file.
+
+\li <CODE>rips_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram.
+\li <CODE>rips_multifield_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram
+with a family of field coefficients.
- <DT>Implementations:</DT>
- We use the <EM>Compressed Annotation Matrix</EM> of \cite DBLP:conf/esa/BoissonnatDM13 to
- implement the
- persistent cohomology algorithm of \cite DBLP:journals/dcg/SilvaMV11
- and \cite DBLP:conf/compgeom/DeyFW14 for persistence in the class Persistent_cohomology.
+\li <CODE>performance_rips_persistence.cpp</CODE> provides timings for the construction of the Rips complex on a set of
+points sampling a Klein bottle in \f$\mathbb{R}^5\f$ with a simplex tree, its conversion to a
+Hasse diagram and the computation of persistent homology and multi-field persistent homology for the
+different representations.
- The coefficient fields available as models of CoefficientField are Field_Zp
- for \f$\mathbb{Z}_p\f$ (for any prime p) and Multi_field for the multi-field persistence algorithm
- -- computing persistence simultaneously in various coefficient fields -- described
- in \cite boissonnat:hal-00922572.
\author Clément Maria
@@ -294,11 +302,11 @@ class Persistent_cohomology {
public:
/** \brief Initializes the coefficient field.*/
- void init_coefficients(uint8_t charac) {
+ void init_coefficients(uint16_t charac) {
coeff_field_.init(charac);
}
/** \brief Initializes the coefficient field for multi-field persistent homology.*/
- void init_coefficients(uint8_t charac_min, uint8_t charac_max) {
+ void init_coefficients(uint16_t charac_min, uint16_t charac_max) {
coeff_field_.init(charac_min, charac_max);
}
@@ -460,7 +468,7 @@ class Persistent_cohomology {
if (w_y != coeff_field_.additive_identity()) { // if != 0
result_insert_a_ds = map_a_ds.insert(std::pair<Simplex_key, Arith_element>(cell_ref.key_, w_y));
if (!(result_insert_a_ds.second)) { // if cell_ref.key_ already a Key in map_a_ds
- coeff_field_.plus_equal(result_insert_a_ds.first->second, w_y);
+ result_insert_a_ds.first->second = coeff_field_.plus_equal(result_insert_a_ds.first->second, w_y);
if (result_insert_a_ds.first->second == coeff_field_.additive_identity()) {
map_a_ds.erase(result_insert_a_ds.first);
}
@@ -632,16 +640,14 @@ class Persistent_cohomology {
Cell * cell_tmp = cell_pool_->construct(Cell(other_it->first // key
, coeff_field_.additive_identity(), &target));
- coeff_field_.plus_times_equal(cell_tmp->coefficient_,
- other_it->second, w);
+ cell_tmp->coefficient_ = coeff_field_.plus_times_equal(cell_tmp->coefficient_, other_it->second, w);
target.col_.insert(target_it, *cell_tmp);
++other_it;
} else { // it1->key == it2->key
// target_it->coefficient_ <- target_it->coefficient_ + other_it->second * w
- coeff_field_.plus_times_equal(target_it->coefficient_,
- other_it->second, w);
+ target_it->coefficient_ = coeff_field_.plus_times_equal(target_it->coefficient_, other_it->second, w);
if (target_it->coefficient_ == coeff_field_.additive_identity()) {
auto tmp_it = target_it;
++target_it;
@@ -660,7 +666,7 @@ class Persistent_cohomology {
}
while (other_it != other.end()) {
Cell * cell_tmp = cell_pool_->construct(Cell(other_it->first, coeff_field_.additive_identity(), &target));
- coeff_field_.plus_times_equal(cell_tmp->coefficient_, other_it->second, w);
+ cell_tmp->coefficient_ = coeff_field_.plus_times_equal(cell_tmp->coefficient_, other_it->second, w);
target.col_.insert(target.col_.end(), *cell_tmp);
++other_it;
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
index 49883a4a..419bd2eb 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
@@ -46,7 +46,7 @@ class Field_Zp {
add_id_all(0) {
}
- void init(uint8_t charac) {
+ void init(uint16_t charac) {
assert(charac != 0); // division by zero
Prime = charac;
inverse_.clear();
@@ -61,29 +61,26 @@ class Field_Zp {
}
/** Set x <- x + w * y*/
- void plus_times_equal(Element & x, Element y, Element w) {
+ Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
assert(Prime != 0); // division by zero
- x = (x + w * y) % Prime;
+ Element result = (x + w * y) % Prime;
+ if (result < 0)
+ result += Prime;
+ return result;
}
// operator= defined on Element
/** Returns y * w */
- Element times(Element y, int w) {
- assert(Prime != 0); // division by zero
- Element res = (y * w) % Prime;
- if (res < 0)
- return res + Prime;
- else
- return res;
+ Element times(const Element& y, const Element& w) {
+ return plus_times_equal(0, y, (Element)w);
}
void clear_coefficient(Element x) {
}
- void plus_equal(Element & x, Element y) {
- assert(Prime != 0); // division by zero
- x = ((x + y) % Prime);
+ Element plus_equal(const Element& x, const Element& y) {
+ return plus_times_equal(x, y, (Element)1);
}
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
@@ -107,12 +104,12 @@ class Field_Zp {
}
/** \brief Returns the characteristic \f$p\f$ of the field.*/
- const uint8_t& characteristic() const {
+ const uint16_t& characteristic() const {
return Prime;
}
private:
- uint8_t Prime;
+ uint16_t Prime;
/** Property map Element -> Element, which associate to an element its inverse in the field.*/
std::vector<Element> inverse_;
const Element mult_id_all;
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
index 306877e7..91937c65 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
@@ -52,7 +52,7 @@ class Multi_field {
/* Initialize the multi-field. The generation of prime numbers might fail with
* a very small probability.*/
- void init(uint8_t min_prime, uint8_t max_prime) {
+ void init(uint16_t min_prime, uint16_t max_prime) {
if (max_prime < 2) {
std::cerr << "There is no prime less than " << max_prime << std::endl;
}
@@ -61,7 +61,7 @@ class Multi_field {
<< std::endl;
}
// fill the list of prime numbers
- uint8_t curr_prime = min_prime;
+ uint16_t curr_prime = min_prime;
mpz_t tmp_prime;
mpz_init_set_ui(tmp_prime, min_prime);
// test if min_prime is prime
@@ -132,18 +132,12 @@ class Multi_field {
}
/** Returns y * w */
- Element times(const Element& y, int w) {
- assert(prod_characteristics_ != 0); // division by zero
- Element tmp = (y * w) % prod_characteristics_;
- if (tmp < 0)
- return prod_characteristics_ + tmp;
- return tmp;
+ Element times(const Element& y, const Element& w) {
+ return plus_times_equal(0, y, w);
}
- void plus_equal(Element & x, const Element& y) {
- assert(prod_characteristics_ != 0); // division by zero
- x += y;
- x %= prod_characteristics_;
+ Element plus_equal(const Element& x, const Element& y) {
+ return plus_times_equal(x, y, (Element)1);
}
/** \brief Returns the characteristic \f$p\f$ of the field.*/
@@ -172,14 +166,17 @@ class Multi_field {
}
/** Set x <- x + w * y*/
- void plus_times_equal(Element & x, const Element& y, const Element& w) {
+ Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
assert(prod_characteristics_ != 0); // division by zero
- x = (x + w * y) % prod_characteristics_;
+ Element result = (x + w * y) % prod_characteristics_;
+ if (result < 0)
+ result += prod_characteristics_;
+ return result;
}
Element prod_characteristics_; // product of characteristics of the fields
// represented by the multi-field class
- std::vector<uint8_t> primes_; // all the characteristics of the fields
+ std::vector<uint16_t> primes_; // all the characteristics of the fields
std::vector<Element> Uvect_;
Element mult_id_all;
const Element add_id_all;
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h
index db7ad2b8..12be6e5d 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h
@@ -38,7 +38,7 @@
namespace Gudhi {
-/** \defgroup simplex_tree Filtered Complexes Package
+/** \defgroup simplex_tree Filtered Complexes
*
* A simplicial complex \f$\mathbf{K}\f$
* on a set of vertices \f$V = \{1, \cdots ,|V|\}\f$ is a collection of simplices
diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
index 1fa9dc06..c0386590 100644
--- a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
+++ b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
@@ -16,17 +16,15 @@ namespace skbl {
-/** \brief Concept that must be passed to
- * the template class Skeleton_blockers_complex
- *
+/** \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
{
/**
- * @todo faire un default value pour les vertex_handle
- */
-
- /**
* @brief index that allows to find the vertex in the boost graph
*/
typedef int boost_vertex_handle;
diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
index 23edaaef..fad680d0 100644
--- a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
+++ b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
@@ -9,10 +9,15 @@
#ifndef GUDHI_SKELETONBLOCKERGEOMETRICDS_H_
#define GUDHI_SKELETONBLOCKERGEOMETRICDS_H_
-/** \brief Concept that must be passed to
- * the template class Skeleton_blocker_geometric_complex
- *
+/**
+ * \brief Concept for template class of Skeleton_blocker_geometric_complex .
+ * It must specify a GeometryTrait which contains a Point definition.
+ *
+ * Graph_vertex must specify how to access to a point.
+ * Graph_edge must specify how to access to an index.
+ *
*/
+ //todo the index is just for contraction, to remove
template<typename GeometryTrait>
struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS
{
@@ -35,11 +40,11 @@ struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS
/**
* @brief Access to the point.
*/
- Point& point(){ return point_; }
+ Point& point();
/**
* @brief Access to the point.
*/
- const Point& point() const { return point_; }
+ const Point& point();
};
/**
diff --git a/src/Skeleton_blocker/doc/SkeletonBlockerMainPage.h b/src/Skeleton_blocker/doc/SkeletonBlockerMainPage.h
deleted file mode 100644
index 5a80bc8d..00000000
--- a/src/Skeleton_blocker/doc/SkeletonBlockerMainPage.h
+++ /dev/null
@@ -1,156 +0,0 @@
-
-/*! \mainpage Skeleton blockers data-structure
-
-\author David Salinas
-
-\section Introduction
-The Skeleton-blocker data-structure had been introduced in the two papers
-\cite skbl_socg2011 \cite skbl_ijcga2012.
-It proposes a light encoding for simplicial complexes by storing only an *implicit* representation of its
-simplices.
-Intuitively, it just stores the 1-skeleton of a simplicial complex with a graph and the set of its "missing faces" that
-is very small in practice (see next section for a formal definition).
-This data-structure handles every classical operations used for simplicial complexes such as
- as simplex enumeration or simplex removal but operations that are particularly efficient
- are operations that do not require simplex enumeration such as edge iteration, link computation or simplex contraction.
-
-
-\todo{image wont include}
-
-\section Definitions
-
-We recall briefly classical definitions of simplicial complexes \cite Munkres.
-An abstract simplex is a finite non-empty set and its dimension is its number of elements minus 1.
-Whenever \f$\tau \subset \sigma\f$ and \f$\tau \neq \emptyset \f$, \f$ \tau \f$ is called a face of
-\f$ \sigma\f$ and \f$ \sigma\f$ is called a coface of \f$ \tau \f$ . Furthermore,
-when \f$ \tau \neq \sigma\f$ we say that \f$ \tau\f$ is a proper-face of \f$ \sigma\f$.
-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 latex "images/ds_representation.eps" "My application" width=10cm
-
-
-To encode, a simplicial complex, one can encodes all its simplices.
-In case when this number gets too large,
-a lighter and implicit version consists of encoding only its graph plus some elements called missing faces or blockers.
-A blocker is a simplex of dimension greater than 1
-that does not belong to the complex but whose all proper faces does.
-
-
-Remark that for a clique complex (i.e. a simplicial complex whose simplices are cliques of its graph), the set of blockers
-is empty and the data-structure is then particularly sparse.
-One famous example of clique-complex is the Rips complex which is intensively used
-in topological data-analysis.
-In practice, the set of blockers of a simplicial complex
-remains also small when simplifying a Rips complex with edge contractions
-but also for most of the simplicial complexes used in topological data-analysis such as Delaunay, Cech or Witness complexes.
-For instance, the numbers of blockers is depicted for a random 3 dimensional sphere embedded into \f$R^4\f$
-in figure X.
-
-
-\image latex "images/blockers_curve.eps" "My application" width=10cm
-
-
-
-
-\section API
-
-\subsection Overview
-
-Four classes define a simplicial complex namely :
-
-\li <Code>Skeleton_blocker_complex</Code> : a simplicial complex with basic operations such as vertex/edge/simplex enumeration and construction
-\li <Code>Skeleton_blocker_link_complex</Code> : the link of a simplex in a parent complex. It is represented as a sub complex
-of the parent complex
-\li <Code>Skeleton_blocker_simplifiable_complex</Code> : a simplicial complex with simplification operations such as edge contraction or simplex collapse
-\li <Code>Skeleton_blocker_geometric_complex</Code> : a simplicial complex who has access to geometric points in \f$R^d\f$
-
-The two last classes are derived classes from the <Code>Skeleton_blocker_complex</Code> class. The class <Code>Skeleton_blocker_link_complex</Code> inheritates from a template passed parameter
-that may be either <Code>Skeleton_blocker_complex</Code> or <Code>Skeleton_blocker_geometric_complex</Code> (a link may store points coordinates or not).
-
-\todo{include links}
-
-\subsection Visitor
-
-The class <Code>Skeleton_blocker_complex</Code> 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
-<Code>Contraction</Code> package).
-
-
-
-\section Example
-
-
-\subsection s Iterating through vertices, edges, blockers and simplices
-
-Iteration through vertices, edges, simplices or blockers is straightforward with c++11 for range loops.
-Note that simplex iteration with this implicit data-structure just takes
-a few more time compared to iteration via an explicit representation
-such as the Simplex Tree. The following example computes the Euler Characteristic
-of a simplicial complex.
-
- \code{.cpp}
- typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
- typedef Complex::Vertex_handle Vertex_handle;
- typedef Complex::Simplex_handle Simplex;
-
- const int n = 15;
-
- // build a full complex with 10 vertices and 2^n-1 simplices
- Complex complex;
- for(int i=0;i<n;i++)
- complex.add_vertex();
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- //note that add_edge adds the edge and all its cofaces
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
-
- // this is just to illustrate iterators, to count number of vertices
- // or edges, complex.num_vertices() and complex.num_edges() are
- // more appropriated!
- unsigned num_vertices = 0;
- for(auto v : complex.vertex_range()){
- ++num_vertices;
- }
-
- unsigned num_edges = 0;
- for(auto e : complex.edge_range())
- ++num_edges;
-
- unsigned euler = 0;
- unsigned num_simplices = 0;
- // we use a reference to a simplex instead of a copy
- // value here because a simplex is a set of integers
- // and copying it cost time
- for(const Simplex & s : complex.simplex_range()){
- ++num_simplices;
- if(s.dimension()%2 == 0)
- euler += 1;
- else
- euler -= 1;
- }
- std::cout << "Saw "<<num_vertices<<" vertices, "<<num_edges<<" edges and "<<num_simplices<<" simplices"<<std::endl;
- std::cout << "The Euler Characteristic is "<<euler<<std::endl;
- \endcode
-
-
-\verbatim
-./SkeletonBlockerIteration
-Saw 15 vertices, 105 edges and 32767 simplices
-The Euler Characteristic is 1
- 0.537302s wall, 0.530000s user + 0.000000s system = 0.530000s CPU (98.6%)
-\endverbatim
-
-
-
-\subsection Acknowledgements
-The author wishes to thank Dominique Attali and André Lieutier for
-their collaboration to write the two initial papers about this data-structure
- and also Dominique for leaving him use a prototype.
-
-
-\copyright GNU General Public License v3.
-\verbatim Contact: David Salinas, david.salinas@inria.fr \endverbatim
-
-*/
diff --git a/src/Skeleton_blocker/doc/blocker_curve.svg b/src/Skeleton_blocker/doc/blocker_curve.svg
new file mode 100644
index 00000000..0094a379
--- /dev/null
+++ b/src/Skeleton_blocker/doc/blocker_curve.svg
@@ -0,0 +1,2177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg5493"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="New document 8">
+ <defs
+ id="defs5495">
+ <clipPath
+ id="clipPath6477"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6479"
+ d="m 2963.67,3669.26 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6465"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6467"
+ d="m 2762.07,3669.26 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6427"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6429"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6409"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6411"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6399"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6401"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6381"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6383"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6371"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6373"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6353"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6355"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6343"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6345"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6325"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6327"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6315"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6317"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6297"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6299"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6287"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6289"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6269"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6271"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6259"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6261"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6241"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6243"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6231"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6233"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6211"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6213"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6189"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6191"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6169"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6171"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6149"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6151"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6129"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6131"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6109"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6111"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6089"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6091"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6077"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6079"
+ d="m 5151,431 33,0 0,35 -33,0 0,-35 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6065"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6067"
+ d="m 4705,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6053"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6055"
+ d="m 4258,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6041"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6043"
+ d="m 3812,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6029"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6031"
+ d="m 3365,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6017"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6019"
+ d="m 2919,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6005"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6007"
+ d="m 2473,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5993"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5995"
+ d="m 2026,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5981"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5983"
+ d="m 1580,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5969"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5971"
+ d="m 1133,431 66,0 0,34 -66,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5957"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5959"
+ d="m 720,431 42,0 0,34 -42,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5947"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5949"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5935"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5937"
+ d="m 5151,539 33,0 0,66 -33,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5923"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5925"
+ d="m 4705.12,525.621 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5911"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5913"
+ d="m 4258.71,513.121 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5899"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5901"
+ d="m 3812.3,499.84 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5887"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5889"
+ d="m 3365.9,482.852 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5875"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5877"
+ d="m 2919.49,469.379 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5863"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5865"
+ d="m 2473,454 66,0 0,66 -66,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5851"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5853"
+ d="m 2026.72,439.648 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5839"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5841"
+ d="m 1580,431 66,0 0,60 -66,0 0,-60 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5827"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5829"
+ d="m 1133,431 66,0 0,47 -66,0 0,-47 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5815"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5817"
+ d="m 720,431 42,0 0,34 -42,0 0,-34 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5805"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5807"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5793"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5795"
+ d="m 5151,3499 33,0 0,66 -33,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5781"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5783"
+ d="m 4705.12,3186.68 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5769"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5771"
+ d="m 4258.71,2878.83 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5757"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5759"
+ d="m 3812.3,2568.4 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5745"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5747"
+ d="m 3365.9,2251.56 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5733"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5735"
+ d="m 2919,1940 66,0 0,66 -66,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5721"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5723"
+ d="m 2473.09,1628.36 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5709"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5711"
+ d="m 2026.72,1312.93 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5697"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5699"
+ d="m 1580,1005 66,0 0,66 -66,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5685"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5687"
+ d="m 1133.91,696.801 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5673"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5675"
+ d="m 720,431 42,0 0,37 -42,0 0,-37 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5663"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5665"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5651"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5653"
+ d="m 5151,1336 33,0 0,66 -33,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5639"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5641"
+ d="m 4705.12,1242.11 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5627"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5629"
+ d="m 4258.71,1148.95 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5615"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5617"
+ d="m 3812.3,1055.12 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5603"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5605"
+ d="m 3365.9,959.73 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5591"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5593"
+ d="m 2919.49,865.699 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5579"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5581"
+ d="m 2473.09,771.52 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5567"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5569"
+ d="m 2026.72,676.449 65,0 0,65 -65,0 0,-65 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5555"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5557"
+ d="m 1580,583 66,0 0,66 -66,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5543"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5545"
+ d="m 1133,490 66,0 0,66 -66,0 0,-66 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5531"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5533"
+ d="m 720,431 42,0 0,35 -42,0 0,-35 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5521"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path5523"
+ d="m 720,431 4464,0 0,3458 -4464,0 0,-3458 z" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="399.80267"
+ inkscape:cy="523.89309"
+ inkscape:document-units="px"
+ inkscape:current-layer="g5511"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1523"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5498">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ transform="matrix(1.25,0,0,-1.25,15,802.36218)"
+ inkscape:label="ink_ext_XXXXXX"
+ id="g5509">
+ <g
+ transform="scale(0.1,0.1)"
+ id="g5511">
+ <path
+ id="path5513"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 5760,0 0,4320 L 0,4320 0,0 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5515"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 720,431.988 4463.98,0 0,3456.02 -4463.98,0 0,-3456.02 z"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5517">
+ <g
+ clip-path="url(#clipPath5521)"
+ id="g5519">
+ <path
+ id="path5525"
+ style="fill:none;stroke:#0000ff;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,432.969 437.461,89.57 446.4,93.32 446.41,93.09 446.37,95.071 446.4,94.179 446.41,94.031 446.4,95.39 446.41,93.83 446.41,93.16 446.36,94.34"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5527">
+ <g
+ clip-path="url(#clipPath5531)"
+ id="g5529">
+ <path
+ id="path5535"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 728.949,402.969 c 7.93,0 15.582,3.16 21.211,8.793 5.621,5.617 8.789,13.238 8.789,21.207 0,7.972 -3.168,15.582 -8.789,21.211 -5.629,5.621 -13.281,8.789 -21.211,8.789 -7.969,0 -15.59,-3.168 -21.25,-8.789 -5.629,-5.629 -8.75,-13.239 -8.75,-21.211 0,-7.969 3.121,-15.59 8.75,-21.207 5.66,-5.633 13.281,-8.793 21.25,-8.793"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5537"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,402.969 c 7.93,0 15.582,3.16 21.211,8.793 5.621,5.617 8.789,13.238 8.789,21.207 0,7.972 -3.168,15.582 -8.789,21.211 -5.629,5.621 -13.281,8.789 -21.211,8.789 -7.969,0 -15.59,-3.168 -21.25,-8.789 -5.629,-5.629 -8.75,-13.239 -8.75,-21.211 0,-7.969 3.121,-15.59 8.75,-21.207 5.66,-5.633 13.281,-8.793 21.25,-8.793 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5539">
+ <g
+ clip-path="url(#clipPath5543)"
+ id="g5541">
+ <path
+ id="path5547"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1166.41,492.539 c 7.97,0 15.58,3.16 21.21,8.789 5.62,5.621 8.79,13.242 8.79,21.211 0,7.93 -3.17,15.582 -8.79,21.211 -5.63,5.629 -13.24,8.789 -21.21,8.789 -7.97,0 -15.59,-3.16 -21.21,-8.789 -5.63,-5.629 -8.79,-13.281 -8.79,-21.211 0,-7.969 3.16,-15.59 8.79,-21.211 5.62,-5.629 13.24,-8.789 21.21,-8.789"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5549"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1166.41,492.539 c 7.97,0 15.58,3.16 21.21,8.789 5.62,5.621 8.79,13.242 8.79,21.211 0,7.93 -3.17,15.582 -8.79,21.211 -5.63,5.629 -13.24,8.789 -21.21,8.789 -7.97,0 -15.59,-3.16 -21.21,-8.789 -5.63,-5.629 -8.79,-13.281 -8.79,-21.211 0,-7.969 3.16,-15.59 8.79,-21.211 5.62,-5.629 13.24,-8.789 21.21,-8.789 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5551">
+ <g
+ clip-path="url(#clipPath5555)"
+ id="g5553">
+ <path
+ id="path5559"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1612.81,585.859 c 7.93,0 15.59,3.161 21.21,8.789 5.63,5.622 8.79,13.243 8.79,21.211 0,7.969 -3.16,15.59 -8.79,21.211 -5.62,5.629 -13.28,8.789 -21.21,8.789 -7.97,0 -15.58,-3.16 -21.21,-8.789 -5.62,-5.621 -8.79,-13.242 -8.79,-21.211 0,-7.968 3.17,-15.589 8.79,-21.211 5.63,-5.628 13.24,-8.789 21.21,-8.789"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5561"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1612.81,585.859 c 7.93,0 15.59,3.161 21.21,8.789 5.63,5.622 8.79,13.243 8.79,21.211 0,7.969 -3.16,15.59 -8.79,21.211 -5.62,5.629 -13.28,8.789 -21.21,8.789 -7.97,0 -15.58,-3.16 -21.21,-8.789 -5.62,-5.621 -8.79,-13.242 -8.79,-21.211 0,-7.968 3.17,-15.589 8.79,-21.211 5.63,-5.628 13.24,-8.789 21.21,-8.789 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5563">
+ <g
+ clip-path="url(#clipPath5567)"
+ id="g5565">
+ <path
+ id="path5571"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2059.22,678.949 c 7.93,0 15.58,3.16 21.21,8.781 5.62,5.629 8.79,13.29 8.79,21.219 0,7.961 -3.17,15.582 -8.79,21.211 -5.63,5.621 -13.28,8.789 -21.21,8.789 -7.97,0 -15.63,-3.168 -21.25,-8.789 -5.63,-5.629 -8.75,-13.25 -8.75,-21.211 0,-7.929 3.12,-15.59 8.75,-21.219 5.62,-5.621 13.28,-8.781 21.25,-8.781"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5573"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2059.22,678.949 c 7.93,0 15.58,3.16 21.21,8.781 5.62,5.629 8.79,13.29 8.79,21.219 0,7.961 -3.17,15.582 -8.79,21.211 -5.63,5.621 -13.28,8.789 -21.21,8.789 -7.97,0 -15.63,-3.168 -21.25,-8.789 -5.63,-5.629 -8.75,-13.25 -8.75,-21.211 0,-7.929 3.12,-15.59 8.75,-21.219 5.62,-5.621 13.28,-8.781 21.25,-8.781 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5575">
+ <g
+ clip-path="url(#clipPath5579)"
+ id="g5577">
+ <path
+ id="path5583"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2505.59,774.02 c 7.96,0 15.58,3.171 21.21,8.789 5.62,5.632 8.79,13.242 8.79,21.211 0,7.968 -3.17,15.589 -8.79,21.21 -5.63,5.629 -13.25,8.79 -21.21,8.79 -7.93,0 -15.59,-3.161 -21.21,-8.79 -5.63,-5.621 -8.79,-13.242 -8.79,-21.21 0,-7.969 3.16,-15.579 8.79,-21.211 5.62,-5.618 13.28,-8.789 21.21,-8.789"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5585"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2505.59,774.02 c 7.96,0 15.58,3.171 21.21,8.789 5.62,5.632 8.79,13.242 8.79,21.211 0,7.968 -3.17,15.589 -8.79,21.21 -5.63,5.629 -13.25,8.79 -21.21,8.79 -7.93,0 -15.59,-3.161 -21.21,-8.79 -5.63,-5.621 -8.79,-13.242 -8.79,-21.21 0,-7.969 3.16,-15.579 8.79,-21.211 5.62,-5.618 13.28,-8.789 21.21,-8.789 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5587">
+ <g
+ clip-path="url(#clipPath5591)"
+ id="g5589">
+ <path
+ id="path5595"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2951.99,868.199 c 7.97,0 15.59,3.172 21.21,8.789 5.63,5.633 8.79,13.242 8.79,21.211 0,7.93 -3.16,15.59 -8.79,21.211 -5.62,5.629 -13.24,8.789 -21.21,8.789 -7.93,0 -15.58,-3.16 -21.21,-8.789 -5.62,-5.621 -8.79,-13.281 -8.79,-21.211 0,-7.969 3.17,-15.578 8.79,-21.211 5.63,-5.617 13.28,-8.789 21.21,-8.789"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5597"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2951.99,868.199 c 7.97,0 15.59,3.172 21.21,8.789 5.63,5.633 8.79,13.242 8.79,21.211 0,7.93 -3.16,15.59 -8.79,21.211 -5.62,5.629 -13.24,8.789 -21.21,8.789 -7.93,0 -15.58,-3.16 -21.21,-8.789 -5.62,-5.621 -8.79,-13.281 -8.79,-21.211 0,-7.969 3.17,-15.578 8.79,-21.211 5.63,-5.617 13.28,-8.789 21.21,-8.789 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5599">
+ <g
+ clip-path="url(#clipPath5603)"
+ id="g5601">
+ <path
+ id="path5607"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3398.4,962.23 c 7.97,0 15.58,3.161 21.21,8.79 5.62,5.621 8.79,13.242 8.79,21.21 0,7.93 -3.17,15.58 -8.79,21.21 -5.63,5.62 -13.24,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.63,-5.63 -8.79,-13.28 -8.79,-21.21 0,-7.968 3.16,-15.589 8.79,-21.21 5.62,-5.629 13.24,-8.79 21.21,-8.79"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5609"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3398.4,962.23 c 7.97,0 15.58,3.161 21.21,8.79 5.62,5.621 8.79,13.242 8.79,21.21 0,7.93 -3.17,15.58 -8.79,21.21 -5.63,5.62 -13.24,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.63,-5.63 -8.79,-13.28 -8.79,-21.21 0,-7.968 3.16,-15.589 8.79,-21.21 5.62,-5.629 13.24,-8.79 21.21,-8.79 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5611">
+ <g
+ clip-path="url(#clipPath5615)"
+ id="g5613">
+ <path
+ id="path5619"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3844.8,1057.62 c 7.97,0 15.59,3.16 21.22,8.79 5.62,5.62 8.78,13.28 8.78,21.21 0,7.97 -3.16,15.58 -8.78,21.21 -5.63,5.62 -13.25,8.79 -21.22,8.79 -7.96,0 -15.58,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.17,-15.59 8.79,-21.21 5.63,-5.63 13.25,-8.79 21.21,-8.79"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5621"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3844.8,1057.62 c 7.97,0 15.59,3.16 21.22,8.79 5.62,5.62 8.78,13.28 8.78,21.21 0,7.97 -3.16,15.58 -8.78,21.21 -5.63,5.62 -13.25,8.79 -21.22,8.79 -7.96,0 -15.58,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.17,-15.59 8.79,-21.21 5.63,-5.63 13.25,-8.79 21.21,-8.79 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5623">
+ <g
+ clip-path="url(#clipPath5627)"
+ id="g5625">
+ <path
+ id="path5631"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4291.21,1151.45 c 7.93,0 15.59,3.16 21.21,8.78 5.63,5.63 8.79,13.25 8.79,21.22 0,7.93 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.28 -8.79,-21.21 0,-7.97 3.17,-15.59 8.79,-21.22 5.62,-5.62 13.24,-8.78 21.21,-8.78"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5633"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4291.21,1151.45 c 7.93,0 15.59,3.16 21.21,8.78 5.63,5.63 8.79,13.25 8.79,21.22 0,7.93 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.28 -8.79,-21.21 0,-7.97 3.17,-15.59 8.79,-21.22 5.62,-5.62 13.24,-8.78 21.21,-8.78 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5635">
+ <g
+ clip-path="url(#clipPath5639)"
+ id="g5637">
+ <path
+ id="path5643"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4737.62,1244.61 c 7.93,0 15.58,3.16 21.21,8.79 5.62,5.62 8.79,13.24 8.79,21.21 0,7.93 -3.17,15.59 -8.79,21.21 -5.63,5.63 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.16 -21.21,-8.79 -5.67,-5.62 -8.79,-13.28 -8.79,-21.21 0,-7.97 3.12,-15.59 8.79,-21.21 5.62,-5.63 13.24,-8.79 21.21,-8.79"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5645"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4737.62,1244.61 c 7.93,0 15.58,3.16 21.21,8.79 5.62,5.62 8.79,13.24 8.79,21.21 0,7.93 -3.17,15.59 -8.79,21.21 -5.63,5.63 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.16 -21.21,-8.79 -5.67,-5.62 -8.79,-13.28 -8.79,-21.21 0,-7.97 3.12,-15.59 8.79,-21.21 5.62,-5.63 13.24,-8.79 21.21,-8.79 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5647">
+ <g
+ clip-path="url(#clipPath5651)"
+ id="g5649">
+ <path
+ id="path5655"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 5183.98,1338.95 c 7.97,0 15.59,3.16 21.22,8.78 5.62,5.63 8.78,13.29 8.78,21.22 0,7.96 -3.16,15.62 -8.78,21.25 -5.63,5.62 -13.25,8.75 -21.22,8.75 -7.93,0 -15.58,-3.13 -21.21,-8.75 -5.62,-5.63 -8.79,-13.29 -8.79,-21.25 0,-7.93 3.17,-15.59 8.79,-21.22 5.63,-5.62 13.28,-8.78 21.21,-8.78"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5657"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,1338.95 c 7.97,0 15.59,3.16 21.22,8.78 5.62,5.63 8.78,13.29 8.78,21.22 0,7.96 -3.16,15.62 -8.78,21.25 -5.63,5.62 -13.25,8.75 -21.22,8.75 -7.93,0 -15.58,-3.13 -21.21,-8.75 -5.62,-5.63 -8.79,-13.29 -8.79,-21.25 0,-7.93 3.17,-15.59 8.79,-21.22 5.63,-5.62 13.28,-8.78 21.21,-8.78 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5659">
+ <g
+ clip-path="url(#clipPath5663)"
+ id="g5661">
+ <path
+ id="path5667"
+ style="fill:none;stroke:#008000;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,434.609 437.461,294.692 446.4,308.549 446.41,307.58 446.37,315.43 446.4,311.91 446.41,311.29 446.4,316.84 446.41,310.43 446.41,307.85 446.36,312.7"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5669">
+ <g
+ clip-path="url(#clipPath5673)"
+ id="g5671">
+ <path
+ id="path5677"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 728.949,404.609 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5679"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,404.609 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5681">
+ <g
+ clip-path="url(#clipPath5685)"
+ id="g5683">
+ <path
+ id="path5689"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1166.41,699.301 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5691"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1166.41,699.301 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5693">
+ <g
+ clip-path="url(#clipPath5697)"
+ id="g5695">
+ <path
+ id="path5701"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1612.81,1007.85 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5703"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1612.81,1007.85 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5705">
+ <g
+ clip-path="url(#clipPath5709)"
+ id="g5707">
+ <path
+ id="path5713"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2059.22,1315.43 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5715"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2059.22,1315.43 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5717">
+ <g
+ clip-path="url(#clipPath5721)"
+ id="g5719">
+ <path
+ id="path5725"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2505.59,1630.86 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5727"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2505.59,1630.86 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5729">
+ <g
+ clip-path="url(#clipPath5733)"
+ id="g5731">
+ <path
+ id="path5737"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2951.99,1942.77 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5739"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2951.99,1942.77 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5741">
+ <g
+ clip-path="url(#clipPath5745)"
+ id="g5743">
+ <path
+ id="path5749"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3398.4,2254.06 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5751"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3398.4,2254.06 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5753">
+ <g
+ clip-path="url(#clipPath5757)"
+ id="g5755">
+ <path
+ id="path5761"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3844.8,2570.9 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5763"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3844.8,2570.9 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5765">
+ <g
+ clip-path="url(#clipPath5769)"
+ id="g5767">
+ <path
+ id="path5773"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4291.21,2881.33 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5775"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4291.21,2881.33 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5777">
+ <g
+ clip-path="url(#clipPath5781)"
+ id="g5779">
+ <path
+ id="path5785"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4737.62,3189.18 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5787"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4737.62,3189.18 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5789">
+ <g
+ clip-path="url(#clipPath5793)"
+ id="g5791">
+ <path
+ id="path5797"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 5183.98,3501.88 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5799"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,3501.88 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5801">
+ <g
+ clip-path="url(#clipPath5805)"
+ id="g5803">
+ <path
+ id="path5809"
+ style="fill:none;stroke:#ff0000;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,432.148 437.461,13.122 446.4,13.128 446.41,13.75 446.37,14.692 446.4,15.039 446.41,13.473 446.4,16.988 446.41,13.281 446.41,12.5 446.36,13.399"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5811">
+ <g
+ clip-path="url(#clipPath5815)"
+ id="g5813">
+ <path
+ id="path5819"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 698.949,402.148 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5821"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 698.949,402.148 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5823">
+ <g
+ clip-path="url(#clipPath5827)"
+ id="g5825">
+ <path
+ id="path5831"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1136.41,415.27 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5833"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1136.41,415.27 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5835">
+ <g
+ clip-path="url(#clipPath5839)"
+ id="g5837">
+ <path
+ id="path5843"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1582.81,428.398 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5845"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1582.81,428.398 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5847">
+ <g
+ clip-path="url(#clipPath5851)"
+ id="g5849">
+ <path
+ id="path5855"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2029.22,442.148 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5857"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2029.22,442.148 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5859">
+ <g
+ clip-path="url(#clipPath5863)"
+ id="g5861">
+ <path
+ id="path5867"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2475.59,456.84 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5869"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2475.59,456.84 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5871">
+ <g
+ clip-path="url(#clipPath5875)"
+ id="g5873">
+ <path
+ id="path5879"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2921.99,471.879 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5881"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2921.99,471.879 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5883">
+ <g
+ clip-path="url(#clipPath5887)"
+ id="g5885">
+ <path
+ id="path5891"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3368.4,485.352 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5893"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3368.4,485.352 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5895">
+ <g
+ clip-path="url(#clipPath5899)"
+ id="g5897">
+ <path
+ id="path5903"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3814.8,502.34 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5905"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3814.8,502.34 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5907">
+ <g
+ clip-path="url(#clipPath5911)"
+ id="g5909">
+ <path
+ id="path5915"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4261.21,515.621 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5917"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4261.21,515.621 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5919">
+ <g
+ clip-path="url(#clipPath5923)"
+ id="g5921">
+ <path
+ id="path5927"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4707.62,528.121 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5929"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4707.62,528.121 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5931">
+ <g
+ clip-path="url(#clipPath5935)"
+ id="g5933">
+ <path
+ id="path5939"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 5153.98,541.52 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5941"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5153.98,541.52 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5943">
+ <g
+ clip-path="url(#clipPath5947)"
+ id="g5945">
+ <path
+ id="path5951"
+ style="fill:none;stroke:#00bfbf;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,432.07 437.461,0.078 446.4,-0.117 446.41,0.078 446.37,0.161 446.4,0 446.41,-0.079 446.4,-0.043 446.41,-0.078 446.41,0.27 446.36,0.199"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5953">
+ <g
+ clip-path="url(#clipPath5957)"
+ id="g5955">
+ <path
+ id="path5961"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 728.949,462.07 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5963"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 728.949,462.07 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5965">
+ <g
+ clip-path="url(#clipPath5969)"
+ id="g5967">
+ <path
+ id="path5973"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1166.41,462.148 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5975"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1166.41,462.148 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5977">
+ <g
+ clip-path="url(#clipPath5981)"
+ id="g5979">
+ <path
+ id="path5985"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 1612.81,462.031 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5987"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1612.81,462.031 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g5989">
+ <g
+ clip-path="url(#clipPath5993)"
+ id="g5991">
+ <path
+ id="path5997"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2059.22,462.109 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path5999"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2059.22,462.109 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6001">
+ <g
+ clip-path="url(#clipPath6005)"
+ id="g6003">
+ <path
+ id="path6009"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2505.59,462.27 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6011"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2505.59,462.27 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6013">
+ <g
+ clip-path="url(#clipPath6017)"
+ id="g6015">
+ <path
+ id="path6021"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2951.99,462.27 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6023"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2951.99,462.27 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6025">
+ <g
+ clip-path="url(#clipPath6029)"
+ id="g6027">
+ <path
+ id="path6033"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3398.4,462.191 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6035"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3398.4,462.191 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6037">
+ <g
+ clip-path="url(#clipPath6041)"
+ id="g6039">
+ <path
+ id="path6045"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 3844.8,462.148 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6047"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3844.8,462.148 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6049">
+ <g
+ clip-path="url(#clipPath6053)"
+ id="g6051">
+ <path
+ id="path6057"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4291.21,462.07 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6059"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4291.21,462.07 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6061">
+ <g
+ clip-path="url(#clipPath6065)"
+ id="g6063">
+ <path
+ id="path6069"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 4737.62,462.301 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6071"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4737.62,462.301 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6073">
+ <g
+ clip-path="url(#clipPath6077)"
+ id="g6075">
+ <path
+ id="path6081"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 5183.98,462.539 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6083"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,462.539 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6085">
+ <g
+ clip-path="url(#clipPath6089)"
+ id="g6087">
+ <path
+ id="path6093"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6095"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6097"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6099">
+ <text
+ id="text6101"
+ transform="matrix(1,0,0,-1,68.9766,30.2938)">
+ <tspan
+ id="tspan6103"
+ y="0"
+ x="0"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">0</tspan>
+ </text>
+ </g>
+ <g
+ id="g6105">
+ <g
+ clip-path="url(#clipPath6109)"
+ id="g6107">
+ <path
+ id="path6113"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 1612.81,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6115"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1612.81,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6117"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 1612.81,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6119">
+ <text
+ id="text6121"
+ transform="matrix(1,0,0,-1,147.054,30.2938)">
+ <tspan
+ id="tspan6123"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">1000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6125">
+ <g
+ clip-path="url(#clipPath6129)"
+ id="g6127">
+ <path
+ id="path6133"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 2505.59,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6135"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2505.59,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6137"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2505.59,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6139">
+ <text
+ id="text6141"
+ transform="matrix(1,0,0,-1,236.115,30.2938)">
+ <tspan
+ id="tspan6143"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">2000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6145">
+ <g
+ clip-path="url(#clipPath6149)"
+ id="g6147">
+ <path
+ id="path6153"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 3398.4,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6155"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3398.4,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6157"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 3398.4,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6159">
+ <text
+ id="text6161"
+ transform="matrix(1,0,0,-1,325.418,30.2938)">
+ <tspan
+ id="tspan6163"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">3000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6165">
+ <g
+ clip-path="url(#clipPath6169)"
+ id="g6167">
+ <path
+ id="path6173"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 4291.21,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6175"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4291.21,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6177"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4291.21,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6179">
+ <text
+ id="text6181"
+ transform="matrix(1,0,0,-1,414.534,30.2938)">
+ <tspan
+ id="tspan6183"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">4000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6185">
+ <g
+ clip-path="url(#clipPath6189)"
+ id="g6187">
+ <path
+ id="path6193"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 5183.98,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6195"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,431.988 0,40"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6197"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,3888.01 0,-40"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6199">
+ <text
+ id="text6201"
+ transform="matrix(1,0,0,-1,503.978,30.2938)">
+ <tspan
+ id="tspan6203"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">5000</tspan>
+ <tspan
+ id="tspan6205"
+ sodipodi:role="line"
+ y="14.2969"
+ x="-266.052 -257.07599 -249.468 -237.78 -230.16 -222.78 -217.84801 -214.032 -206.688 -202.464 -198.64799 -191.54401 -184.164 -179.23199 -174.528 -171.192 -164.592 -157.21201"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">Number of vertices</tspan>
+ </text>
+ </g>
+ <g
+ id="g6207">
+ <g
+ clip-path="url(#clipPath6211)"
+ id="g6209">
+ <path
+ id="path6215"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,431.988 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6217"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,431.988 40,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6219"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,431.988 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6221">
+ <text
+ id="text6223"
+ transform="matrix(1,0,0,-1,61.9531,38.8328)">
+ <tspan
+ id="tspan6225"
+ y="0"
+ x="0"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">0</tspan>
+ </text>
+ </g>
+ <g
+ id="g6227">
+ <g
+ clip-path="url(#clipPath6231)"
+ id="g6229">
+ <path
+ id="path6235"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,863.98 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6237">
+ <g
+ clip-path="url(#clipPath6241)"
+ id="g6239">
+ <path
+ id="path6245"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,863.98 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6247"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,863.98 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6249">
+ <text
+ id="text6251"
+ transform="matrix(1,0,0,-1,31.4688,82.0328)">
+ <tspan
+ id="tspan6253"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">20000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6255">
+ <g
+ clip-path="url(#clipPath6259)"
+ id="g6257">
+ <path
+ id="path6263"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,1296.02 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6265">
+ <g
+ clip-path="url(#clipPath6269)"
+ id="g6267">
+ <path
+ id="path6273"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,1296.02 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6275"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,1296.02 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6277">
+ <text
+ id="text6279"
+ transform="matrix(1,0,0,-1,31.1875,125.233)">
+ <tspan
+ id="tspan6281"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">40000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6283">
+ <g
+ clip-path="url(#clipPath6287)"
+ id="g6285">
+ <path
+ id="path6291"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,1728.01 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6293">
+ <g
+ clip-path="url(#clipPath6297)"
+ id="g6295">
+ <path
+ id="path6301"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,1728.01 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6303"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,1728.01 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6305">
+ <text
+ id="text6307"
+ transform="matrix(1,0,0,-1,31.4375,168.433)">
+ <tspan
+ id="tspan6309"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">60000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6311">
+ <g
+ clip-path="url(#clipPath6315)"
+ id="g6313">
+ <path
+ id="path6319"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,2160 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6321">
+ <g
+ clip-path="url(#clipPath6325)"
+ id="g6323">
+ <path
+ id="path6329"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,2160 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6331"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,2160 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6333">
+ <text
+ id="text6335"
+ transform="matrix(1,0,0,-1,31.4063,211.633)">
+ <tspan
+ id="tspan6337"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">80000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6339">
+ <g
+ clip-path="url(#clipPath6343)"
+ id="g6341">
+ <path
+ id="path6347"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,2591.99 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6349">
+ <g
+ clip-path="url(#clipPath6353)"
+ id="g6351">
+ <path
+ id="path6357"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,2591.99 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6359"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,2591.99 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6361">
+ <text
+ id="text6363"
+ transform="matrix(1,0,0,-1,24.2656,254.833)">
+ <tspan
+ id="tspan6365"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528 38.16"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">100000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6367">
+ <g
+ clip-path="url(#clipPath6371)"
+ id="g6369">
+ <path
+ id="path6375"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,3023.98 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6377">
+ <g
+ clip-path="url(#clipPath6381)"
+ id="g6379">
+ <path
+ id="path6385"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,3023.98 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6387"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,3023.98 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6389">
+ <text
+ id="text6391"
+ transform="matrix(1,0,0,-1,24.2656,298.033)">
+ <tspan
+ id="tspan6393"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528 38.16"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">120000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6395">
+ <g
+ clip-path="url(#clipPath6399)"
+ id="g6397">
+ <path
+ id="path6403"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,3456.02 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6405">
+ <g
+ clip-path="url(#clipPath6409)"
+ id="g6407">
+ <path
+ id="path6413"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,3456.02 40,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6415"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,3456.02 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6417">
+ <text
+ id="text6419"
+ transform="matrix(1,0,0,-1,24.2656,341.233)">
+ <tspan
+ id="tspan6421"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528 38.16"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">140000</tspan>
+ </text>
+ </g>
+ <g
+ id="g6423">
+ <g
+ clip-path="url(#clipPath6427)"
+ id="g6425">
+ <path
+ id="path6431"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:10, 30;stroke-dashoffset:0"
+ d="m 720,3888.01 4463.98,0"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6433"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,3888.01 40,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6435"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,3888.01 -40,0"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6437">
+ <text
+ id="text6439"
+ transform="matrix(1,0,0,-1,24.2656,384.433)">
+ <tspan
+ id="tspan6441"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.632 15.264 22.896 30.528 38.16"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">160000</tspan>
+ </text>
+ <text
+ id="text6443"
+ transform="matrix(0,1,1,0,19.0938,204.398)">
+ <tspan
+ id="tspan6445"
+ sodipodi:role="line"
+ y="0"
+ x="0 7.6199999 10.956 17.256001"
+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">Size</tspan>
+ </text>
+ </g>
+ <path
+ id="path6447"
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,3888.01 4463.98,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6449"
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 5183.98,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6451"
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,431.988 4463.98,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6453"
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 720,431.988 0,3456.022"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6455"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2693.75,2938.4 2418.24,0 0,877.621 -2418.24,0 0,-877.621 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6457"
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2693.75,2938.4 2418.24,0 0,877.621 -2418.24,0 0,-877.621 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6459"
+ style="fill:none;stroke:#0000ff;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3701.76 201.6,0"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6461">
+ <g
+ clip-path="url(#clipPath6465)"
+ id="g6463">
+ <path
+ id="path6469"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2794.57,3671.76 c 7.93,0 15.59,3.16 21.21,8.79 5.63,5.62 8.79,13.28 8.79,21.21 0,7.97 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.63,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.16,-15.59 8.79,-21.21 5.62,-5.63 13.24,-8.79 21.21,-8.79"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6471"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3671.76 c 7.93,0 15.59,3.16 21.21,8.79 5.63,5.62 8.79,13.28 8.79,21.21 0,7.97 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.59,-3.17 -21.21,-8.79 -5.63,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.16,-15.59 8.79,-21.21 5.62,-5.63 13.24,-8.79 21.21,-8.79 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g6473">
+ <g
+ clip-path="url(#clipPath6477)"
+ id="g6475">
+ <path
+ id="path6481"
+ style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2996.17,3671.76 c 7.93,0 15.59,3.16 21.21,8.79 5.63,5.62 8.79,13.28 8.79,21.21 0,7.97 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.58,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.17,-15.59 8.79,-21.21 5.63,-5.63 13.24,-8.79 21.21,-8.79"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6483"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2996.17,3671.76 c 7.93,0 15.59,3.16 21.21,8.79 5.63,5.62 8.79,13.28 8.79,21.21 0,7.97 -3.16,15.58 -8.79,21.21 -5.62,5.62 -13.28,8.79 -21.21,8.79 -7.97,0 -15.58,-3.17 -21.21,-8.79 -5.62,-5.63 -8.79,-13.24 -8.79,-21.21 0,-7.93 3.17,-15.59 8.79,-21.21 5.63,-5.63 13.24,-8.79 21.21,-8.79 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <path
+ id="path6491"
+ style="fill:none;stroke:#008000;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3490.39 201.6,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6493"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2794.57,3460.39 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6495"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3460.39 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6497"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2996.17,3460.39 30,60 -60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6499"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2996.17,3460.39 30,60 -60,0 30,-60 z"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6501">
+ <text
+ id="text6503"
+ transform="matrix(1,0,0,-1,315.455,343.999)">
+ <tspan
+ id="tspan6505"
+ sodipodi:role="line"
+ y="0"
+ x="0 9.1295996 18.259199 36.864101 44.366501 48.369701 62.395302 71.539299 75.542503 79.5457 87.465698 96.321701"
+ style="font-size:14.39999962px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">numsimplices</tspan>
+ </text>
+ </g>
+ <path
+ id="path6507"
+ style="fill:none;stroke:#ff0000;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3282.93 201.6,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6509"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2764.57,3252.93 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6511"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2764.57,3252.93 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6513"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2966.17,3252.93 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6515"
+ style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2966.17,3252.93 60,60 m -60,0 60,-60"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6517">
+ <text
+ id="text6519"
+ transform="matrix(1,0,0,-1,315.455,323.252)">
+ <tspan
+ id="tspan6521"
+ sodipodi:role="line"
+ y="0"
+ x="0 9.1295996 18.259199 32.284801 36.863998 46.007999 50.0112 58.824001 66.744003 75.081596 83.937599 89.856003"
+ style="font-size:14.39999962px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">num blockers</tspan>
+ </text>
+ </g>
+ <path
+ id="path6523"
+ style="fill:none;stroke:#00bfbf;stroke-width:20;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3075.47 201.6,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6525"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2794.57,3105.47 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6527"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2794.57,3105.47 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6529"
+ style="fill:#00bfbf;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 2996.17,3105.47 -30,-60 60,0"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6531"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"
+ d="m 2996.17,3105.47 -30,-60 60,0 -30,60 z"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="scale(10,10)"
+ id="g6533">
+ <text
+ id="text6535"
+ transform="matrix(1,0,0,-1,315.455,302.505)">
+ <tspan
+ id="tspan6537"
+ sodipodi:role="line"
+ y="0"
+ x="0 9.1295996 18.259199 32.284801 36.863998 45.993599 54.8064 63.936001 68.515198 77.659203 86.472 95.615997 104.4432 113.5872 117.5904 126.4464 131.0256 140.21297 144.21616 153.02896 160.94896 169.28656 178.14256 184.06096"
+ style="font-size:14.39999962px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">num non popable blockers</tspan>
+ </text>
+ </g>
+ <text
+ style="font-size:120px"
+ y="-3655.6985"
+ x="3153.7925"
+ id="text6487-0"
+ transform="scale(1,-1)">
+ <tspan
+ id="tspan6489-8"
+ sodipodi:role="line"
+ style="font-size:144px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"
+ x="3153.7925"
+ y="-3655.6985">size of the graph</tspan>
+ </text>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/src/Skeleton_blocker/doc/blockers_curve.png b/src/Skeleton_blocker/doc/blockers_curve.png
new file mode 100644
index 00000000..58863ece
--- /dev/null
+++ b/src/Skeleton_blocker/doc/blockers_curve.png
Binary files differ
diff --git a/src/Skeleton_blocker/doc/ds_representation.png b/src/Skeleton_blocker/doc/ds_representation.png
new file mode 100644
index 00000000..8136621a
--- /dev/null
+++ b/src/Skeleton_blocker/doc/ds_representation.png
Binary files differ
diff --git a/src/Skeleton_blocker/doc/ds_representation.svg b/src/Skeleton_blocker/doc/ds_representation.svg
new file mode 100644
index 00000000..981b2874
--- /dev/null
+++ b/src/Skeleton_blocker/doc/ds_representation.svg
@@ -0,0 +1,470 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="434.50912"
+ height="113.23431"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="ds_representation.svg"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294">
+ <defs
+ id="defs4">
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4610"
+ effect="spiro" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="393.78845"
+ inkscape:cy="51.962328"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1523"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(775.10425,-319.57102)">
+ <path
+ id="path4432"
+ d="m -564.66566,372.78112 -22.51977,46.5698 62.69739,-31.00174 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m -553.17597,345.78586 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ id="path3125"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -519.08333,361.44322 31.81981,11.8693"
+ id="path3127"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-7"
+ style="fill:none;stroke:none"
+ d="m -554.02684,345.73906 29.32107,42.08799 7.736,-39.88821"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -523.3168,376.08402 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -564.28765,372.5549 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ id="path3121"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-691.68016,428.25063)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-669.37366,382.75481)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-4"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-630.26652,397.04052)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-659.37366,354.89767)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-42"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-622.23081,358.64766)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-3"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-593.12367,383.11196)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-7"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1-1"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -378.67395,371.32852 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -413.6327,367.61658 37.56127,-20.2544 c 0,0 -4.64286,29.64285 -5.35714,31.42857 -0.71429,1.78571 -32.20413,-11.17417 -32.20413,-11.17417 z"
+ id="path4091"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsc" />
+ <g
+ id="g3909">
+ <path
+ sodipodi:nodetypes="ccc"
+ d="m -409.13145,340.85729 28.31093,41.70918 8.87241,-39.38313"
+ style="fill:none;fill-opacity:0.41568603999999998;fill-rule:nonzero;stroke:none;opacity:0.13580247"
+ id="path14-3-5"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ style="opacity:0.13580244;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ d="m -420.02281,368.02562 -22.51977,46.5698 62.69739,-31.00174 z"
+ id="path4432-5" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3125-0"
+ d="m -408.53312,341.03036 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ style="opacity:0.13580244;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3127-1"
+ d="m -374.44048,356.68772 31.81981,11.8693"
+ style="opacity:0.13580244;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path3121-0"
+ d="m -419.6448,367.7994 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ style="opacity:0.13580244;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-36"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-547.03731,423.49513)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-4-5"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-524.73081,377.99931)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-1-6"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-485.62367,392.28502)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-42-0"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-514.73081,350.14217)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-3-9"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-477.58796,353.89216)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13580244;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="path4584-7-0"
+ sodipodi:cx="93.972473"
+ sodipodi:cy="113.9189"
+ sodipodi:rx="3.4171808"
+ sodipodi:ry="3.4171808"
+ d="m 97.389654,113.9189 a 3.4171808,3.4171808 0 1 1 -6.834362,0 3.4171808,3.4171808 0 1 1 6.834362,0 z"
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-448.48082,378.35646)" />
+ </g>
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -370.55894,347.61837 23.42349,19.75458 c 0,0 -28.39286,9.99999 -29.10714,11.78571 -0.71429,1.78571 5.68365,-31.54029 5.68365,-31.54029 z"
+ id="path4091-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsc" />
+ <path
+ id="path4432-6"
+ d="m -750.37996,370.16849 -22.51977,46.5698 62.69739,-31.00174 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0"
+ d="m -738.89027,343.17323 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ id="path3125-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -704.79763,358.83059 31.81981,11.8693"
+ id="path3127-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-12"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -750.60027,369.89548 -21.18655,45.87606 60.51647,-29.53414"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-7-8"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -739.74114,343.12643 29.32107,42.08799 7.736,-39.88821"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-8-0"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -702.3655,345.90435 -2.625,13.17237 29.83309,9.73554"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-2-70"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -704.89087,358.7838 -5.27665,26.68316 35.26265,-15.39201"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-3-2"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -739.4886,343.00016 28.31093,41.70918 8.87241,-39.38313"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1-2"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -709.0311,373.47139 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -750.00195,369.94227 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ id="path3121-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-877.39446,425.638)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-79"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-855.08796,380.14218)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-4-9"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-815.98082,394.42789)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-1-61"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-845.08796,352.28504)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-42-8"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-807.94511,356.03503)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-3-5"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-778.83797,380.49933)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-7-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-718.37708"
+ y="430.86295"
+ id="text6164-6-56-2"
+ sodipodi:linespacing="125%"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6"
+ x="-718.37708"
+ y="430.86295">Simplicial complex</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-462.22809"
+ y="430.86295"
+ id="text6164-6-56-2-3"
+ sodipodi:linespacing="125%"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9"
+ x="-462.22809"
+ y="430.86295">Encoding</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-535.67126"
+ y="334.7963"
+ id="text6164-6-56-2-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9"
+ x="-535.67126"
+ y="334.7963">Graph</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-389.50018"
+ y="335.10443"
+ id="text6164-6-56-2-3-0-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9-1"
+ x="-389.50018"
+ y="335.10443">Blockers</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-470.03345"
+ y="335.56711"
+ id="text6164-6-56-2-3-0-36"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9-3"
+ x="-470.03345"
+ y="335.56711">+</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-618.52417"
+ y="382.18915"
+ id="text6164-6-56-2-1"
+ sodipodi:linespacing="125%"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-4"
+ x="-618.52417"
+ y="382.18915">=</tspan></text>
+ </g>
+</svg>
diff --git a/src/Skeleton_blocker/doc/ds_scheme.svg b/src/Skeleton_blocker/doc/ds_scheme.svg
new file mode 100644
index 00000000..f13a6213
--- /dev/null
+++ b/src/Skeleton_blocker/doc/ds_scheme.svg
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="434.50912"
+ height="113.23431"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="ds_scheme.svg"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294">
+ <defs
+ id="defs4">
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4610"
+ effect="spiro" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="110.77021"
+ inkscape:cy="32.991372"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1523"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(775.10425,-319.57102)">
+ <path
+ id="path4432"
+ d="m -564.66566,372.78112 -22.51977,46.5698 62.69739,-31.00174 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m -553.17597,345.78586 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ id="path3125"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -519.08333,361.44322 31.81981,11.8693"
+ id="path3127"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-7"
+ style="fill:none;stroke:none"
+ d="m -554.02684,345.73906 29.32107,42.08799 7.736,-39.88821"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -523.3168,376.08402 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -564.28765,372.5549 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ id="path3121"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-691.68016,428.25063)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-669.37366,382.75481)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-4"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-630.26652,397.04052)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-659.37366,354.89767)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-42"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-622.23081,358.64766)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-3"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-593.12367,383.11196)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-7"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ id="path4432-5"
+ d="m -420.02281,368.02562 -22.51977,46.5698 62.69739,-31.00174 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0"
+ d="m -408.53312,341.03036 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ id="path3125-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -374.44048,356.68772 31.81981,11.8693"
+ id="path3127-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-79"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -420.24312,367.75261 -21.18655,45.87606 60.51647,-29.53414"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-7-1"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -409.38399,340.98356 29.32107,42.08799 7.736,-39.88821"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-8-6"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -372.00835,343.76148 -2.625,13.17237 29.83309,9.73554"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-2-7"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -374.53372,356.64093 -5.27665,26.68316 35.26265,-15.39201"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-3-5"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -409.13145,340.85729 28.31093,41.70918 8.87241,-39.38313"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1-1"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -378.67395,371.32852 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -419.6448,367.7994 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ id="path3121-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-547.03731,423.49513)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-36"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-524.73081,377.99931)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-4-5"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-485.62367,392.28502)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-1-6"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-514.73081,350.14217)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-42-0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-477.58796,353.89216)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-3-9"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-448.48082,378.35646)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-7-0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -413.6327,367.61658 37.56127,-20.2544 c 0,0 -4.64286,29.64285 -5.35714,31.42857 -0.71429,1.78571 -32.20413,-11.17417 -32.20413,-11.17417 z"
+ id="path4091"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -370.55894,347.61837 23.42349,19.75458 c 0,0 -28.39286,9.99999 -29.10714,11.78571 -0.71429,1.78571 5.68365,-31.54029 5.68365,-31.54029 z"
+ id="path4091-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsc" />
+ <path
+ id="path4432-6"
+ d="m -750.37996,370.16849 -22.51977,46.5698 62.69739,-31.00174 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0"
+ d="m -738.89027,343.17323 c 0.75762,1.51523 32.57742,14.89975 32.57742,14.89975"
+ id="path3125-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -704.79763,358.83059 31.81981,11.8693"
+ id="path3127-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-12"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -750.60027,369.89548 -21.18655,45.87606 60.51647,-29.53414"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-7-8"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -739.74114,343.12643 29.32107,42.08799 7.736,-39.88821"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-8-0"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -702.3655,345.90435 -2.625,13.17237 29.83309,9.73554"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-2-70"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -704.89087,358.7838 -5.27665,26.68316 35.26265,-15.39201"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-3-2"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -739.4886,343.00016 28.31093,41.70918 8.87241,-39.38313"
+ sodipodi:nodetypes="ccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14-1-2"
+ style="fill:#575e9c;fill-opacity:0.41568604;fill-rule:nonzero;stroke:none"
+ d="m -709.0311,373.47139 34.2525,-51.7575"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -750.00195,369.94227 47.47717,-24.4962 -7.82868,39.90103 37.1231,-14.89975 -29.29442,-25.25382 -37.37564,-2.27284 29.54696,42.42641"
+ id="path3121-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-877.39446,425.638)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-79"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-855.08796,380.14218)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-4-9"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-815.98082,394.42789)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-1-61"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-845.08796,352.28504)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-42-8"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-807.94511,356.03503)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-3-5"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.39947101,-0.59295401,0.59295401,0.39947101,-778.83797,380.49933)"
+ d="m 97.389654,113.9189 c 0,1.88726 -1.529924,3.41718 -3.417181,3.41718 -1.887257,0 -3.417181,-1.52992 -3.417181,-3.41718 0,-1.88726 1.529924,-3.41718 3.417181,-3.41718 1.887257,0 3.417181,1.52992 3.417181,3.41718 z"
+ sodipodi:ry="3.4171808"
+ sodipodi:rx="3.4171808"
+ sodipodi:cy="113.9189"
+ sodipodi:cx="93.972473"
+ id="path4584-7-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99118668;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ sodipodi:type="arc" />
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-718.37708"
+ y="430.86295"
+ id="text6164-6-56-2"
+ sodipodi:linespacing="125%"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6"
+ x="-718.37708"
+ y="430.86295">Simplicial complex</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-462.22809"
+ y="430.86295"
+ id="text6164-6-56-2-3"
+ sodipodi:linespacing="125%"
+ inkscape:export-xdpi="164.24294"
+ inkscape:export-ydpi="164.24294"
+ inkscape:export-filename="/home/dsalinas/Documents/CodeSVN/gudhi_depot/trunk/src/Skeleton_blocker/doc/ds_representation.png"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9"
+ x="-462.22809"
+ y="430.86295">Encoding</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-535.67126"
+ y="334.7963"
+ id="text6164-6-56-2-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9"
+ x="-535.67126"
+ y="334.7963">Graph</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-389.50018"
+ y="335.10443"
+ id="text6164-6-56-2-3-0-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9-1"
+ x="-389.50018"
+ y="335.10443">Blockers</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Times New Roman;-inkscape-font-specification:'Times New Roman,'"
+ x="-470.03345"
+ y="335.56711"
+ id="text6164-6-56-2-3-0-36"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6166-1-0-6-9-9-3"
+ x="-470.03345"
+ y="335.56711">+</tspan></text>
+ </g>
+</svg>
diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
index 3f4a9ffc..b1cb281e 100644
--- a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
+++ b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
@@ -1,3 +1,25 @@
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
+
#include <boost/timer/timer.hpp>
#include <stdio.h>
#include <stdlib.h>
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
index 1d215984..eff37a18 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blocker.h
- *
- * Created on: Jan, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKER_H
#define GUDHI_SKELETON_BLOCKER_H
@@ -20,5 +34,164 @@
#include "gudhi/Utils.h" //xxx
+
+/** \defgroup skbl Skeleton-Blocker
+
+\author David Salinas
+
+\section Introduction
+The Skeleton-Blocker data-structure had been introduced in the two papers
+\cite socg_blockers_2011,\cite blockers2012.
+It proposes a light encoding for simplicial complexes by storing only an *implicit* representation of its
+simplices.
+Intuitively, it just stores the 1-skeleton of a simplicial complex with a graph and the set of its "missing faces" that
+is very small in practice (see next section for a formal definition).
+This data-structure handles all simplicial complexes operations such as
+ as simplex enumeration or simplex removal but operations that are particularly efficient
+ are operations that do not require simplex enumeration such as edge iteration, link computation or simplex contraction.
+
+
+\section Definitions
+
+We recall briefly classical definitions of simplicial complexes
+ \cite Munkres-elementsalgtop1984.
+An abstract simplex is a finite non-empty set and its dimension is its number of elements minus 1.
+Whenever \f$\tau \subset \sigma\f$ and \f$\tau \neq \emptyset \f$, \f$ \tau \f$ is called a face of
+\f$ \sigma\f$ and \f$ \sigma\f$ is called a coface of \f$ \tau \f$ . Furthermore,
+when \f$ \tau \neq \sigma\f$ we say that \f$ \tau\f$ is a proper-face of \f$ \sigma\f$.
+An abstract simplicial complex is a set of simplices that contains all the faces of their 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
+
+
+To encode, a simplicial complex, one can encodes all its simplices.
+In case when this number gets too large,
+a lighter and implicit version consists of encoding only its graph plus some elements called missing faces or blockers.
+A blocker is a simplex of dimension greater than 1
+that does not belong to the complex but whose all proper faces does.
+
+
+Remark that for a clique complex (i.e. a simplicial complex whose simplices are cliques of its graph), the set of blockers
+is empty and the data-structure is then particularly sparse.
+One famous example of clique-complex is the Rips complex which is intensively used
+in topological data-analysis.
+In practice, the set of blockers of a simplicial complex
+remains also small when simplifying a Rips complex with edge contractions
+but also for most of the simplicial complexes used in topological data-analysis such as Delaunay, Cech or Witness complexes.
+For instance, the numbers of blockers is depicted for random 3 dimensional spheres embedded into \f$R^4\f$
+in figure X.
+
+
+*\image html "blockers_curve.png" "Number of blockers of random triangulations of 3-spheres" width=10cm
+
+
+
+
+\section API
+
+\subsection Overview
+
+Four classes are implemented for simplicial complex in this representation namely :
+
+\li Skeleton_blocker_complex : a simplicial complex with basic operations such as vertex/edge/simplex enumeration and construction
+\li Skeleton_blocker_link_complex : the link of a simplex in a parent complex. It is represented as a sub complex
+of the parent complex
+\li Skeleton_blocker_simplifiable_complex : a simplicial complex with simplification operations such as edge contraction or simplex collapse
+\li Skeleton_blocker_geometric_complex : a simplifiable simplicial complex who has access to geometric points in \f$R^d\f$
+
+The two last classes are derived classes from the <Code>Skeleton_blocker_complex</Code> class. The class <Code>Skeleton_blocker_link_complex</Code> inheritates from a template passed parameter
+that may be either <Code>Skeleton_blocker_complex</Code> or <Code>Skeleton_blocker_geometric_complex</Code> (a link may store points coordinates or not).
+Most user will just need to use Skeleton_blocker_geometric_complex.
+
+\subsection Visitor
+
+The class <Code>Skeleton_blocker_complex</Code> 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
+<Code>Contraction</Code> package).
+
+
+
+
+\section Example
+
+
+\subsection s Iterating through vertices, edges, blockers and simplices
+
+Iteration through vertices, edges, simplices or blockers is straightforward with c++11 for range loops.
+Note that simplex iteration with this implicit data-structure just takes
+a few more time compared to iteration via an explicit representation
+such as the Simplex Tree. The following example computes the Euler Characteristic
+of a simplicial complex.
+
+ \code{.cpp}
+ typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+ typedef Complex::Vertex_handle Vertex_handle;
+ typedef Complex::Simplex_handle Simplex;
+
+ const int n = 15;
+
+ // build a full complex with 10 vertices and 2^n-1 simplices
+ Complex complex;
+ for(int i=0;i<n;i++)
+ complex.add_vertex();
+ for(int i=0;i<n;i++)
+ for(int j=0;j<i;j++)
+ //note that add_edge adds the edge and all its cofaces
+ complex.add_edge(Vertex_handle(i),Vertex_handle(j));
+
+ // this is just to illustrate iterators, to count number of vertices
+ // or edges, complex.num_vertices() and complex.num_edges() are
+ // more appropriated!
+ unsigned num_vertices = 0;
+ for(auto v : complex.vertex_range()){
+ ++num_vertices;
+ }
+
+ unsigned num_edges = 0;
+ for(auto e : complex.edge_range())
+ ++num_edges;
+
+ unsigned euler = 0;
+ unsigned num_simplices = 0;
+ // we use a reference to a simplex instead of a copy
+ // value here because a simplex is a set of integers
+ // and copying it cost time
+ for(const Simplex & s : complex.simplex_range()){
+ ++num_simplices;
+ if(s.dimension()%2 == 0)
+ euler += 1;
+ else
+ euler -= 1;
+ }
+ std::cout << "Saw "<<num_vertices<<" vertices, "<<num_edges<<" edges and "<<num_simplices<<" simplices"<<std::endl;
+ std::cout << "The Euler Characteristic is "<<euler<<std::endl;
+ \endcode
+
+
+\verbatim
+./SkeletonBlockerIteration
+Saw 15 vertices, 105 edges and 32767 simplices
+The Euler Characteristic is 1
+ 0.537302s wall, 0.530000s user + 0.000000s system = 0.530000s CPU (98.6%)
+\endverbatim
+
+
+
+\subsection Acknowledgements
+The author wishes to thank Dominique Attali and André Lieutier for
+their collaboration to write the two initial papers about this data-structure
+ and also Dominique for leaving him use a prototype.
+
+
+\copyright GNU General Public License v3.
+\verbatim Contact: David Salinas, david.salinas@inria.fr \endverbatim
+*/
+/** @} */ // end defgroup
+
+
+
#endif
+
+
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
index 4475afcc..3afd4cc7 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
@@ -1,10 +1,24 @@
-/*
- * ComplexVisitor.h
- *
- * Created on: Dec 11, 2013
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_COMPLEXVISITOR_H_
#define GUDHI_COMPLEXVISITOR_H_
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 864ee6ac..4e1c5178 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
@@ -1,11 +1,24 @@
-/*
- * Skeleton_blocker_link_superior.h
- *
- * Created on: Feb 19, 2014
- * Author: David Salinas
- * Copyright 2013 INRIA. All rights reserved
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKER_LINK_SUPERIOR_H_
#define GUDHI_SKELETON_BLOCKER_LINK_SUPERIOR_H_
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 369635e5..fd44fba5 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
@@ -1,30 +1,24 @@
-/*
- * Skeleton_blocker_off_io.h
- * Created on: Nov 28, 2014
- * 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-Méditerranée (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 <http://www.gnu.org/licenses/>.
- *
- */
-
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef SKELETON_BLOCKER_OFF_IO_H_
#define SKELETON_BLOCKER_OFF_IO_H_
@@ -34,6 +28,9 @@ namespace Gudhi {
namespace skbl {
+/**
+ *@brief Off reader visitor that can be passed to Off_reader to read a Skeleton_blocker_complex.
+ */
template<typename Complex>
class Skeleton_blocker_off_visitor_reader{
Complex& complex_;
@@ -71,6 +68,9 @@ public:
}
};
+/**
+*@brief Class that allows to load a Skeleton_blocker_complex from an off file.
+*/
template<typename Complex>
class Skeleton_blocker_off_reader{
public:
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 79a8e7aa..a24bea25 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blocker_simple_geometric_traits.h
- *
- * Created on: Feb 11, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_SIMPLE_GEOMETRIC_TRAITS_H_
#define GUDHI_SKELETON_BLOCKERS_SIMPLE_GEOMETRIC_TRAITS_H_
@@ -16,8 +30,12 @@ namespace Gudhi{
namespace skbl{
+
/**
* @extends SkeletonBlockerGeometricDS
+ * @ingroup skbl
+ * @brief Simple traits that is a model of SkeletonBlockerGeometricDS and
+ * can be passed as a template argument to Skeleton_blocker_geometric_complex
*/
template<typename GeometryTrait>
struct Skeleton_blocker_simple_geometric_traits : public skbl::Skeleton_blocker_simple_traits {
@@ -35,6 +53,7 @@ public:
template<class ComplexGeometricTraits> friend class Skeleton_blocker_geometric_complex;
private:
Point point_;
+
Point& point(){ return point_; }
const Point& point() const { return point_; }
};
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 3975bb46..e17ea9b5 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blocker_simple_traits.h
- *
- * Created on: Feb 11, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_SIMPLE_TRAITS_H_
#define GUDHI_SKELETON_BLOCKERS_SIMPLE_TRAITS_H_
@@ -18,11 +32,14 @@ namespace skbl {
/**
* @extends SkeletonBlockerDS
+ * @ingroup skbl
+ * @brief Simple traits that is a model of SkeletonBlockerDS and
+ * can be passed as a template argument to Skeleton_blocker_complex
*/
struct Skeleton_blocker_simple_traits{
/**
- * @brief global and local handle similar to <a href="http://www.boost.org/doc/libs/1_38_0/libs/graph/doc/subgraph.html">boost subgraphs</a>.
- * In gross, vertices are stored in a vector.
+ * @brief Global and local handle similar to <a href="http://www.boost.org/doc/libs/1_38_0/libs/graph/doc/subgraph.html">boost subgraphs</a>.
+ * Vertices are stored in a vector.
* For the root simplicial complex, the local and global descriptors are the same.
* For a subcomplex L and one of its vertices 'v', the local descriptor of 'v' is its position in
* the vertex vector of the subcomplex L whereas its global descriptor is the position of 'v'
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 5593a5a8..fb3d9470 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
@@ -1,3 +1,25 @@
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
+
#ifndef GUDHI_SKELETON_BLOCKER_SIMPLEX_H
#define GUDHI_SKELETON_BLOCKER_SIMPLEX_H
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 5ca8e9af..9b4253d1 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
@@ -1,3 +1,25 @@
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
+
#ifndef GUDHI_SKELETON_BLOCKER_SUB_COMPLEX_H
#define GUDHI_SKELETON_BLOCKER_SUB_COMPLEX_H
@@ -11,7 +33,7 @@ namespace skbl {
/**
* @brief Simplicial subcomplex of a complex represented by a skeleton/blockers pair.
- *
+ * @extends Skeleton_blocker_complex
* @details Stores a subcomplex of a simplicial complex.
* To simplify explanations below, we will suppose that :
* - K is the root simplicial complex
@@ -136,13 +158,13 @@ public:
* Constructs the restricted complex of 'parent_complex' to
* vertices of 'simplex'.
*/
- friend void make_restricted_complex(const ComplexType & parent_complex, const Simplex_handle& simplex, Skeleton_blocker_sub_complex & result){
- result.clear();
+ void make_restricted_complex(const ComplexType & parent_complex, const Simplex_handle& simplex){
+ this->clear();
// add vertices to the sub complex
for (auto x : simplex){
assert(parent_complex.contains_vertex(x));
- auto x_local = result.add_vertex(parent_complex[x].get_id());
- result[x_local] = parent_complex[x];
+ auto x_local = this->add_vertex(parent_complex[x].get_id());
+ (*this)[x_local] = parent_complex[x];
}
// add edges to the sub complex
@@ -152,7 +174,7 @@ public:
parent_complex.add_neighbours(x, x_neigh, true);
x_neigh.intersection(simplex);
for (auto y : x_neigh){
- result.add_edge(parent_complex[x].get_id(), parent_complex[y].get_id());
+ this->add_edge(parent_complex[x].get_id(), parent_complex[y].get_id());
}
}
@@ -161,8 +183,8 @@ public:
// check if it is the first time we encounter the blocker
if (simplex.contains(*blocker)){
Root_simplex_handle blocker_root(parent_complex.get_id(*(blocker)));
- Simplex_handle blocker_restr(*result.get_simplex_address(blocker_root));
- result.add_blocker(new Simplex_handle(blocker_restr));
+ Simplex_handle blocker_restr(*(this->get_simplex_address(blocker_root)));
+ this->add_blocker(new Simplex_handle(blocker_restr));
}
}
}
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 0d870f1a..32538f38 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
@@ -1,10 +1,24 @@
-/*
- * Top_faces.h
- *
- * Created on: Oct 23, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef TOP_FACES_H_
#define TOP_FACES_H_
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 21091d10..f6f2c955 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_blockers_iterators.h
- *
- * Created on: Aug 25, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
#define GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
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 82025a1c..918e3473 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_iterators_out.h
- *
- * Created on: Aug 25, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_
#define GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_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 cf827705..20a94734 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_iterators.h
- *
- * Created on: Aug 25, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_ITERATORS_H_
#define GUDHI_SKELETON_BLOCKERS_ITERATORS_H_
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 5ac0f21e..0681d5da 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_simplices_iterators.h
- *
- * Created on: Sep 26, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_KELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
#define GUDHI_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
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 4b66ced5..1fdbdfc9 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_triangles_iterators.h
- *
- * Created on: Aug 25, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
#define GUDHI_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
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 875e915a..4c90ee51 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
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_iterators_out.h
- *
- * Created on: Aug 25, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
#define GUDHI_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 b4c1cd9e..81ff0231 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
@@ -1,8 +1,23 @@
-/*
- * Skeleton_blocker_complex.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: Jan, 2014
- * Author: dsalinas
+ * 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 <http://www.gnu.org/licenses/>.
*/
#ifndef GUDHI_SKELETON_BLOCKER_COMPLEX_H
@@ -42,21 +57,7 @@ namespace skbl {
/**
*@class Skeleton_blocker_complex
*@brief Abstract Simplicial Complex represented with a skeleton/blockers pair.
- *
- * A simplicial complex is completely defined by :
- * - the graph of its 1-skeleton;
- * - its set of blockers.
- *
- * The graph is a boost graph templated with SkeletonBlockerDS::Graph_vertex and SkeletonBlockerDS::Graph_edge.
- *
- * One can accesses to vertices via SkeletonBlockerDS::Vertex_handle, to edges via Skeleton_blocker_complex::Edge_handle and
- * simplices via Skeleton_blocker_simplex<Vertex_handle>.
- *
- * The SkeletonBlockerDS::Root_vertex_handle serves in the case of a subcomplex (see class Skeleton_blocker_sub_complex)
- * to access to the address of one vertex in the parent complex.
- *
- * @todo TODO Simplex_handle are not classic handle
- *
+ *@ingroup skbl
*/
template<class SkeletonBlockerDS>
class Skeleton_blocker_complex
@@ -73,19 +74,35 @@ class Skeleton_blocker_complex
public:
-
+ /**
+ * @brief The type of stored vertex node, specified by the template SkeletonBlockerDS
+ */
typedef typename SkeletonBlockerDS::Graph_vertex Graph_vertex;
+
+ /**
+ * @brief The type of stored edge node, specified by the template SkeletonBlockerDS
+ */
typedef typename SkeletonBlockerDS::Graph_edge Graph_edge;
typedef typename SkeletonBlockerDS::Root_vertex_handle Root_vertex_handle;
+
+ /**
+ * @brief The type of an handle to a vertex of the complex.
+ */
typedef typename SkeletonBlockerDS::Vertex_handle Vertex_handle;
typedef typename Root_vertex_handle::boost_vertex_handle boost_vertex_handle;
+ /**
+ * @brief A ordered set of integers that represents a simplex.
+ */
typedef Skeleton_blocker_simplex<Vertex_handle> Simplex_handle;
typedef Skeleton_blocker_simplex<Root_vertex_handle> Root_simplex_handle;
+ /**
+ * @brief Handle to a blocker of the complex.
+ */
typedef Simplex_handle* Blocker_handle;
@@ -117,12 +134,12 @@ protected:
public:
/**
- * Handle to an edge of the complex.
+ * @brief Handle to an edge of the complex.
*/
typedef typename boost::graph_traits<Graph>::edge_descriptor Edge_handle;
-
+protected:
typedef std::multimap<Vertex_handle,Simplex_handle *> BlockerMap;
typedef typename std::multimap<Vertex_handle,Simplex_handle *>::value_type BlockerPair;
typedef typename std::multimap<Vertex_handle,Simplex_handle *>::iterator BlockerMapIterator;
@@ -149,7 +166,6 @@ protected:
//todo remove!!!
-public:
/** Each vertex can access to the blockers passing through it. */
BlockerMap blocker_map_;
@@ -163,9 +179,12 @@ public:
/////////////////////////////////////////////////////////////////////////////
- /** @name Constructors / Destructors / Initialization
+ /** @name Constructors, Destructors
*/
//@{
+ /**
+ *@brief constructs a simplicial complex with a given number of vertices and a visitor.
+ */
Skeleton_blocker_complex(int num_vertices_ = 0,Visitor* visitor_=NULL):visitor(visitor_){
clear();
for (int i=0; i<num_vertices_; ++i){
@@ -277,10 +296,9 @@ private:
public:
/**
- * @brief Constructor with a list of simplices
+ * @brief Constructor with a list of simplices.
* @details The list of simplices must be the list
- * of simplices of a simplicial complex.
- *todo rewrite as iterators
+ * of simplices of a simplicial complex.
*/
Skeleton_blocker_complex(std::list<Simplex_handle>& simplices,Visitor* visitor_=NULL):
num_vertices_(0),num_blockers_(0),
@@ -315,7 +333,6 @@ public:
}
-
// We cannot use the default copy constructor since we need
// to make a copy of each of the blockers
Skeleton_blocker_complex(const Skeleton_blocker_complex& copy){
@@ -331,6 +348,8 @@ public:
}
}
+/**
+*/
Skeleton_blocker_complex& operator=(const Skeleton_blocker_complex& copy){
clear();
visitor = NULL;
@@ -354,7 +373,7 @@ public:
}
/**
- * Clears the simplicial complex. After a call to this function,
+ * @details Clears the simplicial complex. After a call to this function,
* blockers are destroyed. The 1-skeleton and the set of blockers
* are both empty.
*/
@@ -371,6 +390,9 @@ public:
skeleton.clear();
}
+/**
+*@brief allows to change the visitor.
+*/
void set_visitor(Visitor* other_visitor){
visitor = other_visitor;
}
@@ -397,11 +419,19 @@ public:
return *local;
}
+ /**
+ * @brief Return the vertex node associated to local Vertex_handle.
+ * @remark Assume that the vertex is present in the complex.
+ */
Graph_vertex& operator[](Vertex_handle address){
assert(0<=address.vertex && address.vertex< boost::num_vertices(skeleton));
return skeleton[address.vertex];
}
+ /**
+ * @brief Return the vertex node associated to local Vertex_handle.
+ * @remark Assume that the vertex is present in the complex.
+ */
const Graph_vertex& operator[](Vertex_handle address) const{
assert(0<=address.vertex && address.vertex< boost::num_vertices(skeleton));
return skeleton[address.vertex];
@@ -425,7 +455,8 @@ public:
/**
* @brief Remove a vertex from the simplicial complex
- * @remark In fact, it just deactivates the vertex.
+ * @remark It just deactivates the vertex with a boolean flag but does not
+ * remove it from vertices from complexity issues.
*/
void remove_vertex(Vertex_handle address){
assert(contains_vertex(address));
@@ -437,17 +468,15 @@ public:
if (visitor) visitor->on_remove_vertex(address);
}
- /**
- * @return true iff the simplicial complex contains the vertex u
- */
+/**
+*/
bool contains_vertex(Vertex_handle u) const{
if (u.vertex<0 || u.vertex>=boost::num_vertices(skeleton)) return false;
return (*this)[u].is_active();
}
- /**
- * @return true iff the simplicial complex contains the vertex u
- */
+/**
+*/
bool contains_vertex(Root_vertex_handle u) const{
boost::optional<Vertex_handle> address = get_address(u);
return address && (*this)[*address].is_active();
@@ -465,9 +494,8 @@ public:
}
/**
- * Given an Id return the address of the vertex having this Id in the complex.
- * For a simplicial complex, the address is the id but it may not be the case for a SubComplex.
- *
+ * @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<Vertex_handle> get_address(Root_vertex_handle id) const{
boost::optional<Vertex_handle> res;
@@ -487,10 +515,14 @@ public:
/**
+ * @brief Convert an address of a vertex of a complex to the address in
+ * the current complex.
+ * @details
* If the current complex is a sub (or sup) complex of 'other', it converts
* the address of a vertex v expressed in 'other' to the address of the vertex
* v in the current one.
- * @remark this methods uses Root_vertex_handle to identify the vertex
+ * @remark this methods uses Root_vertex_handle to identify the vertex and
+ * assumes the vertex is present in the current complex.
*/
Vertex_handle convert_handle_from_another_complex(
const Skeleton_blocker_complex& other,Vertex_handle vh_in_other) const{
@@ -499,7 +531,9 @@ public:
return *vh_in_current_complex;
}
-
+ /**
+ * @brief return the graph degree of a vertex.
+ */
int degree(Vertex_handle local) const{
assert(0<=local.vertex && local.vertex< boost::num_vertices(skeleton));
return degree_[local.vertex];
@@ -526,24 +560,40 @@ public:
return res;
}
+ /**
+ * @brief returns the stored node associated to an edge
+ */
Graph_edge& operator[](Edge_handle edge_handle){
return skeleton[edge_handle];
}
+ /**
+ * @brief returns the stored node associated to an edge
+ */
const Graph_edge& operator[](Edge_handle edge_handle) const{
return skeleton[edge_handle];
}
+ /**
+ * @brief returns the first vertex of an edge
+ * @details it assumes that the edge is present in the complex
+ */
Vertex_handle first_vertex(Edge_handle edge_handle) const{
return source(edge_handle,skeleton);
}
+ /**
+ * @brief returns the first vertex of an edge
+ * @details it assumes that the edge is present in the complex
+ */
Vertex_handle second_vertex(Edge_handle edge_handle) const{
return target(edge_handle,skeleton);
}
/**
* @brief returns the simplex made with the two vertices of the edge
+ * @details it assumes that the edge is present in the complex
+
*/
Simplex_handle get_vertices(Edge_handle edge_handle) const{
auto edge((*this)[edge_handle]);
@@ -551,7 +601,7 @@ public:
}
/**
- * @brief Adds an edge between vertices a and b
+ * @brief Adds an edge between vertices a and b and all its cofaces.
*/
Edge_handle add_edge(Vertex_handle a, Vertex_handle b){
assert(contains_vertex(a) && contains_vertex(b));
@@ -573,7 +623,7 @@ public:
}
/**
- * @brief Adds all edges of simplex sigma to the simplicial complex.
+ * @brief Adds all edges and their cofaces of a simplex to the simplicial complex.
*/
void add_edges(const Simplex_handle & sigma){
Simplex_handle_iterator i, j;
@@ -583,7 +633,8 @@ public:
}
/**
- * @brief Removes edge ab from the simplicial complex.
+ * @brief Removes an edge from the simplicial complex and all its cofaces.
+ * @details returns the former Edge_handle representing the edge
*/
virtual Edge_handle remove_edge(Vertex_handle a, Vertex_handle b){
bool found;
@@ -602,7 +653,7 @@ public:
/**
- * @brief Removes edge from the simplicial complex.
+ * @brief Removes edge and its cofaces from the simplicial complex.
*/
void remove_edge(Edge_handle edge){
assert(contains_vertex(first_vertex(edge)));
@@ -660,23 +711,10 @@ public:
/** @name Blockers operations
*/
//@{
- /**
- * Adds the 2-blocker abc
- */
- void add_blocker(Vertex_handle a, Vertex_handle b, Vertex_handle c){
- add_blocker(Simplex_handle(a,b,c));
- }
/**
- * Adds the 3-blocker abcd
- */
- void add_blocker(Vertex_handle a, Vertex_handle b, Vertex_handle c, Vertex_handle d){
- add_blocker(Simplex_handle(a,b,c,d));
- }
-
- /**
- * Adds the simplex blocker_pt to the set of blockers and
- * returns a Blocker_handle toward it if was not present before.
+ * @brief Adds the simplex to the set of blockers and
+ * returns a Blocker_handle toward it if was not present before and 0 otherwise.
*/
Blocker_handle add_blocker(const Simplex_handle& blocker){
if (contains_blocker(blocker))
@@ -700,7 +738,7 @@ public:
protected:
/**
- * Adds the simplex s to the set of blockers
+ * @brief Adds the simplex to the set of blockers
*/
void add_blocker(Blocker_handle blocker){
if (contains_blocker(*blocker))
@@ -744,8 +782,8 @@ protected:
public:
/**
- * Removes the simplex sigma from the set of blockers.
- * sigma has to belongs to the set of blockers
+ * @brief Removes the simplex from the set of blockers.
+ * @remark sigma has to belongs to the set of blockers
*/
void remove_blocker(const Blocker_handle sigma){
for (auto vertex : *sigma){
@@ -758,7 +796,7 @@ public:
/**
- * Remove all blockers, in other words, it expand the simplicial
+ * @brief Remove all blockers, in other words, it expand the simplicial
* complex to the smallest flag complex that contains it.
*/
void remove_blockers(){
@@ -850,17 +888,9 @@ private:
-
- /////////////////////////////////////////////////////////////////////////////
- /** @name Neighbourhood access
- */
- //@{
-
-public:
+protected:
/**
- * @brief Adds to simplex n the neighbours of v:
- * \f$ n \leftarrow n \cup N(v) \f$.
- *
+ * @details Adds to simplex the neighbours of v e.g. \f$ n \leftarrow n \cup N(v) \f$.
* If keep_only_superior is true then only vertices that are greater than v are added.
*/
virtual void add_neighbours(Vertex_handle v, Simplex_handle & n,bool keep_only_superior=false) const{
@@ -876,34 +906,25 @@ public:
}
/**
- * @brief Add to simplex res all vertices which are
+ * @details Add to simplex res all vertices which are
* neighbours of alpha: ie \f$ res \leftarrow res \cup N(alpha) \f$.
*
* If 'keep_only_superior' is true then only vertices that are greater than alpha are added.
- *
* todo revoir
*
*/
virtual void add_neighbours(const Simplex_handle &alpha, Simplex_handle & res,bool keep_only_superior=false) const{
res.clear();
- // ----------------------------
- // Compute vertices in the link
- // we compute the intersection of N(alpha_i) and store it in n
- // ----------------------------
auto alpha_vertex = alpha.begin();
add_neighbours(*alpha_vertex,res,keep_only_superior);
for (alpha_vertex = (alpha.begin())++ ; alpha_vertex != alpha.end() ; ++alpha_vertex)
- {
keep_neighbours(*alpha_vertex,res,keep_only_superior);
- }
}
/**
- * @brief Eliminates from simplex n all vertices which are
- * not neighbours of v: \f$ res \leftarrow res \cap N(v) \f$.
- *
+ * @details Remove from simplex n all vertices which are
+ * not neighbours of v e.g. \f$ res \leftarrow res \cap N(v) \f$.
* If 'keep_only_superior' is true then only vertices that are greater than v are keeped.
- *
*/
virtual void keep_neighbours(Vertex_handle v, Simplex_handle& res,bool keep_only_superior=false) const{
Simplex_handle nv;
@@ -912,32 +933,26 @@ public:
}
/**
- * @brief Eliminates from simplex n all vertices which are
- * neighbours of v: \f$ res \leftarrow res \setminus N(v) \f$.
- *
+ * @details Remove from simplex all vertices which are
+ * neighbours of v eg \f$ res \leftarrow res \setminus N(v) \f$.
* If 'keep_only_superior' is true then only vertices that are greater than v are added.
- *
*/
virtual void remove_neighbours(Vertex_handle v, Simplex_handle & res,bool keep_only_superior=false) const{
Simplex_handle nv;
add_neighbours(v,nv,keep_only_superior);
res.difference(nv);
}
- //@}
- /////////////////////////////////////////////////////////////////////////////
- /** @name Operations on the simplicial complex
- */
- //@{
public:
/**
* @brief Compute the local vertices of 's' in the current complex
* If one of them is not present in the complex then the return value is uninitialized.
*
- * xxx rename get_address et place un using dans sub_complex
+ *
*/
+ //xxx rename get_address et place un using dans sub_complex
boost::optional<Simplex_handle> get_simplex_address(const Root_simplex_handle& s) const
{
boost::optional<Simplex_handle> res;
@@ -1002,8 +1017,9 @@ public:
/*
* @brief returns the number of edges in the complex.
- * todo in O(n), cache the value
+ * @details currently in O(n)
*/
+ // todo cache the value
int num_edges() const{
return boost::num_edges(skeleton);
}
@@ -1031,22 +1047,6 @@ public:
return boost::connected_components(this->skeleton,&component[0]) - num_vert_collapsed;
}
-
- //todo remove
- // do
- void keep_only_largest_cc(){
- std::vector<unsigned> component(skeleton.vertex_set().size());
- boost::connected_components(this->skeleton,&component[0]);
- auto maxCC = min_element(component.begin(),component.end());
- for (unsigned i = 0; i != component.size(); ++i){
- if(component[i]!=*maxCC){
- if(this->contains_vertex(Vertex_handle(i)))
- this->remove_vertex(Vertex_handle(i));
- }
- }
- }
-
-
/**
* @brief %Test if the complex is a cone.
* @details Runs in O(n) where n is the number of vertices.
@@ -1154,6 +1154,7 @@ private:
public:
typedef Triangle_around_vertex_iterator<Skeleton_blocker_complex,Superior_link> Superior_triangle_around_vertex_iterator;
+
typedef boost::iterator_range < Triangle_around_vertex_iterator<Skeleton_blocker_complex,Link> > Complex_triangle_around_vertex_range;
/**
@@ -1222,6 +1223,9 @@ public:
typedef boost::iterator_range < Complex_simplex_iterator > Complex_simplex_range;
+ /**
+ * @brief Returns a Complex_simplex_range over all the simplices of the complex
+ */
Complex_simplex_range simplex_range() const
{
Complex_simplex_iterator end(this,true);
@@ -1264,7 +1268,9 @@ private:
public:
-
+ /**
+ * @brief Returns a range of the blockers of the complex passing through a vertex
+ */
Complex_blocker_around_vertex_range blocker_range(Vertex_handle v)
{
auto begin = Complex_blocker_around_vertex_iterator(blocker_map_.lower_bound(v));
@@ -1273,7 +1279,7 @@ public:
}
/**
- * @brief Returns a Complex_blocker_around_vertex_range over all blockers of the complex adjacent to the vertex v.
+ * @brief Returns a range of the blockers of the complex passing through a vertex
*/
Const_complex_blocker_around_vertex_range const_blocker_range(Vertex_handle v) const
{
@@ -1309,7 +1315,9 @@ private:
public:
-
+ /**
+ * @brief Returns a range of the blockers of the complex
+ */
Complex_blocker_range blocker_range()
{
auto begin = Complex_blocker_iterator(blocker_map_.begin(), blocker_map_.end() );
@@ -1317,7 +1325,9 @@ public:
return Complex_blocker_range(begin,end);
}
-
+ /**
+ * @brief Returns a range of the blockers of the complex
+ */
Const_complex_blocker_range const_blocker_range() const
{
auto begin = Const_complex_blocker_iterator(blocker_map_.begin(), blocker_map_.end() );
@@ -1339,6 +1349,7 @@ public:
*/
//@{
public:
+
std::string to_string() const{
std::ostringstream stream;
stream<<num_vertices()<<" vertices:\n"<<vertices_to_string()<<std::endl;
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 924b653c..4dbabd60 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blocker_geometric_complex.h
- *
- * Created on: Feb 11, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
#define SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
@@ -22,7 +36,7 @@ namespace skbl {
/**
* @brief Class that represents a geometric complex that can be simplified.
* The class allows access to points of vertices.
- *
+ * @ingroup skbl
*/
template<typename SkeletonBlockerGeometricDS>
class Skeleton_blocker_geometric_complex : public Skeleton_blocker_simplifiable_complex<SkeletonBlockerGeometricDS>
@@ -46,9 +60,10 @@ public:
/**
* @brief Add a vertex to the complex with its associated point.
*/
- void add_vertex(const Point& point){
+ Vertex_handle add_vertex(const Point& point){
Vertex_handle ad = SimplifiableSkeletonblocker::add_vertex();
(*this)[ad].point() = point;
+ return ad;
}
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 29c0691b..f3ebfa60 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blockers_link_complex.h
- *
- * Created on: Feb 7, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_LINK_COMPLEX_H_
#define GUDHI_SKELETON_BLOCKERS_LINK_COMPLEX_H_
@@ -22,6 +36,7 @@ template<class ComplexType> class Skeleton_blocker_sub_complex;
* \brief Class representing the link of a simplicial complex encoded by a skeleton/blockers pair.
* It inherits from Skeleton_blocker_sub_complex because such complex is a sub complex of a
* root complex.
+ * \ingroup skbl
*/
template<typename ComplexType>
class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<ComplexType>
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 4f9060ef..1a51e709 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
@@ -1,10 +1,24 @@
-/*
- * Skeleton_blocker_simplifiable_complex.h
- *
- * Created on: Feb 4, 2014
- * Author: dsalinas
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_SKELETON_BLOCKERS_SIMPLIFIABLE_COMPLEX_H_
#define GUDHI_SKELETON_BLOCKERS_SIMPLIFIABLE_COMPLEX_H_
@@ -17,6 +31,8 @@ namespace skbl {
/**
* \brief Class that allows simplification operation on a simplicial complex represented
* by a skeleton/blockers pair.
+ * \ingroup skbl
+ * @extends Skeleton_blocker_complex
*/
template<typename SkeletonBlockerDS>
class Skeleton_blocker_simplifiable_complex : public Skeleton_blocker_complex<SkeletonBlockerDS>
diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp
index 9f802463..2dafda52 100644
--- a/src/Skeleton_blocker/test/TestSimplifiable.cpp
+++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp
@@ -1,9 +1,24 @@
-/*
- * TestSimplifiable.cxx
- *
- * Created on: Feb 4, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#include <stdio.h>
@@ -59,8 +74,8 @@ bool test_contraction1(){
Complex complex(n);
build_complete(n,complex);
complex.remove_edge(Vertex_handle(b),Vertex_handle(z));
- complex.add_blocker(Vertex_handle(a),Vertex_handle(x),Vertex_handle(y));
- complex.add_blocker(Vertex_handle(b),Vertex_handle(x),Vertex_handle(y));
+ complex.add_blocker(Simplex_handle(Vertex_handle(a),Vertex_handle(x),Vertex_handle(y)));
+ complex.add_blocker(Simplex_handle(Vertex_handle(b),Vertex_handle(x),Vertex_handle(y)));
// Print result
cerr << "complex before complex"<< complex.to_string()<<endl;
@@ -121,7 +136,7 @@ bool test_link_condition1(){
Complex complex(0);
// Build the complexes
build_complete(4,complex);
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
// Print result
@@ -168,7 +183,7 @@ bool test_collapse2(){
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(Vertex_handle(1),Vertex_handle(2),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 <<endl<<endl;
@@ -191,7 +206,7 @@ bool test_collapse3(){
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(Vertex_handle(1),Vertex_handle(2),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 <<endl<<endl;
diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
index c89f84e2..f7bf289a 100644
--- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
+++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
@@ -1,3 +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 <http://www.gnu.org/licenses/>.
+ */
#include <stdio.h>
#include <stdlib.h>
#include <string>
@@ -203,7 +224,7 @@ bool test_iterator_triangles(){
complex.add_vertex();
complex.add_edge(Vertex_handle(4),Vertex_handle(7));
complex.add_edge(Vertex_handle(3),Vertex_handle(7));
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(6));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(6)));
num_triangles_seen=0;
TEST("triangles (should be 6 of them):");
@@ -234,7 +255,7 @@ bool test_iterator_simplices(){
complex.add_edge(Vertex_handle(4),Vertex_handle(5));
complex.add_edge(Vertex_handle(3),Vertex_handle(4));
- complex.add_blocker(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4),Vertex_handle(5));
+ complex.add_blocker(Simplex_handle(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4),Vertex_handle(5)));
bool correct_number_simplices = true;
@@ -301,7 +322,7 @@ bool test_iterator_simplices3(){
complex.add_edge(Vertex_handle(0),Vertex_handle(1));
complex.add_edge(Vertex_handle(1),Vertex_handle(2));
complex.add_edge(Vertex_handle(2),Vertex_handle(0));
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
unsigned num_simplices = 0 ;
@@ -449,7 +470,7 @@ bool test_link2(){
for (int j=i+1;j<15;j++)
complex.add_edge(Vertex_handle(i),Vertex_handle(j));
}
- complex.add_blocker(Vertex_handle(10),Vertex_handle(11),Vertex_handle(13));
+ complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(13)));
alpha = Simplex_handle(Vertex_handle(12),Vertex_handle(14));
Skeleton_blocker_link_complex<Complex> L(complex,alpha);
// Complexes built
@@ -487,7 +508,7 @@ bool test_link3(){
for (int j=i+1;j<15;j++)
complex.add_edge(Vertex_handle(i),Vertex_handle(j));
}
- complex.add_blocker(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12));
+ complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12)));
alpha = Simplex_handle(Vertex_handle(12),Vertex_handle(14));
Skeleton_blocker_link_complex<Complex> L(complex,alpha);
// Complexes built
@@ -519,7 +540,7 @@ bool test_link4(){
for (int j=i+1;j<15;j++)
complex.add_edge(Vertex_handle(i),Vertex_handle(j));
}
- complex.add_blocker(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12),Vertex_handle(13));
+ complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12),Vertex_handle(13)));
Simplex_handle alpha(Vertex_handle(12),Vertex_handle(14));
Skeleton_blocker_link_complex<Complex> L(complex,alpha);
// Complexes built
@@ -544,7 +565,7 @@ bool test_link5(){
Complex complex(0,new Print_complex_visitor<Vertex_handle>());
// Build the complexes
build_complete(4,complex);
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
Simplex_handle alpha(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
@@ -564,7 +585,7 @@ bool test_link6(){
Complex complex(0,new Print_complex_visitor<Vertex_handle>());
// Build the complexes
build_complete(4,complex);
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
Simplex_handle alpha(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
@@ -593,8 +614,8 @@ bool test_link7(){
complex.add_edge(Vertex_handle(i),Vertex_handle(7));
}
complex.add_edge(Vertex_handle(6),Vertex_handle(7));
- complex.add_blocker(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
- complex.add_blocker(Vertex_handle(3),Vertex_handle(4),Vertex_handle(5));
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+ complex.add_blocker(Simplex_handle(Vertex_handle(3),Vertex_handle(4),Vertex_handle(5)));
Simplex_handle alpha(Vertex_handle(3),Vertex_handle(4),Vertex_handle(5));
diff --git a/src/common/doc/Gudhi_banner.jpg b/src/common/doc/Gudhi_banner.jpg
new file mode 100644
index 00000000..ebd3d8af
--- /dev/null
+++ b/src/common/doc/Gudhi_banner.jpg
Binary files differ
diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h
index 4e36066f..b640ea7b 100644
--- a/src/common/doc/main_page.h
+++ b/src/common/doc/main_page.h
@@ -1,20 +1,38 @@
/**
\mainpage
+\image html "Gudhi_banner.jpg" "" width=20cm
+
The Gudhi library (Geometric Understanding in Higher Dimensions) is a generic C++ library for
-computational topology. Its goal is to provide robust, efficient, flexible and easy to use
+topological analysis of high-dimensional data whose goal is to provide robust, efficient, flexible and easy to use
implementations of
-state-of-the-art algorithms and data structures for computational topology. We refer to
+state-of-the-art algorithms and data structures for computational topology.
+
+The current release of the library allows to use several data-structures for simplicial complexes :
+simplex tree, Hasse diagram or skeleton-blocker. Several operations can then be done on top of these
+representations such a spersistent homology computation or simplification.
+
+All data-structures are generic and several of their aspects (such as stored elements, policies)
+can be parametrized via template classes.
+
+We refer to
\cite gudhilibrary_ICMS14
for a detailed description of the design of the library.
-The current release of the library allows the user to construct representations of simplicial complexes --
-simplex tree or Hasse diagram -- from a point
-cloud (Rips complex) or
-a list of simplices, and to compute their persistent homology with coefficients in a field
-\f$\mathbb{Z}/p\mathbb{Z}\f$ (for an arbitrary prime \f$p\f$), or simultaneously with coefficients
-in a family of fields (multi-field persistent homology).
+\section Compiling
+
+The library uses c++11 and requires Boost with version 1.48.0 or more recent : http://www.boost.org/.
+Some packages require additional libraries :
+\li the multi-field persistent homology algorithm has an optional dependency with GMP
+\li Qt demos require CGAL, Qt4 and QGLViewer
+
+The procedure to install these packages according to your operating system is
+detailled here http://doc.cgal.org/latest/Manual/installation.html
+
+The library compiles in Linux and Mac OSX.
+
+\section d Demos and Examples
To build the library, run the following in a terminal:
@@ -26,27 +44,13 @@ cmake -DCMAKE_BUILD_TYPE=Release ..
make
\endverbatim
-The library has dependencies with Boost 1.48.0 or more recent (required): http://www.boost.org/
-and with GMP: https://gmplib.org/ The dependency with GMP is optional, and is used only for the
-multi-field persistent homology algorithm.
-
-
-We provide example files: run these examples with -h for details on their use, and read the README file.
-
-\li <CODE>rips_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram.
-\li <CODE>rips_multifield_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram
-with a family of field coefficients.
-\li <CODE>performance_rips_persistence.cpp</CODE> provides timings for the construction of the Rips complex on a set of
-points sampling a Klein bottle in \f$\mathbb{R}^5\f$ with a simplex tree, its conversion to a
-Hasse diagram and the computation of persistent homology and multi-field persistent homology for the
-different representations.
\details
\copyright GNU General Public License v3.
-\verbatim Contact: Clément Maria, clement.maria@inria.fr \endverbatim
+\verbatim Contact: gudhi-devel@lists.gforge.inria.fr \endverbatim
*/ \ No newline at end of file
diff --git a/src/common/include/gudhi/Clock.h b/src/common/include/gudhi/Clock.h
index ea21659e..08096c05 100644
--- a/src/common/include/gudhi/Clock.h
+++ b/src/common/include/gudhi/Clock.h
@@ -1,9 +1,24 @@
-/*
- * Clock.h
- *
- * Created on: Jun 17, 2014
- * Author: dsalinas
- */
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_CLOCK_H_
#define GUDHI_CLOCK_H_
diff --git a/src/common/include/gudhi/Off_reader.h b/src/common/include/gudhi/Off_reader.h
index a9c64f97..e29218d8 100644
--- a/src/common/include/gudhi/Off_reader.h
+++ b/src/common/include/gudhi/Off_reader.h
@@ -1,8 +1,8 @@
/*
* Off_reader.h
* Created on: Nov 28, 2014
- * This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * 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
@@ -21,7 +21,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
@@ -113,18 +113,26 @@ private:
bool is_off_file = (line.find("OFF") != std::string::npos);
bool is_noff_file = (line.find("nOFF") != std::string::npos);
- if(!is_off_file && !is_noff_file) return false;
+ if(!is_off_file && !is_noff_file) {
+ std::cerr << line<<std::endl;
+ std::cerr << "missing off header\n";
+ return false;
+ }
if(!goto_next_uncomment_line(line)) return false;
std::istringstream iss(line);
if(is_off_file){
off_info_.dim = 3;
- if(!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges))
+ if(!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
+ std::cerr << "incorrect number of vertices/faces/edges\n";
return false;
+ }
}
else
- if(!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges))
+ if(!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
+ std::cerr << "incorrect number of vertices/faces/edges\n";
return false;
+ }
off_visitor.init(off_info_.dim,off_info_.num_vertices,off_info_.num_faces,off_info_.num_edges);
return true;
@@ -134,7 +142,7 @@ private:
uncomment_line.clear();
do
std::getline(stream_, uncomment_line);
- while(uncomment_line[0] == '%');
+ while(uncomment_line[0] == '%');// || uncomment_line.empty());
return (uncomment_line.size()>0 && uncomment_line[0] != '%');
}
@@ -171,6 +179,19 @@ private:
};
+template<typename OFFVisitor>
+void read_off(const std::string& name_file_off,OFFVisitor& vis){
+ std::ifstream stream(name_file_off);
+ if(!stream.is_open())
+ std::cerr <<"could not open file \n";
+ else{
+ Off_reader off_reader(stream);
+ off_reader.read(vis);
+ }
+}
+
+
+
} // namespace Gudhi
diff --git a/src/common/include/gudhi/Utils.h b/src/common/include/gudhi/Utils.h
index cef361dc..1626a0bf 100644
--- a/src/common/include/gudhi/Utils.h
+++ b/src/common/include/gudhi/Utils.h
@@ -1,17 +1,31 @@
-/*
- * Utils.h
- *
- * Created on: 13 juin 2013
- * Author: salinasd
- */
-
+ /* 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 <http://www.gnu.org/licenses/>.
+ */
#ifndef GUDHI_UTILS_H_
#define GUDHI_UTILS_H_
#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)"<<std::endl
-//#define DBG_VERBOSE
+#define DBG_VERBOSE
#ifdef DBG_VERBOSE
#define DBG(a) std::cerr << "DBG: " << (a)<<std::endl
#define DBGMSG(a,b) std::cerr << "DBG: " << a<<b<<std::endl
diff --git a/src/common/include/gudhi/iofile.h b/src/common/include/gudhi/iofile.h
deleted file mode 100644
index b939d45b..00000000
--- a/src/common/include/gudhi/iofile.h
+++ /dev/null
@@ -1,236 +0,0 @@
-//todo remove and use off_reader instead
-
-#ifndef GUDHI_IOFILE_H_
-#define GUDHI_IOFILE_H_
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <cstdio>
-#include <cstring>
-#include <list>
-#include <cassert>
-
-
-
-//todo use my new visitor based off instead
-/**
- * @brief OFF reader, save the content of the file (vertices and maximal faces) in 'complex'.
- * The class Complex has to handle the following operations:
- * - void add_vertex(double[dim],int dim)
- * - void add_face(int dimension ,int[dimension] vertices)
- * Source from : http://www.holmes3d.net/graphics/offfiles/OFFLoading.txt
- *
- * @todo todo ignore comments in the file -> # comment
- */
-template<typename Complex> inline
-bool general_read_off_file(const std::string & file_name, Complex& complex){
- // Declare temporary variables to read data into.
- // If the read goes well, we'll copy these into
- // our class variables, overwriting what used to
- // be there. If it doesn't, we won't have messed up
- // our previous data structures.
- int tempNumPoints = 0; // Number of x,y,z coordinate triples
- int tempNumFaces = 0; // Number of polygon sets
- int tempNumEdges = 0; // Unused, except for reading.
- int tempDimPoints = 0;
- double** tempPoints = NULL; // An array of x,y,z coordinates.
- int** tempFaces = NULL; // An array of arrays of point
- // pointers. Each entry in this
- // is an array of integers. Each
- // integer in that array is the
- // index of the x, y, and z
- // coordinates in the corresponding
- // arrays.
- int* tempFaceSizes = NULL; // An array of polygon point counts.
- // Each of the arrays in the tempFaces
- // array may be of different lengths.
- // This array corresponds to that
- // array, and gives their lengths.
- int i; // Generic loop variable.
- bool goodLoad = true; // Set to false if the file appears
- // not to be a valid OFF file.
- char tempBuf[128]; // A buffer for reading strings
- // from the file.
-
- // Create an input file stream for the file the CArchive
- // is connected to. This allows use of the overloaded
- // extraction operator for conversion from string
- // data to doubles and ints.
- std::ifstream ifs (file_name.c_str(), std::ios::in);
- if(!ifs.is_open()) {
- std::cerr << "Unable to open file " << file_name << std::endl;
- return false;
- }
-
- // Grab the first string. If it's "OFF", we think this
- // is an OFF file and continue. Otherwise we give up.
- ifs >> tempBuf;
- if (strcmp(tempBuf, "OFF") != 0) {
- goodLoad = false;
- std::cerr << "No OFF preambule\n";
- }
-
- // Read the sizes for our two arrays, and the third
- // int on the line. If the important two are zero
- // sized, this is a messed up OFF file. Otherwise,
- // we setup our temporary arrays.
- if (goodLoad) {
- ifs >> tempNumPoints >> tempNumFaces >> tempNumEdges;
- if (tempNumPoints < 1 || tempNumFaces < 0) {
- // If either of these were negative, we make
- // sure that both are set to zero. This is
- // important for later deleting our temporary
- // storage.
- goodLoad = false;
- std::cerr << "tempNumPoints < 1 || tempNumFaces < 0\n";
- tempNumPoints = 0;
- tempNumFaces = 0;
- } else {
- tempPoints = new double*[tempNumPoints];
- tempFaces = new int*[tempNumFaces];
- tempFaceSizes = new int[tempNumFaces];
- }
- }
-
- if (goodLoad) {
- // Load all of the points.
-
- // we start by loading the first one
- // the case is difference because then we dont know the dimension by advance
- // we discover the point dimension by reading the first line
- std::string lineFirstPoint;
- std::getline(ifs, lineFirstPoint);
- while(lineFirstPoint.size()<3){
- std::getline(ifs, lineFirstPoint);
- }
-
- // we store the first point in a temporary list
- std::istringstream lineFirstPointStream(lineFirstPoint);
- std::list<double> firstTempPoint;
- double coord;
- while(lineFirstPointStream>>coord){
- firstTempPoint.push_back(coord);
- ++tempDimPoints;
- }
- // we store the point in our points array
- tempPoints[0]=new double[tempDimPoints];
- for( int j = 0 ; j<tempDimPoints; ++j){
- tempPoints[0][j] = firstTempPoint.front();
- firstTempPoint.pop_front();
- }
-
- // now, we know the dimension and can read safely other points
- for (i = 1; i < tempNumPoints; i++) {
- tempPoints[i] = new double[tempDimPoints];
- for (int j = 0 ; j<tempDimPoints ; ++j){
- ifs>>tempPoints[i][j];
- }
- }
-
- // Load all of the faces.
- for (i = 0; i < tempNumFaces; i++) {
- // This tells us how many points make up
- // this face.
- ifs >> tempFaceSizes[i];
- // So we declare a new array of that size
- tempFaces[i] = new int[tempFaceSizes[i]];
- // And load its elements with the vertex indices.
- for (int j = 0; j < tempFaceSizes[i]; j++) {
- ifs >> tempFaces[i][j];
- }
- // Clear out any face color data by reading up to
- // the newline. 128 is probably considerably more
- // space than necessary, but better safe than
- // sorry.
- ifs.getline(tempBuf, 128);
- }
- }
-
- // Here is where we copy the data from the temp
- // structures into our permanent structures. We
- // probably will do some more processing on the
- // data at the same time. This code you must fill
- // in on your own.
- if (goodLoad) {
- // we save vertices first in the complex
- for (i = 0; i < tempNumPoints; i++)
- complex.add_vertex(tempPoints[i],tempDimPoints);
-
- // we save faces
- for (i = 0; i < tempNumFaces; i++) {
- for (int j = 0; j < tempFaceSizes[i]; j++)
- complex.add_face(tempFaceSizes[i],tempFaces[i]);
- }
- }
-
- // Now that we're done, we have to make sure we
- // free our dynamic memory.
- for (i = 0; i < tempNumPoints; i++) {
- delete []tempPoints[i];
- }
- delete []tempPoints;
-
- for (i = 0; i < tempNumFaces; i++) {
- delete tempFaces[i];
- }
- delete []tempFaces;
- delete []tempFaceSizes;
-
- // Clean up our ifstream. The MFC framework will
- // take care of the CArchive.
- ifs.close();
-
- return goodLoad;
-}
-
-
-template<typename Complex>
-class Geometric_flag_complex_wrapper{
- Complex& complex_;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
-
-public:
- Geometric_flag_complex_wrapper(Complex& complex,bool load_only_points = false):
- complex_(complex),
- load_only_points_(load_only_points)
-{}
-
-
- void add_vertex(double* xyz,int dim){
- Point p(dim);
- for(int i=0;i<dim;++i)
- p[i] = xyz[i];
- complex_.add_vertex(p);
- }
-
- void add_face(int dimension ,int* vertices){
- if (!load_only_points_){
- for (int i = 0; i<dimension ; ++i)
- for (int j = i+1; j<dimension ; ++j)
- complex_.add_edge(Vertex_handle(vertices[i]),Vertex_handle(vertices[j]));
- }
- }
-};
-
-
-
-
-/**
- * @brief Read a mesh into a OFF file
- * load_only_points should be true if only the points have to be loaded.
- */
-template<typename Complex>
-bool read_off_file(std::string file_name,Complex &complex,bool load_only_points = false){
- complex.clear();
- Geometric_flag_complex_wrapper<Complex> complex_wrapper(complex,load_only_points);
- return general_read_off_file(file_name,complex_wrapper);
-
-}
-
-
-#endif