multipers 2.2.3__cp312-cp312-win_amd64.whl → 2.3.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of multipers might be problematic. Click here for more details.

Files changed (182) hide show
  1. multipers/__init__.py +33 -31
  2. multipers/_signed_measure_meta.py +430 -430
  3. multipers/_slicer_meta.py +211 -212
  4. multipers/data/MOL2.py +458 -458
  5. multipers/data/UCR.py +18 -18
  6. multipers/data/graphs.py +466 -466
  7. multipers/data/immuno_regions.py +27 -27
  8. multipers/data/pytorch2simplextree.py +90 -90
  9. multipers/data/shape3d.py +101 -101
  10. multipers/data/synthetic.py +113 -111
  11. multipers/distances.py +198 -198
  12. multipers/filtration_conversions.pxd.tp +84 -84
  13. multipers/filtrations/__init__.py +18 -0
  14. multipers/filtrations/filtrations.py +289 -0
  15. multipers/filtrations.pxd +224 -224
  16. multipers/function_rips.cp312-win_amd64.pyd +0 -0
  17. multipers/function_rips.pyx +105 -105
  18. multipers/grids.cp312-win_amd64.pyd +0 -0
  19. multipers/grids.pyx +350 -350
  20. multipers/gudhi/Persistence_slices_interface.h +132 -132
  21. multipers/gudhi/Simplex_tree_interface.h +239 -245
  22. multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
  23. multipers/gudhi/cubical_to_boundary.h +59 -59
  24. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
  25. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
  26. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
  27. multipers/gudhi/gudhi/Debug_utils.h +45 -45
  28. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
  29. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
  30. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
  31. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
  32. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
  33. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
  34. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
  35. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
  36. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
  37. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
  38. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
  39. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
  40. multipers/gudhi/gudhi/Matrix.h +2107 -2107
  41. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
  42. multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
  43. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
  44. multipers/gudhi/gudhi/Off_reader.h +173 -173
  45. multipers/gudhi/gudhi/One_critical_filtration.h +1432 -1431
  46. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
  47. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
  48. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
  49. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
  50. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
  51. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
  52. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
  53. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
  54. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
  55. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
  56. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
  57. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
  58. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
  59. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
  60. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
  61. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
  62. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
  63. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
  64. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
  65. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
  66. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
  67. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
  68. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
  69. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
  75. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
  76. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
  77. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
  78. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
  79. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
  80. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
  81. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
  82. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
  83. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
  84. multipers/gudhi/gudhi/Points_off_io.h +171 -171
  85. multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
  86. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
  87. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
  88. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
  89. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
  90. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
  91. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
  92. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
  93. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
  94. multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
  95. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
  96. multipers/gudhi/gudhi/distance_functions.h +62 -62
  97. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
  98. multipers/gudhi/gudhi/persistence_interval.h +253 -253
  99. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
  100. multipers/gudhi/gudhi/reader_utils.h +367 -367
  101. multipers/gudhi/mma_interface_coh.h +256 -255
  102. multipers/gudhi/mma_interface_h0.h +223 -231
  103. multipers/gudhi/mma_interface_matrix.h +284 -282
  104. multipers/gudhi/naive_merge_tree.h +536 -575
  105. multipers/gudhi/scc_io.h +310 -289
  106. multipers/gudhi/truc.h +890 -888
  107. multipers/io.cp312-win_amd64.pyd +0 -0
  108. multipers/io.pyx +711 -711
  109. multipers/ml/accuracies.py +90 -90
  110. multipers/ml/convolutions.py +520 -520
  111. multipers/ml/invariants_with_persistable.py +79 -79
  112. multipers/ml/kernels.py +176 -176
  113. multipers/ml/mma.py +713 -714
  114. multipers/ml/one.py +472 -472
  115. multipers/ml/point_clouds.py +352 -346
  116. multipers/ml/signed_measures.py +1589 -1589
  117. multipers/ml/sliced_wasserstein.py +461 -461
  118. multipers/ml/tools.py +113 -113
  119. multipers/mma_structures.cp312-win_amd64.pyd +0 -0
  120. multipers/mma_structures.pxd +127 -127
  121. multipers/mma_structures.pyx +4 -4
  122. multipers/mma_structures.pyx.tp +1085 -1085
  123. multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -93
  124. multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -97
  125. multipers/multi_parameter_rank_invariant/function_rips.h +322 -322
  126. multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -769
  127. multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -148
  128. multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -369
  129. multipers/multiparameter_edge_collapse.py +41 -41
  130. multipers/multiparameter_module_approximation/approximation.h +2296 -2295
  131. multipers/multiparameter_module_approximation/combinatory.h +129 -129
  132. multipers/multiparameter_module_approximation/debug.h +107 -107
  133. multipers/multiparameter_module_approximation/format_python-cpp.h +286 -286
  134. multipers/multiparameter_module_approximation/heap_column.h +238 -238
  135. multipers/multiparameter_module_approximation/images.h +79 -79
  136. multipers/multiparameter_module_approximation/list_column.h +174 -174
  137. multipers/multiparameter_module_approximation/list_column_2.h +232 -232
  138. multipers/multiparameter_module_approximation/ru_matrix.h +347 -347
  139. multipers/multiparameter_module_approximation/set_column.h +135 -135
  140. multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -36
  141. multipers/multiparameter_module_approximation/unordered_set_column.h +166 -166
  142. multipers/multiparameter_module_approximation/utilities.h +403 -419
  143. multipers/multiparameter_module_approximation/vector_column.h +223 -223
  144. multipers/multiparameter_module_approximation/vector_matrix.h +331 -331
  145. multipers/multiparameter_module_approximation/vineyards.h +464 -464
  146. multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -649
  147. multipers/multiparameter_module_approximation.cp312-win_amd64.pyd +0 -0
  148. multipers/multiparameter_module_approximation.pyx +216 -217
  149. multipers/pickle.py +90 -53
  150. multipers/plots.py +342 -334
  151. multipers/point_measure.cp312-win_amd64.pyd +0 -0
  152. multipers/point_measure.pyx +322 -320
  153. multipers/simplex_tree_multi.cp312-win_amd64.pyd +0 -0
  154. multipers/simplex_tree_multi.pxd +133 -133
  155. multipers/simplex_tree_multi.pyx +18 -15
  156. multipers/simplex_tree_multi.pyx.tp +1939 -1935
  157. multipers/slicer.cp312-win_amd64.pyd +0 -0
  158. multipers/slicer.pxd +81 -20
  159. multipers/slicer.pxd.tp +215 -214
  160. multipers/slicer.pyx +1091 -308
  161. multipers/slicer.pyx.tp +924 -914
  162. multipers/tensor/tensor.h +672 -672
  163. multipers/tensor.pxd +13 -13
  164. multipers/test.pyx +44 -44
  165. multipers/tests/__init__.py +57 -57
  166. multipers/torch/diff_grids.py +217 -217
  167. multipers/torch/rips_density.py +310 -304
  168. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/LICENSE +21 -21
  169. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/METADATA +21 -11
  170. multipers-2.3.0.dist-info/RECORD +182 -0
  171. multipers/tests/test_diff_helper.py +0 -73
  172. multipers/tests/test_hilbert_function.py +0 -82
  173. multipers/tests/test_mma.py +0 -83
  174. multipers/tests/test_point_clouds.py +0 -49
  175. multipers/tests/test_python-cpp_conversion.py +0 -82
  176. multipers/tests/test_signed_betti.py +0 -181
  177. multipers/tests/test_signed_measure.py +0 -89
  178. multipers/tests/test_simplextreemulti.py +0 -221
  179. multipers/tests/test_slicer.py +0 -221
  180. multipers-2.2.3.dist-info/RECORD +0 -189
  181. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/WHEEL +0 -0
  182. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/top_level.txt +0 -0
@@ -1,450 +1,450 @@
1
- /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2
- * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3
- * Author(s): Pawel Dlotko
4
- *
5
- * Copyright (C) 2015 Inria
6
- *
7
- * Modification(s):
8
- * - YYYY/MM Author: Description of the modification
9
- */
10
-
11
- #ifndef BITMAP_CUBICAL_COMPLEX_H_
12
- #define BITMAP_CUBICAL_COMPLEX_H_
13
-
14
- #include <gudhi/Debug_utils.h>
15
- #include <gudhi/Bitmap_cubical_complex_base.h>
16
- #include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
17
-
18
- #ifdef GUDHI_USE_TBB
19
- #include <tbb/parallel_sort.h>
20
- #endif
21
-
22
- #include <limits>
23
- #include <utility> // for pair<>
24
- #include <algorithm> // for sort
25
- #include <vector>
26
- #include <numeric> // for iota
27
- #include <cstddef>
28
- #include <stdexcept>
29
-
30
- namespace Gudhi {
31
-
32
- namespace cubical_complex {
33
-
34
- template <typename T>
35
- class is_before_in_filtration;
36
-
37
- /**
38
- * @brief Cubical complex represented as a bitmap.
39
- * @ingroup cubical_complex
40
- * @details This is a Bitmap_cubical_complex class. It joints a functionalities of Bitmap_cubical_complex_base and
41
- * Bitmap_cubical_complex_periodic_boundary_conditions_base classes into
42
- * Gudhi persistent homology engine. It is a template class that inherit from its template parameter. The template
43
- * parameter is supposed to be either Bitmap_cubical_complex_base or
44
- * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
45
- *
46
- * This class implements the concept `FilteredComplex`.
47
- **/
48
- template <typename T>
49
- class Bitmap_cubical_complex : public T {
50
- public:
51
- //*********************************************//
52
- // Typedefs and typenames
53
- //*********************************************//
54
- typedef std::size_t Simplex_key;
55
- typedef typename T::filtration_type Filtration_value;
56
- typedef Simplex_key Simplex_handle;
57
-
58
- //*********************************************//
59
- // Constructors
60
- //*********************************************//
61
- // Over here we need to define various input types. I am proposing the following ones:
62
- // Perseus style
63
- // TODO(PD) H5 files?
64
- // TODO(PD) binary files with little endians / big endians ?
65
- // TODO(PD) constructor from a vector of elements of a type T. ?
66
-
67
- /**
68
- * @param[in] perseus_style_file The name of a \ref FileFormatsPerseus "Perseus-style file".
69
- **/
70
- explicit Bitmap_cubical_complex(const char* perseus_style_file)
71
- : T(perseus_style_file), key_associated_to_simplex(num_simplices()) {
72
- #ifdef DEBUG_TRACES
73
- std::clog << "Bitmap_cubical_complex( const char* perseus_style_file )\n";
74
- #endif
75
- }
76
-
77
- /**
78
- * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
79
- * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
80
- * and of the vertices otherwise.
81
- * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
82
- **/
83
- Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
84
- const std::vector<Filtration_value>& cells,
85
- bool input_top_cells = true)
86
- : T(dimensions, cells, input_top_cells), key_associated_to_simplex(num_simplices()) {
87
- }
88
-
89
- /**
90
- * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
91
- * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
92
- * and of the vertices otherwise.
93
- * @param[in] directions_in_which_periodic_b_cond_are_to_be_imposed Specifies for each dimension (as per `dimensions`) if the space is periodic (`true`) or not (`false`), or in other words if the boundaries should be identified.
94
- * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
95
- **/
96
- Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
97
- const std::vector<Filtration_value>& cells,
98
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed,
99
- bool input_top_cells = true)
100
- : T(dimensions, cells, directions_in_which_periodic_b_cond_are_to_be_imposed, input_top_cells),
101
- key_associated_to_simplex(num_simplices()) {
102
- }
103
-
104
- /**
105
- * Destructor.
106
- **/
107
- virtual ~Bitmap_cubical_complex() {}
108
-
109
- //*********************************************//
110
- // Other 'easy' functions
111
- //*********************************************//
112
-
113
- /**
114
- * Returns number of all cubes in the complex.
115
- **/
116
- std::size_t num_simplices() const { return this->data.size(); }
117
-
118
- /**
119
- * Returns a Simplex_handle to a cube that do not exist in this complex.
120
- **/
121
- static Simplex_handle null_simplex() {
122
- #ifdef DEBUG_TRACES
123
- std::clog << "Simplex_handle null_simplex()\n";
124
- #endif
125
- return std::numeric_limits<Simplex_handle>::max();
126
- }
127
-
128
- /**
129
- * Returns dimension of the complex.
130
- **/
131
- inline std::size_t dimension() const { return this->sizes.size(); }
132
-
133
- /**
134
- * Return dimension of a cell pointed by the Simplex_handle.
135
- **/
136
- inline unsigned dimension(Simplex_handle sh) const {
137
- #ifdef DEBUG_TRACES
138
- std::clog << "unsigned dimension(const Simplex_handle& sh)\n";
139
- #endif
140
- GUDHI_CHECK(sh != null_simplex(), std::logic_error("Only real cells have a dimension"));
141
- return this->get_dimension_of_a_cell(sh);
142
- }
143
-
144
- /**
145
- * Return the filtration of a cell pointed by the Simplex_handle, or +inf for `null_simplex()`.
146
- **/
147
- Filtration_value filtration(Simplex_handle sh) {
148
- #ifdef DEBUG_TRACES
149
- std::clog << "Filtration_value filtration(const Simplex_handle& sh)\n";
150
- #endif
151
- // Returns the filtration value of a simplex.
152
- if (sh != null_simplex()) return this->data[sh];
153
- return std::numeric_limits<Filtration_value>::infinity();
154
- }
155
-
156
- /**
157
- * Return a key which is not a key of any cube in the considered data structure.
158
- **/
159
- static Simplex_key null_key() {
160
- #ifdef DEBUG_TRACES
161
- std::clog << "Simplex_key null_key()\n";
162
- #endif
163
- return std::numeric_limits<Simplex_handle>::max();
164
- }
165
-
166
- /**
167
- * Return the key of a cube pointed by the Simplex_handle.
168
- **/
169
- Simplex_key key(Simplex_handle sh) const {
170
- #ifdef DEBUG_TRACES
171
- std::clog << "Simplex_key key(const Simplex_handle& sh)\n";
172
- #endif
173
- GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("key(null_simplex()) is not supported"));
174
- return this->key_associated_to_simplex[sh];
175
- }
176
-
177
- /**
178
- * Return the k-th Simplex_handle in filtration order.
179
- *
180
- * Only available after initialize_filtration() or filtration_simplex_range() has been called.
181
- **/
182
- Simplex_handle simplex(Simplex_key k) {
183
- #ifdef DEBUG_TRACES
184
- std::clog << "Simplex_handle simplex(Simplex_key key)\n";
185
- #endif
186
- GUDHI_CHECK (k != null_key(), std::invalid_argument("simplex(null_key()) is not supported"));
187
- GUDHI_CHECK (!sorted_cells.empty(), std::logic_error("initialize_filtration() or filtration_simplex_range() must be called before simplex()"));
188
- return this->sorted_cells[k];
189
- }
190
-
191
- /**
192
- * Assign key to a cube pointed by the Simplex_handle
193
- **/
194
- void assign_key(Simplex_handle sh, Simplex_key key) {
195
- #ifdef DEBUG_TRACES
196
- std::clog << "void assign_key(Simplex_handle& sh, Simplex_key key)\n";
197
- #endif
198
- GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("assign_key(null_simplex()) is not supported"));
199
- this->key_associated_to_simplex[sh] = key;
200
- }
201
-
202
- /**
203
- * Precompute a sorted list of the cells for filtration_simplex_range() and simplex().
204
- * It is automatically called by filtration_simplex_range() if needed, but NOT by simplex().
205
- **/
206
- void initialize_filtration();
207
-
208
- //*********************************************//
209
- // Iterators
210
- //*********************************************//
211
-
212
- /**
213
- * Boundary_simplex_range class provides ranges for boundary iterators.
214
- **/
215
- typedef typename std::vector<Simplex_handle>::iterator Boundary_simplex_iterator;
216
- typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
217
-
218
- /**
219
- * Range of all the cells in filtration order.
220
- * Secondary criteria for filtration are:
221
- * (1) Dimension of a cube (lower dimensional comes first).
222
- * (2) Position in the data structure (the ones that are earliest in the data structure come first).
223
- **/
224
- typedef std::vector<Simplex_handle> Filtration_simplex_range;
225
-
226
- //*********************************************//
227
- // Methods to access iterators from the container:
228
-
229
- /**
230
- * boundary_simplex_range creates an object of a Boundary_simplex_range class
231
- * that provides ranges for the Boundary_simplex_iterator.
232
- **/
233
- Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) { return this->get_boundary_of_a_cell(sh); }
234
-
235
- /**
236
- * Range of all the cells in filtration order.
237
- * Secondary criteria for filtration are:
238
- * (1) Dimension of a cube (lower dimensional comes first).
239
- * (2) Position in the data structure (the ones that are earliest in the data structure come first).
240
- *
241
- * This implicitly calls initialize_filtration() if it has never been called.
242
- **/
243
- Filtration_simplex_range const& filtration_simplex_range() {
244
- #ifdef DEBUG_TRACES
245
- std::clog << "Filtration_simplex_range filtration_simplex_range()\n";
246
- #endif
247
- if (sorted_cells.empty()) initialize_filtration();
248
- return sorted_cells;
249
- }
250
- //*********************************************//
251
-
252
- //*********************************************//
253
- // Elements which are in Gudhi now, but I (and in all the cases I asked also Marc) do not understand why they are
254
- // there.
255
- // TODO(PD) the file IndexingTag.h in the Gudhi library contains an empty structure, so
256
- // I understand that this is something that was planned (for simplicial maps?)
257
- // but was never finished. The only idea I have here is to use the same empty structure from
258
- // IndexingTag.h file, but only if the compiler needs it. If the compiler
259
- // do not need it, then I would rather not add here elements which I do not understand.
260
- // typedef Indexing_tag
261
-
262
- /**
263
- * Returns the extremities of edge `e`
264
- **/
265
- std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle e) {
266
- std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(e);
267
- #ifdef DEBUG_TRACES
268
- std::clog << "std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle e )\n";
269
- std::clog << "bdry.size() : " << bdry.size() << "\n";
270
- #endif
271
- if (bdry.size() != 2)
272
- throw(
273
- "Error in endpoints in Bitmap_cubical_complex class. The cell is not an edge.");
274
- return std::make_pair(bdry[0], bdry[1]);
275
- }
276
-
277
- class Skeleton_simplex_range;
278
-
279
- class Skeleton_simplex_iterator {
280
- // Iterator over all simplices of the complex in the order of the indexing scheme.
281
- public:
282
- typedef std::input_iterator_tag iterator_category;
283
- typedef Simplex_handle value_type;
284
- typedef std::ptrdiff_t difference_type;
285
- typedef value_type* pointer;
286
- typedef value_type reference;
287
-
288
- Skeleton_simplex_iterator(Bitmap_cubical_complex* b, std::size_t d) : b(b), dimension(d) {
289
- #ifdef DEBUG_TRACES
290
- std::clog << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , std::size_t d )\n";
291
- #endif
292
- // find the position of the first simplex of a dimension d
293
- this->position = 0;
294
- while ((this->position != b->data.size()) &&
295
- (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
296
- ++this->position;
297
- }
298
- }
299
-
300
- Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) {}
301
-
302
- Skeleton_simplex_iterator operator++() {
303
- #ifdef DEBUG_TRACES
304
- std::clog << "Skeleton_simplex_iterator operator++()\n";
305
- #endif
306
- // increment the position as long as you did not get to the next element of the dimension dimension.
307
- ++this->position;
308
- while ((this->position != this->b->data.size()) &&
309
- (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
310
- ++this->position;
311
- }
312
- return (*this);
313
- }
314
-
315
- Skeleton_simplex_iterator operator++(int) {
316
- Skeleton_simplex_iterator result = *this;
317
- ++(*this);
318
- return result;
319
- }
320
-
321
- bool operator==(const Skeleton_simplex_iterator& rhs) const {
322
- #ifdef DEBUG_TRACES
323
- std::clog << "bool operator ==\n";
324
- #endif
325
- return (this->position == rhs.position);
326
- }
327
-
328
- bool operator!=(const Skeleton_simplex_iterator& rhs) const {
329
- #ifdef DEBUG_TRACES
330
- std::clog << "bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
331
- #endif
332
- return !(*this == rhs);
333
- }
334
-
335
- Simplex_handle operator*() {
336
- #ifdef DEBUG_TRACES
337
- std::clog << "Simplex_handle operator*() \n";
338
- #endif
339
- return this->position;
340
- }
341
-
342
- friend class Skeleton_simplex_range;
343
-
344
- private:
345
- Bitmap_cubical_complex<T>* b;
346
- std::size_t position;
347
- unsigned dimension;
348
- };
349
-
350
- /**
351
- * @brief A range containing all the cells of dimension at most k.
352
- **/
353
- class Skeleton_simplex_range {
354
- // Range over the simplices of the complex in the order of the filtration.
355
- // .begin() and .end() return type Skeleton_simplex_iterator.
356
- public:
357
- typedef Skeleton_simplex_iterator const_iterator;
358
- typedef Skeleton_simplex_iterator iterator;
359
-
360
- Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) {}
361
-
362
- Skeleton_simplex_iterator begin() {
363
- #ifdef DEBUG_TRACES
364
- std::clog << "Skeleton_simplex_iterator begin()\n";
365
- #endif
366
- return Skeleton_simplex_iterator(this->b, this->dimension);
367
- }
368
-
369
- Skeleton_simplex_iterator end() {
370
- #ifdef DEBUG_TRACES
371
- std::clog << "Skeleton_simplex_iterator end()\n";
372
- #endif
373
- Skeleton_simplex_iterator it(this->b, this->dimension);
374
- it.position = this->b->data.size();
375
- return it;
376
- }
377
-
378
- private:
379
- Bitmap_cubical_complex<T>* b;
380
- unsigned dimension;
381
- };
382
-
383
- /**
384
- * Returns a range containing all the cells of dimension at most `dimension`.
385
- **/
386
- Skeleton_simplex_range skeleton_simplex_range(unsigned dimension) {
387
- #ifdef DEBUG_TRACES
388
- std::clog << "Skeleton_simplex_range skeleton_simplex_range( unsigned dimension )\n";
389
- #endif
390
- return Skeleton_simplex_range(this, dimension);
391
- }
392
-
393
- friend class is_before_in_filtration<T>;
394
-
395
- protected:
396
- std::vector<std::size_t> key_associated_to_simplex;
397
- std::vector<std::size_t> sorted_cells;
398
- }; // Bitmap_cubical_complex
399
-
400
- template <typename T>
401
- void Bitmap_cubical_complex<T>::initialize_filtration() {
402
- #ifdef DEBUG_TRACES
403
- std::clog << "void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
404
- #endif
405
- this->sorted_cells.resize(this->data.size());
406
- std::iota(std::begin(sorted_cells), std::end(sorted_cells), 0);
407
- #ifdef GUDHI_USE_TBB
408
- tbb::parallel_sort(sorted_cells.begin(), sorted_cells.end(),
409
- is_before_in_filtration<T>(this));
410
- #else
411
- std::sort(sorted_cells.begin(), sorted_cells.end(), is_before_in_filtration<T>(this));
412
- #endif
413
- }
414
-
415
- template <typename T>
416
- class is_before_in_filtration {
417
- public:
418
- explicit is_before_in_filtration(Bitmap_cubical_complex<T>* CC) : CC_(CC) {}
419
-
420
- bool operator()(const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
421
- const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2) const {
422
- // Not using st_->filtration(sh1) because it uselessly tests for null_simplex.
423
- typedef typename T::filtration_type Filtration_value;
424
- Filtration_value fil1 = CC_->data[sh1];
425
- Filtration_value fil2 = CC_->data[sh2];
426
- if (fil1 != fil2) {
427
- return fil1 < fil2;
428
- }
429
- // in this case they are on the same filtration level, so the dimension decide.
430
- std::size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
431
- std::size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
432
- if (dim1 != dim2) {
433
- return dim1 < dim2;
434
- }
435
- // in this case both filtration and dimensions of the considered cubes are the same. To have stable sort, we simply
436
- // compare their positions in the bitmap:
437
- return sh1 < sh2;
438
- }
439
-
440
- protected:
441
- Bitmap_cubical_complex<T>* CC_;
442
- };
443
-
444
- } // namespace cubical_complex
445
-
446
- namespace Cubical_complex = cubical_complex;
447
-
448
- } // namespace Gudhi
449
-
450
- #endif // BITMAP_CUBICAL_COMPLEX_H_
1
+ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2
+ * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3
+ * Author(s): Pawel Dlotko
4
+ *
5
+ * Copyright (C) 2015 Inria
6
+ *
7
+ * Modification(s):
8
+ * - YYYY/MM Author: Description of the modification
9
+ */
10
+
11
+ #ifndef BITMAP_CUBICAL_COMPLEX_H_
12
+ #define BITMAP_CUBICAL_COMPLEX_H_
13
+
14
+ #include <gudhi/Debug_utils.h>
15
+ #include <gudhi/Bitmap_cubical_complex_base.h>
16
+ #include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
17
+
18
+ #ifdef GUDHI_USE_TBB
19
+ #include <tbb/parallel_sort.h>
20
+ #endif
21
+
22
+ #include <limits>
23
+ #include <utility> // for pair<>
24
+ #include <algorithm> // for sort
25
+ #include <vector>
26
+ #include <numeric> // for iota
27
+ #include <cstddef>
28
+ #include <stdexcept>
29
+
30
+ namespace Gudhi {
31
+
32
+ namespace cubical_complex {
33
+
34
+ template <typename T>
35
+ class is_before_in_filtration;
36
+
37
+ /**
38
+ * @brief Cubical complex represented as a bitmap.
39
+ * @ingroup cubical_complex
40
+ * @details This is a Bitmap_cubical_complex class. It joints a functionalities of Bitmap_cubical_complex_base and
41
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base classes into
42
+ * Gudhi persistent homology engine. It is a template class that inherit from its template parameter. The template
43
+ * parameter is supposed to be either Bitmap_cubical_complex_base or
44
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
45
+ *
46
+ * This class implements the concept `FilteredComplex`.
47
+ **/
48
+ template <typename T>
49
+ class Bitmap_cubical_complex : public T {
50
+ public:
51
+ //*********************************************//
52
+ // Typedefs and typenames
53
+ //*********************************************//
54
+ typedef std::size_t Simplex_key;
55
+ typedef typename T::filtration_type Filtration_value;
56
+ typedef Simplex_key Simplex_handle;
57
+
58
+ //*********************************************//
59
+ // Constructors
60
+ //*********************************************//
61
+ // Over here we need to define various input types. I am proposing the following ones:
62
+ // Perseus style
63
+ // TODO(PD) H5 files?
64
+ // TODO(PD) binary files with little endians / big endians ?
65
+ // TODO(PD) constructor from a vector of elements of a type T. ?
66
+
67
+ /**
68
+ * @param[in] perseus_style_file The name of a \ref FileFormatsPerseus "Perseus-style file".
69
+ **/
70
+ explicit Bitmap_cubical_complex(const char* perseus_style_file)
71
+ : T(perseus_style_file), key_associated_to_simplex(num_simplices()) {
72
+ #ifdef DEBUG_TRACES
73
+ std::clog << "Bitmap_cubical_complex( const char* perseus_style_file )\n";
74
+ #endif
75
+ }
76
+
77
+ /**
78
+ * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
79
+ * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
80
+ * and of the vertices otherwise.
81
+ * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
82
+ **/
83
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
84
+ const std::vector<Filtration_value>& cells,
85
+ bool input_top_cells = true)
86
+ : T(dimensions, cells, input_top_cells), key_associated_to_simplex(num_simplices()) {
87
+ }
88
+
89
+ /**
90
+ * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
91
+ * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
92
+ * and of the vertices otherwise.
93
+ * @param[in] directions_in_which_periodic_b_cond_are_to_be_imposed Specifies for each dimension (as per `dimensions`) if the space is periodic (`true`) or not (`false`), or in other words if the boundaries should be identified.
94
+ * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
95
+ **/
96
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
97
+ const std::vector<Filtration_value>& cells,
98
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed,
99
+ bool input_top_cells = true)
100
+ : T(dimensions, cells, directions_in_which_periodic_b_cond_are_to_be_imposed, input_top_cells),
101
+ key_associated_to_simplex(num_simplices()) {
102
+ }
103
+
104
+ /**
105
+ * Destructor.
106
+ **/
107
+ virtual ~Bitmap_cubical_complex() {}
108
+
109
+ //*********************************************//
110
+ // Other 'easy' functions
111
+ //*********************************************//
112
+
113
+ /**
114
+ * Returns number of all cubes in the complex.
115
+ **/
116
+ std::size_t num_simplices() const { return this->data.size(); }
117
+
118
+ /**
119
+ * Returns a Simplex_handle to a cube that do not exist in this complex.
120
+ **/
121
+ static Simplex_handle null_simplex() {
122
+ #ifdef DEBUG_TRACES
123
+ std::clog << "Simplex_handle null_simplex()\n";
124
+ #endif
125
+ return std::numeric_limits<Simplex_handle>::max();
126
+ }
127
+
128
+ /**
129
+ * Returns dimension of the complex.
130
+ **/
131
+ inline std::size_t dimension() const { return this->sizes.size(); }
132
+
133
+ /**
134
+ * Return dimension of a cell pointed by the Simplex_handle.
135
+ **/
136
+ inline unsigned dimension(Simplex_handle sh) const {
137
+ #ifdef DEBUG_TRACES
138
+ std::clog << "unsigned dimension(const Simplex_handle& sh)\n";
139
+ #endif
140
+ GUDHI_CHECK(sh != null_simplex(), std::logic_error("Only real cells have a dimension"));
141
+ return this->get_dimension_of_a_cell(sh);
142
+ }
143
+
144
+ /**
145
+ * Return the filtration of a cell pointed by the Simplex_handle, or +inf for `null_simplex()`.
146
+ **/
147
+ Filtration_value filtration(Simplex_handle sh) {
148
+ #ifdef DEBUG_TRACES
149
+ std::clog << "Filtration_value filtration(const Simplex_handle& sh)\n";
150
+ #endif
151
+ // Returns the filtration value of a simplex.
152
+ if (sh != null_simplex()) return this->data[sh];
153
+ return std::numeric_limits<Filtration_value>::infinity();
154
+ }
155
+
156
+ /**
157
+ * Return a key which is not a key of any cube in the considered data structure.
158
+ **/
159
+ static Simplex_key null_key() {
160
+ #ifdef DEBUG_TRACES
161
+ std::clog << "Simplex_key null_key()\n";
162
+ #endif
163
+ return std::numeric_limits<Simplex_handle>::max();
164
+ }
165
+
166
+ /**
167
+ * Return the key of a cube pointed by the Simplex_handle.
168
+ **/
169
+ Simplex_key key(Simplex_handle sh) const {
170
+ #ifdef DEBUG_TRACES
171
+ std::clog << "Simplex_key key(const Simplex_handle& sh)\n";
172
+ #endif
173
+ GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("key(null_simplex()) is not supported"));
174
+ return this->key_associated_to_simplex[sh];
175
+ }
176
+
177
+ /**
178
+ * Return the k-th Simplex_handle in filtration order.
179
+ *
180
+ * Only available after initialize_filtration() or filtration_simplex_range() has been called.
181
+ **/
182
+ Simplex_handle simplex(Simplex_key k) {
183
+ #ifdef DEBUG_TRACES
184
+ std::clog << "Simplex_handle simplex(Simplex_key key)\n";
185
+ #endif
186
+ GUDHI_CHECK (k != null_key(), std::invalid_argument("simplex(null_key()) is not supported"));
187
+ GUDHI_CHECK (!sorted_cells.empty(), std::logic_error("initialize_filtration() or filtration_simplex_range() must be called before simplex()"));
188
+ return this->sorted_cells[k];
189
+ }
190
+
191
+ /**
192
+ * Assign key to a cube pointed by the Simplex_handle
193
+ **/
194
+ void assign_key(Simplex_handle sh, Simplex_key key) {
195
+ #ifdef DEBUG_TRACES
196
+ std::clog << "void assign_key(Simplex_handle& sh, Simplex_key key)\n";
197
+ #endif
198
+ GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("assign_key(null_simplex()) is not supported"));
199
+ this->key_associated_to_simplex[sh] = key;
200
+ }
201
+
202
+ /**
203
+ * Precompute a sorted list of the cells for filtration_simplex_range() and simplex().
204
+ * It is automatically called by filtration_simplex_range() if needed, but NOT by simplex().
205
+ **/
206
+ void initialize_filtration();
207
+
208
+ //*********************************************//
209
+ // Iterators
210
+ //*********************************************//
211
+
212
+ /**
213
+ * Boundary_simplex_range class provides ranges for boundary iterators.
214
+ **/
215
+ typedef typename std::vector<Simplex_handle>::iterator Boundary_simplex_iterator;
216
+ typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
217
+
218
+ /**
219
+ * Range of all the cells in filtration order.
220
+ * Secondary criteria for filtration are:
221
+ * (1) Dimension of a cube (lower dimensional comes first).
222
+ * (2) Position in the data structure (the ones that are earliest in the data structure come first).
223
+ **/
224
+ typedef std::vector<Simplex_handle> Filtration_simplex_range;
225
+
226
+ //*********************************************//
227
+ // Methods to access iterators from the container:
228
+
229
+ /**
230
+ * boundary_simplex_range creates an object of a Boundary_simplex_range class
231
+ * that provides ranges for the Boundary_simplex_iterator.
232
+ **/
233
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) { return this->get_boundary_of_a_cell(sh); }
234
+
235
+ /**
236
+ * Range of all the cells in filtration order.
237
+ * Secondary criteria for filtration are:
238
+ * (1) Dimension of a cube (lower dimensional comes first).
239
+ * (2) Position in the data structure (the ones that are earliest in the data structure come first).
240
+ *
241
+ * This implicitly calls initialize_filtration() if it has never been called.
242
+ **/
243
+ Filtration_simplex_range const& filtration_simplex_range() {
244
+ #ifdef DEBUG_TRACES
245
+ std::clog << "Filtration_simplex_range filtration_simplex_range()\n";
246
+ #endif
247
+ if (sorted_cells.empty()) initialize_filtration();
248
+ return sorted_cells;
249
+ }
250
+ //*********************************************//
251
+
252
+ //*********************************************//
253
+ // Elements which are in Gudhi now, but I (and in all the cases I asked also Marc) do not understand why they are
254
+ // there.
255
+ // TODO(PD) the file IndexingTag.h in the Gudhi library contains an empty structure, so
256
+ // I understand that this is something that was planned (for simplicial maps?)
257
+ // but was never finished. The only idea I have here is to use the same empty structure from
258
+ // IndexingTag.h file, but only if the compiler needs it. If the compiler
259
+ // do not need it, then I would rather not add here elements which I do not understand.
260
+ // typedef Indexing_tag
261
+
262
+ /**
263
+ * Returns the extremities of edge `e`
264
+ **/
265
+ std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle e) {
266
+ std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(e);
267
+ #ifdef DEBUG_TRACES
268
+ std::clog << "std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle e )\n";
269
+ std::clog << "bdry.size() : " << bdry.size() << "\n";
270
+ #endif
271
+ if (bdry.size() != 2)
272
+ throw(
273
+ "Error in endpoints in Bitmap_cubical_complex class. The cell is not an edge.");
274
+ return std::make_pair(bdry[0], bdry[1]);
275
+ }
276
+
277
+ class Skeleton_simplex_range;
278
+
279
+ class Skeleton_simplex_iterator {
280
+ // Iterator over all simplices of the complex in the order of the indexing scheme.
281
+ public:
282
+ typedef std::input_iterator_tag iterator_category;
283
+ typedef Simplex_handle value_type;
284
+ typedef std::ptrdiff_t difference_type;
285
+ typedef value_type* pointer;
286
+ typedef value_type reference;
287
+
288
+ Skeleton_simplex_iterator(Bitmap_cubical_complex* b, std::size_t d) : b(b), dimension(d) {
289
+ #ifdef DEBUG_TRACES
290
+ std::clog << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , std::size_t d )\n";
291
+ #endif
292
+ // find the position of the first simplex of a dimension d
293
+ this->position = 0;
294
+ while ((this->position != b->data.size()) &&
295
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
296
+ ++this->position;
297
+ }
298
+ }
299
+
300
+ Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) {}
301
+
302
+ Skeleton_simplex_iterator operator++() {
303
+ #ifdef DEBUG_TRACES
304
+ std::clog << "Skeleton_simplex_iterator operator++()\n";
305
+ #endif
306
+ // increment the position as long as you did not get to the next element of the dimension dimension.
307
+ ++this->position;
308
+ while ((this->position != this->b->data.size()) &&
309
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
310
+ ++this->position;
311
+ }
312
+ return (*this);
313
+ }
314
+
315
+ Skeleton_simplex_iterator operator++(int) {
316
+ Skeleton_simplex_iterator result = *this;
317
+ ++(*this);
318
+ return result;
319
+ }
320
+
321
+ bool operator==(const Skeleton_simplex_iterator& rhs) const {
322
+ #ifdef DEBUG_TRACES
323
+ std::clog << "bool operator ==\n";
324
+ #endif
325
+ return (this->position == rhs.position);
326
+ }
327
+
328
+ bool operator!=(const Skeleton_simplex_iterator& rhs) const {
329
+ #ifdef DEBUG_TRACES
330
+ std::clog << "bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
331
+ #endif
332
+ return !(*this == rhs);
333
+ }
334
+
335
+ Simplex_handle operator*() {
336
+ #ifdef DEBUG_TRACES
337
+ std::clog << "Simplex_handle operator*() \n";
338
+ #endif
339
+ return this->position;
340
+ }
341
+
342
+ friend class Skeleton_simplex_range;
343
+
344
+ private:
345
+ Bitmap_cubical_complex<T>* b;
346
+ std::size_t position;
347
+ unsigned dimension;
348
+ };
349
+
350
+ /**
351
+ * @brief A range containing all the cells of dimension at most k.
352
+ **/
353
+ class Skeleton_simplex_range {
354
+ // Range over the simplices of the complex in the order of the filtration.
355
+ // .begin() and .end() return type Skeleton_simplex_iterator.
356
+ public:
357
+ typedef Skeleton_simplex_iterator const_iterator;
358
+ typedef Skeleton_simplex_iterator iterator;
359
+
360
+ Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) {}
361
+
362
+ Skeleton_simplex_iterator begin() {
363
+ #ifdef DEBUG_TRACES
364
+ std::clog << "Skeleton_simplex_iterator begin()\n";
365
+ #endif
366
+ return Skeleton_simplex_iterator(this->b, this->dimension);
367
+ }
368
+
369
+ Skeleton_simplex_iterator end() {
370
+ #ifdef DEBUG_TRACES
371
+ std::clog << "Skeleton_simplex_iterator end()\n";
372
+ #endif
373
+ Skeleton_simplex_iterator it(this->b, this->dimension);
374
+ it.position = this->b->data.size();
375
+ return it;
376
+ }
377
+
378
+ private:
379
+ Bitmap_cubical_complex<T>* b;
380
+ unsigned dimension;
381
+ };
382
+
383
+ /**
384
+ * Returns a range containing all the cells of dimension at most `dimension`.
385
+ **/
386
+ Skeleton_simplex_range skeleton_simplex_range(unsigned dimension) {
387
+ #ifdef DEBUG_TRACES
388
+ std::clog << "Skeleton_simplex_range skeleton_simplex_range( unsigned dimension )\n";
389
+ #endif
390
+ return Skeleton_simplex_range(this, dimension);
391
+ }
392
+
393
+ friend class is_before_in_filtration<T>;
394
+
395
+ protected:
396
+ std::vector<std::size_t> key_associated_to_simplex;
397
+ std::vector<std::size_t> sorted_cells;
398
+ }; // Bitmap_cubical_complex
399
+
400
+ template <typename T>
401
+ void Bitmap_cubical_complex<T>::initialize_filtration() {
402
+ #ifdef DEBUG_TRACES
403
+ std::clog << "void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
404
+ #endif
405
+ this->sorted_cells.resize(this->data.size());
406
+ std::iota(std::begin(sorted_cells), std::end(sorted_cells), 0);
407
+ #ifdef GUDHI_USE_TBB
408
+ tbb::parallel_sort(sorted_cells.begin(), sorted_cells.end(),
409
+ is_before_in_filtration<T>(this));
410
+ #else
411
+ std::sort(sorted_cells.begin(), sorted_cells.end(), is_before_in_filtration<T>(this));
412
+ #endif
413
+ }
414
+
415
+ template <typename T>
416
+ class is_before_in_filtration {
417
+ public:
418
+ explicit is_before_in_filtration(Bitmap_cubical_complex<T>* CC) : CC_(CC) {}
419
+
420
+ bool operator()(const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
421
+ const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2) const {
422
+ // Not using st_->filtration(sh1) because it uselessly tests for null_simplex.
423
+ typedef typename T::filtration_type Filtration_value;
424
+ Filtration_value fil1 = CC_->data[sh1];
425
+ Filtration_value fil2 = CC_->data[sh2];
426
+ if (fil1 != fil2) {
427
+ return fil1 < fil2;
428
+ }
429
+ // in this case they are on the same filtration level, so the dimension decide.
430
+ std::size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
431
+ std::size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
432
+ if (dim1 != dim2) {
433
+ return dim1 < dim2;
434
+ }
435
+ // in this case both filtration and dimensions of the considered cubes are the same. To have stable sort, we simply
436
+ // compare their positions in the bitmap:
437
+ return sh1 < sh2;
438
+ }
439
+
440
+ protected:
441
+ Bitmap_cubical_complex<T>* CC_;
442
+ };
443
+
444
+ } // namespace cubical_complex
445
+
446
+ namespace Cubical_complex = cubical_complex;
447
+
448
+ } // namespace Gudhi
449
+
450
+ #endif // BITMAP_CUBICAL_COMPLEX_H_