multipers 2.3.3b6__cp311-cp311-manylinux_2_39_x86_64.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.
- multipers/__init__.py +33 -0
- multipers/_signed_measure_meta.py +453 -0
- multipers/_slicer_meta.py +211 -0
- multipers/array_api/__init__.py +45 -0
- multipers/array_api/numpy.py +41 -0
- multipers/array_api/torch.py +58 -0
- multipers/data/MOL2.py +458 -0
- multipers/data/UCR.py +18 -0
- multipers/data/__init__.py +1 -0
- multipers/data/graphs.py +466 -0
- multipers/data/immuno_regions.py +27 -0
- multipers/data/minimal_presentation_to_st_bf.py +0 -0
- multipers/data/pytorch2simplextree.py +91 -0
- multipers/data/shape3d.py +101 -0
- multipers/data/synthetic.py +113 -0
- multipers/distances.py +202 -0
- multipers/filtration_conversions.pxd +229 -0
- multipers/filtration_conversions.pxd.tp +84 -0
- multipers/filtrations/__init__.py +18 -0
- multipers/filtrations/density.py +574 -0
- multipers/filtrations/filtrations.py +361 -0
- multipers/filtrations.pxd +224 -0
- multipers/function_rips.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/function_rips.pyx +105 -0
- multipers/grids.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/grids.pyx +433 -0
- multipers/gudhi/Persistence_slices_interface.h +132 -0
- multipers/gudhi/Simplex_tree_interface.h +239 -0
- multipers/gudhi/Simplex_tree_multi_interface.h +551 -0
- multipers/gudhi/cubical_to_boundary.h +59 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
- multipers/gudhi/gudhi/Debug_utils.h +45 -0
- multipers/gudhi/gudhi/Fields/Multi_field.h +484 -0
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -0
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -0
- multipers/gudhi/gudhi/Fields/Z2_field.h +355 -0
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -0
- multipers/gudhi/gudhi/Fields/Zp_field.h +420 -0
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -0
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -0
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
- multipers/gudhi/gudhi/Matrix.h +2107 -0
- multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -0
- multipers/gudhi/gudhi/Multi_persistence/Box.h +174 -0
- multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -0
- multipers/gudhi/gudhi/Off_reader.h +173 -0
- multipers/gudhi/gudhi/One_critical_filtration.h +1441 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -0
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -0
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -0
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -0
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -0
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -0
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -0
- multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -0
- multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
- multipers/gudhi/gudhi/Persistent_cohomology.h +745 -0
- multipers/gudhi/gudhi/Points_off_io.h +171 -0
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
- multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
- multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
- multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -0
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -0
- multipers/gudhi/gudhi/Simplex_tree.h +2794 -0
- multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -0
- multipers/gudhi/gudhi/distance_functions.h +62 -0
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
- multipers/gudhi/gudhi/persistence_interval.h +253 -0
- multipers/gudhi/gudhi/persistence_matrix_options.h +170 -0
- multipers/gudhi/gudhi/reader_utils.h +367 -0
- multipers/gudhi/mma_interface_coh.h +256 -0
- multipers/gudhi/mma_interface_h0.h +223 -0
- multipers/gudhi/mma_interface_matrix.h +293 -0
- multipers/gudhi/naive_merge_tree.h +536 -0
- multipers/gudhi/scc_io.h +310 -0
- multipers/gudhi/truc.h +1403 -0
- multipers/io.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/io.pyx +644 -0
- multipers/ml/__init__.py +0 -0
- multipers/ml/accuracies.py +90 -0
- multipers/ml/invariants_with_persistable.py +79 -0
- multipers/ml/kernels.py +176 -0
- multipers/ml/mma.py +713 -0
- multipers/ml/one.py +472 -0
- multipers/ml/point_clouds.py +352 -0
- multipers/ml/signed_measures.py +1589 -0
- multipers/ml/sliced_wasserstein.py +461 -0
- multipers/ml/tools.py +113 -0
- multipers/mma_structures.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/mma_structures.pxd +128 -0
- multipers/mma_structures.pyx +2786 -0
- multipers/mma_structures.pyx.tp +1094 -0
- multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -0
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -0
- multipers/multi_parameter_rank_invariant/function_rips.h +322 -0
- multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -0
- multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -0
- multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -0
- multipers/multiparameter_edge_collapse.py +41 -0
- multipers/multiparameter_module_approximation/approximation.h +2330 -0
- multipers/multiparameter_module_approximation/combinatory.h +129 -0
- multipers/multiparameter_module_approximation/debug.h +107 -0
- multipers/multiparameter_module_approximation/euler_curves.h +0 -0
- multipers/multiparameter_module_approximation/format_python-cpp.h +286 -0
- multipers/multiparameter_module_approximation/heap_column.h +238 -0
- multipers/multiparameter_module_approximation/images.h +79 -0
- multipers/multiparameter_module_approximation/list_column.h +174 -0
- multipers/multiparameter_module_approximation/list_column_2.h +232 -0
- multipers/multiparameter_module_approximation/ru_matrix.h +347 -0
- multipers/multiparameter_module_approximation/set_column.h +135 -0
- multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -0
- multipers/multiparameter_module_approximation/unordered_set_column.h +166 -0
- multipers/multiparameter_module_approximation/utilities.h +403 -0
- multipers/multiparameter_module_approximation/vector_column.h +223 -0
- multipers/multiparameter_module_approximation/vector_matrix.h +331 -0
- multipers/multiparameter_module_approximation/vineyards.h +464 -0
- multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -0
- multipers/multiparameter_module_approximation.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/multiparameter_module_approximation.pyx +235 -0
- multipers/pickle.py +90 -0
- multipers/plots.py +456 -0
- multipers/point_measure.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/point_measure.pyx +395 -0
- multipers/simplex_tree_multi.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/simplex_tree_multi.pxd +134 -0
- multipers/simplex_tree_multi.pyx +10840 -0
- multipers/simplex_tree_multi.pyx.tp +2009 -0
- multipers/slicer.cpython-311-x86_64-linux-gnu.so +0 -0
- multipers/slicer.pxd +3034 -0
- multipers/slicer.pxd.tp +234 -0
- multipers/slicer.pyx +20481 -0
- multipers/slicer.pyx.tp +1088 -0
- multipers/tensor/tensor.h +672 -0
- multipers/tensor.pxd +13 -0
- multipers/test.pyx +44 -0
- multipers/tests/__init__.py +62 -0
- multipers/torch/__init__.py +1 -0
- multipers/torch/diff_grids.py +240 -0
- multipers/torch/rips_density.py +310 -0
- multipers-2.3.3b6.dist-info/METADATA +128 -0
- multipers-2.3.3b6.dist-info/RECORD +182 -0
- multipers-2.3.3b6.dist-info/WHEEL +5 -0
- multipers-2.3.3b6.dist-info/licenses/LICENSE +21 -0
- multipers-2.3.3b6.dist-info/top_level.txt +1 -0
- multipers.libs/libtbb-ca48af5c.so.12.16 +0 -0
|
@@ -0,0 +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_
|