multipers 2.2.3__cp310-cp310-win_amd64.whl → 2.3.1__cp310-cp310-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.
- multipers/__init__.py +33 -31
- multipers/_signed_measure_meta.py +430 -430
- multipers/_slicer_meta.py +211 -212
- multipers/data/MOL2.py +458 -458
- multipers/data/UCR.py +18 -18
- multipers/data/graphs.py +466 -466
- multipers/data/immuno_regions.py +27 -27
- multipers/data/pytorch2simplextree.py +90 -90
- multipers/data/shape3d.py +101 -101
- multipers/data/synthetic.py +113 -111
- multipers/distances.py +198 -198
- multipers/filtration_conversions.pxd.tp +84 -84
- multipers/filtrations/__init__.py +18 -0
- multipers/{ml/convolutions.py → filtrations/density.py} +563 -520
- multipers/filtrations/filtrations.py +289 -0
- multipers/filtrations.pxd +224 -224
- multipers/function_rips.cp310-win_amd64.pyd +0 -0
- multipers/function_rips.pyx +105 -105
- multipers/grids.cp310-win_amd64.pyd +0 -0
- multipers/grids.pyx +350 -350
- multipers/gudhi/Persistence_slices_interface.h +132 -132
- multipers/gudhi/Simplex_tree_interface.h +239 -245
- multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
- multipers/gudhi/cubical_to_boundary.h +59 -59
- multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
- multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
- multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
- multipers/gudhi/gudhi/Debug_utils.h +45 -45
- multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
- multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
- multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
- multipers/gudhi/gudhi/Matrix.h +2107 -2107
- multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
- multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
- multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
- multipers/gudhi/gudhi/Off_reader.h +173 -173
- multipers/gudhi/gudhi/One_critical_filtration.h +1433 -1431
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
- multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
- multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
- multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
- multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
- multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
- multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
- multipers/gudhi/gudhi/Points_off_io.h +171 -171
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
- multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
- multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
- multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
- multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
- multipers/gudhi/gudhi/distance_functions.h +62 -62
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
- multipers/gudhi/gudhi/persistence_interval.h +253 -253
- multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
- multipers/gudhi/gudhi/reader_utils.h +367 -367
- multipers/gudhi/mma_interface_coh.h +256 -255
- multipers/gudhi/mma_interface_h0.h +223 -231
- multipers/gudhi/mma_interface_matrix.h +291 -282
- multipers/gudhi/naive_merge_tree.h +536 -575
- multipers/gudhi/scc_io.h +310 -289
- multipers/gudhi/truc.h +957 -888
- multipers/io.cp310-win_amd64.pyd +0 -0
- multipers/io.pyx +714 -711
- multipers/ml/accuracies.py +90 -90
- multipers/ml/invariants_with_persistable.py +79 -79
- multipers/ml/kernels.py +176 -176
- multipers/ml/mma.py +713 -714
- multipers/ml/one.py +472 -472
- multipers/ml/point_clouds.py +352 -346
- multipers/ml/signed_measures.py +1589 -1589
- multipers/ml/sliced_wasserstein.py +461 -461
- multipers/ml/tools.py +113 -113
- multipers/mma_structures.cp310-win_amd64.pyd +0 -0
- multipers/mma_structures.pxd +127 -127
- multipers/mma_structures.pyx +4 -8
- multipers/mma_structures.pyx.tp +1083 -1085
- multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -93
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -97
- multipers/multi_parameter_rank_invariant/function_rips.h +322 -322
- multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -769
- multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -148
- multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -369
- multipers/multiparameter_edge_collapse.py +41 -41
- multipers/multiparameter_module_approximation/approximation.h +2298 -2295
- multipers/multiparameter_module_approximation/combinatory.h +129 -129
- multipers/multiparameter_module_approximation/debug.h +107 -107
- multipers/multiparameter_module_approximation/format_python-cpp.h +286 -286
- multipers/multiparameter_module_approximation/heap_column.h +238 -238
- multipers/multiparameter_module_approximation/images.h +79 -79
- multipers/multiparameter_module_approximation/list_column.h +174 -174
- multipers/multiparameter_module_approximation/list_column_2.h +232 -232
- multipers/multiparameter_module_approximation/ru_matrix.h +347 -347
- multipers/multiparameter_module_approximation/set_column.h +135 -135
- multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -36
- multipers/multiparameter_module_approximation/unordered_set_column.h +166 -166
- multipers/multiparameter_module_approximation/utilities.h +403 -419
- multipers/multiparameter_module_approximation/vector_column.h +223 -223
- multipers/multiparameter_module_approximation/vector_matrix.h +331 -331
- multipers/multiparameter_module_approximation/vineyards.h +464 -464
- multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -649
- multipers/multiparameter_module_approximation.cp310-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.pyx +218 -217
- multipers/pickle.py +90 -53
- multipers/plots.py +342 -334
- multipers/point_measure.cp310-win_amd64.pyd +0 -0
- multipers/point_measure.pyx +322 -320
- multipers/simplex_tree_multi.cp310-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.pxd +133 -133
- multipers/simplex_tree_multi.pyx +115 -48
- multipers/simplex_tree_multi.pyx.tp +1947 -1935
- multipers/slicer.cp310-win_amd64.pyd +0 -0
- multipers/slicer.pxd +301 -120
- multipers/slicer.pxd.tp +218 -214
- multipers/slicer.pyx +1570 -507
- multipers/slicer.pyx.tp +931 -914
- multipers/tensor/tensor.h +672 -672
- multipers/tensor.pxd +13 -13
- multipers/test.pyx +44 -44
- multipers/tests/__init__.py +57 -57
- multipers/torch/diff_grids.py +217 -217
- multipers/torch/rips_density.py +310 -304
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/LICENSE +21 -21
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/METADATA +21 -11
- multipers-2.3.1.dist-info/RECORD +182 -0
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/WHEEL +1 -1
- multipers/tests/test_diff_helper.py +0 -73
- multipers/tests/test_hilbert_function.py +0 -82
- multipers/tests/test_mma.py +0 -83
- multipers/tests/test_point_clouds.py +0 -49
- multipers/tests/test_python-cpp_conversion.py +0 -82
- multipers/tests/test_signed_betti.py +0 -181
- multipers/tests/test_signed_measure.py +0 -89
- multipers/tests/test_simplextreemulti.py +0 -221
- multipers/tests/test_slicer.py +0 -221
- multipers-2.2.3.dist-info/RECORD +0 -189
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/top_level.txt +0 -0
|
@@ -1,277 +1,277 @@
|
|
|
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): Clément Maria
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2020 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - YYYY/MM Author: Description of the modification
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#ifndef SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
|
|
12
|
-
#define SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
|
|
13
|
-
|
|
14
|
-
#include <gudhi/Debug_utils.h>
|
|
15
|
-
#include <boost/iterator/iterator_facade.hpp>
|
|
16
|
-
#include <boost/version.hpp>
|
|
17
|
-
#include <boost/iterator/filter_iterator.hpp>
|
|
18
|
-
|
|
19
|
-
#include <vector>
|
|
20
|
-
#include <stdexcept>
|
|
21
|
-
#include <utility> // for std::move
|
|
22
|
-
#include <functional> // for std::greater
|
|
23
|
-
#include <algorithm> // for std::includes
|
|
24
|
-
|
|
25
|
-
namespace Gudhi {
|
|
26
|
-
|
|
27
|
-
/** \private
|
|
28
|
-
* \brief Iterator over all the roots of subtrees containing cofaces of all
|
|
29
|
-
* dimension of a given simplex.
|
|
30
|
-
*
|
|
31
|
-
* Specifically, consider a simplex \f$\sigma\f$ whose vertices have maximal label
|
|
32
|
-
* u. A maximal subtree of cofaces for \f$\sigma\f$ is a subtree of the simplex tree
|
|
33
|
-
* rooted at a Node of label u, for which the root represents itself a coface of
|
|
34
|
-
* \f$\sigma\f$.
|
|
35
|
-
*
|
|
36
|
-
* \details All Nodes of the simplex must store intrusive list hooks (option
|
|
37
|
-
* link_nodes_by_label == true) in order to connect all nodes with a fixed label u
|
|
38
|
-
* into a list.
|
|
39
|
-
*
|
|
40
|
-
* Forward iterator, value_type is SimplexTree::Simplex_handle.
|
|
41
|
-
*
|
|
42
|
-
* The implementation uses a filter iterator on all Nodes of label u, checking
|
|
43
|
-
* whether they represent a coface of \f$\sigma\f$ or not.
|
|
44
|
-
*/
|
|
45
|
-
template <class SimplexTree>
|
|
46
|
-
class Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator
|
|
47
|
-
: public boost::iterator_facade<Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree>,
|
|
48
|
-
typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
|
|
49
|
-
public:
|
|
50
|
-
using Simplex_handle = typename SimplexTree::Simplex_handle;
|
|
51
|
-
using Siblings = typename SimplexTree::Siblings;
|
|
52
|
-
using Vertex_handle = typename SimplexTree::Vertex_handle;
|
|
53
|
-
using Node = typename SimplexTree::Node;
|
|
54
|
-
using Static_vertex_vector = typename SimplexTree::Static_vertex_vector;
|
|
55
|
-
|
|
56
|
-
/** \brief Predicate to check whether an input SimplexTree::Node represents a
|
|
57
|
-
* coface of a simplex simp_, stored as a std::vector of
|
|
58
|
-
* SimplexTree::Vertex_handle sorted in decreasing Vertex_handle order.
|
|
59
|
-
*
|
|
60
|
-
* \details Given a SimplexHandle in a simplex tree cpx_, traverses the tree
|
|
61
|
-
* upwards
|
|
62
|
-
* to find the sequence of Vertex_handle of simp_ as a subsequence of labels
|
|
63
|
-
* encountered.
|
|
64
|
-
* Does not test sh itself.
|
|
65
|
-
* Used for filter_iterator in the optimized algorithm for
|
|
66
|
-
* star_simplex_range.
|
|
67
|
-
*/
|
|
68
|
-
class is_coface {
|
|
69
|
-
public:
|
|
70
|
-
is_coface() : cpx_(nullptr) {}
|
|
71
|
-
is_coface(SimplexTree* cpx, Static_vertex_vector&& simp) : cpx_(cpx), simp_(simp) {}
|
|
72
|
-
|
|
73
|
-
// Return true iff traversing the Node upwards to the root reads a
|
|
74
|
-
// coface of simp_
|
|
75
|
-
bool operator()(typename SimplexTree::Hooks_simplex_base& curr_hooks) {
|
|
76
|
-
Node& curr_node = static_cast<Node&>(curr_hooks);
|
|
77
|
-
Simplex_handle sh = cpx_->simplex_handle_from_node(curr_node);
|
|
78
|
-
// first Node must always have label simp_.begin(); we assume it is true
|
|
79
|
-
auto&& rng = cpx_->simplex_vertex_range(sh);
|
|
80
|
-
auto rng_it = rng.begin();
|
|
81
|
-
GUDHI_CHECK(*rng_it == simp_.front(), std::invalid_argument("first Node must always have label simp_.begin()"));
|
|
82
|
-
auto simp_it = simp_.begin();
|
|
83
|
-
// is simp_ a face of the simplex defined by sh ?
|
|
84
|
-
return std::includes(++rng_it, rng.end(), ++simp_it, simp_.end(), std::greater<Vertex_handle>());
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private:
|
|
88
|
-
SimplexTree* cpx_;
|
|
89
|
-
Static_vertex_vector simp_; // vertices of simplex, in reverse order
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
typedef boost::filter_iterator<is_coface, typename SimplexTree::List_max_vertex::iterator>
|
|
93
|
-
Filtered_cofaces_simplex_iterator;
|
|
94
|
-
// any end() iterator
|
|
95
|
-
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator() : predicate_(), st_(nullptr) {}
|
|
96
|
-
|
|
97
|
-
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator(SimplexTree* cpx,
|
|
98
|
-
Static_vertex_vector&& simp)
|
|
99
|
-
: predicate_(cpx, std::move(simp)), st_(cpx) {
|
|
100
|
-
GUDHI_CHECK(!simp.empty(), std::invalid_argument("cannot call for cofaces of an empty simplex"));
|
|
101
|
-
auto list_ptr = st_->nodes_by_label(simp.front());
|
|
102
|
-
GUDHI_CHECK(list_ptr != nullptr, std::runtime_error("invalid call to cofaces forest"));
|
|
103
|
-
|
|
104
|
-
it_ = boost::make_filter_iterator(predicate_, list_ptr->begin(), list_ptr->end());
|
|
105
|
-
end_ = boost::make_filter_iterator(predicate_, list_ptr->end(), list_ptr->end());
|
|
106
|
-
Node& curr_node = static_cast<Node&>(*it_);
|
|
107
|
-
sh_ = st_->simplex_handle_from_node(curr_node);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
private:
|
|
111
|
-
friend class boost::iterator_core_access;
|
|
112
|
-
|
|
113
|
-
// valid when iterating along the SAME list of max vertex.
|
|
114
|
-
bool equal(Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator const& other) const {
|
|
115
|
-
if (other.st_ == nullptr) {
|
|
116
|
-
return (st_ == nullptr);
|
|
117
|
-
}
|
|
118
|
-
if (st_ == nullptr) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
return (it_ == other.it_);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
Simplex_handle const& dereference() const { return sh_; }
|
|
125
|
-
|
|
126
|
-
void increment() {
|
|
127
|
-
if (++it_ == end_) {
|
|
128
|
-
st_ = nullptr;
|
|
129
|
-
} //== end
|
|
130
|
-
else { // update sh_
|
|
131
|
-
Node& curr_node = static_cast<Node&>(*it_);
|
|
132
|
-
sh_ = st_->simplex_handle_from_node(curr_node);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// given a Node of label max_v, returns true if the associated simplex is a coface of the simplex {..., max_v}. The
|
|
137
|
-
// predicate stores the vertices of the simplex whose star we compute.
|
|
138
|
-
is_coface predicate_;
|
|
139
|
-
SimplexTree* st_;
|
|
140
|
-
// filtered iterators over Nodes, filtered with predicate_
|
|
141
|
-
Filtered_cofaces_simplex_iterator it_;
|
|
142
|
-
Filtered_cofaces_simplex_iterator end_;
|
|
143
|
-
// current Simplex_handle corresponding to Node pointed at by it_
|
|
144
|
-
Simplex_handle sh_;
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
/** \brief Iterator over the simplices of the star of a simplex.
|
|
148
|
-
*
|
|
149
|
-
* \details All Nodes of the simplex must store intrusive list hooks (option
|
|
150
|
-
* link_nodes_by_label == true) in order to connect all nodes with a fixed label u
|
|
151
|
-
* into a list.
|
|
152
|
-
*
|
|
153
|
-
* Forward iterator, value_type is SimplexTree::Simplex_handle.
|
|
154
|
-
*
|
|
155
|
-
* The implementation uses a
|
|
156
|
-
* Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator to iterate through all
|
|
157
|
-
* roots of cofaces Nodes, and traverses each such subtree of the simplex tree.
|
|
158
|
-
*/
|
|
159
|
-
template <class SimplexTree>
|
|
160
|
-
class Simplex_tree_optimized_star_simplex_iterator
|
|
161
|
-
: public boost::iterator_facade<Simplex_tree_optimized_star_simplex_iterator<SimplexTree>,
|
|
162
|
-
typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
|
|
163
|
-
public:
|
|
164
|
-
using Simplex_handle = typename SimplexTree::Simplex_handle;
|
|
165
|
-
using Siblings = typename SimplexTree::Siblings;
|
|
166
|
-
using Vertex_handle = typename SimplexTree::Vertex_handle;
|
|
167
|
-
using Node = typename SimplexTree::Node;
|
|
168
|
-
using Static_vertex_vector = typename SimplexTree::Static_vertex_vector;
|
|
169
|
-
|
|
170
|
-
// any end() iterator
|
|
171
|
-
Simplex_tree_optimized_star_simplex_iterator() : st_(nullptr) {}
|
|
172
|
-
|
|
173
|
-
Simplex_tree_optimized_star_simplex_iterator(SimplexTree* cpx, Static_vertex_vector&& simp)
|
|
174
|
-
: st_(cpx), it_(cpx, std::move(simp)), end_(), sh_(*it_), sib_(st_->self_siblings(sh_)), children_stack_() {
|
|
175
|
-
if (it_ == end_) {
|
|
176
|
-
st_ = nullptr;
|
|
177
|
-
return;
|
|
178
|
-
} // no coface subtree => end()
|
|
179
|
-
is_root_ = true;
|
|
180
|
-
sh_ = *it_; // sh_ is the root
|
|
181
|
-
sib_ = st_->self_siblings(sh_); // Siblings containing sh_
|
|
182
|
-
if (st_->has_children(sh_)) {
|
|
183
|
-
children_stack_.push_back(st_->children(sh_));
|
|
184
|
-
}
|
|
185
|
-
return; // first root of coface subtree
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
private:
|
|
189
|
-
friend class boost::iterator_core_access;
|
|
190
|
-
|
|
191
|
-
// valid when iterating along the SAME list of max vertex.
|
|
192
|
-
bool equal(Simplex_tree_optimized_star_simplex_iterator const& other) const {
|
|
193
|
-
if (other.st_ == nullptr) {
|
|
194
|
-
return (st_ == nullptr);
|
|
195
|
-
}
|
|
196
|
-
if (st_ == nullptr) {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
return (&(sh_->second) == &(other.sh_->second));
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
Simplex_handle const& dereference() const { return sh_; }
|
|
203
|
-
|
|
204
|
-
/* Go to the next valid Simplex_handle for a coface, using a breadth first
|
|
205
|
-
* search approach.
|
|
206
|
-
*
|
|
207
|
-
* Invariant:
|
|
208
|
-
*
|
|
209
|
-
* sh_ is a coface,
|
|
210
|
-
* sib_ the Siblings containing sh_,
|
|
211
|
-
* it_ the root of a coface subtree, such that dim_root_ <= exact_dim_cofaces_.
|
|
212
|
-
* bfs_queue contains Siblings inside the coface subtree.
|
|
213
|
-
*
|
|
214
|
-
* Additionally,
|
|
215
|
-
*
|
|
216
|
-
* - computing all cofaces: sh_ points to a coface of any dimension. bfs_queue
|
|
217
|
-
* contains a collection of Siblings* that must be considered (as well as there
|
|
218
|
-
* children). These are all sets of children of simplices in
|
|
219
|
-
* [ sib_->members().begin(), sh_ ]
|
|
220
|
-
*/
|
|
221
|
-
void increment_all_cofaces() {
|
|
222
|
-
++sh_; // next sibling
|
|
223
|
-
// if no more sibling or root of coface tree, go down or to next subtree
|
|
224
|
-
if (is_root_ || sh_ == sib_->members().end()) {
|
|
225
|
-
is_root_ = false;
|
|
226
|
-
if (!children_stack_.empty()) {
|
|
227
|
-
sib_ = children_stack_.back();
|
|
228
|
-
children_stack_.pop_back();
|
|
229
|
-
sh_ = sib_->members().begin(); // don't track dimensions
|
|
230
|
-
if (st_->has_children(sh_)) {
|
|
231
|
-
children_stack_.push_back(st_->children(sh_));
|
|
232
|
-
}
|
|
233
|
-
} else { // bfs_queue == empty, go to root of next coface subtree
|
|
234
|
-
if (++it_ == end_) {
|
|
235
|
-
st_ = nullptr;
|
|
236
|
-
return;
|
|
237
|
-
} // no more subtree => end()
|
|
238
|
-
is_root_ = true;
|
|
239
|
-
sh_ = *it_; // sh_ is the root
|
|
240
|
-
sib_ = st_->self_siblings(sh_); // Siblings containing sh_
|
|
241
|
-
if (st_->has_children(sh_)) {
|
|
242
|
-
children_stack_.push_back(st_->children(sh_));
|
|
243
|
-
}
|
|
244
|
-
return; // next root of coface
|
|
245
|
-
}
|
|
246
|
-
} else { // sh_ is valid, simply add its children to the queue
|
|
247
|
-
if (st_->has_children(sh_)) {
|
|
248
|
-
children_stack_.push_back(st_->children(sh_));
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// For cofaces, enumerating all the star and testing which simplices have the right dimension is suboptimal.
|
|
254
|
-
// This could be optimized later.
|
|
255
|
-
void increment() { increment_all_cofaces(); }
|
|
256
|
-
|
|
257
|
-
// Let s be the simplex in a complex C whose star is
|
|
258
|
-
// iterated through. Let max_v denote the maximal label of vertices in s.
|
|
259
|
-
SimplexTree* st_; // Simplex tree for complex C
|
|
260
|
-
// The cofaces of s form a subforest of the simplex tree. The roots of trees in this
|
|
261
|
-
// forest have label max_v.
|
|
262
|
-
//[it_,end_) == range of Simplex_handles of the roots of the cofaces trees (any dim)
|
|
263
|
-
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> it_;
|
|
264
|
-
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> end_;
|
|
265
|
-
// curr Simplex_handle, returned by operator*, pointing to a coface of s
|
|
266
|
-
Simplex_handle sh_;
|
|
267
|
-
// set of siblings containing sh_ in the Simplex_tree
|
|
268
|
-
Siblings* sib_; //
|
|
269
|
-
// Save children in a list to avoid calling sib_->members().find(.)
|
|
270
|
-
std::vector<Siblings*> children_stack_;
|
|
271
|
-
// true iff sh_ points to the root of a coface subtree
|
|
272
|
-
bool is_root_;
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
} // namespace Gudhi
|
|
276
|
-
|
|
277
|
-
#endif // SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_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): Clément Maria
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2020 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#ifndef SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
|
|
12
|
+
#define SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
|
|
13
|
+
|
|
14
|
+
#include <gudhi/Debug_utils.h>
|
|
15
|
+
#include <boost/iterator/iterator_facade.hpp>
|
|
16
|
+
#include <boost/version.hpp>
|
|
17
|
+
#include <boost/iterator/filter_iterator.hpp>
|
|
18
|
+
|
|
19
|
+
#include <vector>
|
|
20
|
+
#include <stdexcept>
|
|
21
|
+
#include <utility> // for std::move
|
|
22
|
+
#include <functional> // for std::greater
|
|
23
|
+
#include <algorithm> // for std::includes
|
|
24
|
+
|
|
25
|
+
namespace Gudhi {
|
|
26
|
+
|
|
27
|
+
/** \private
|
|
28
|
+
* \brief Iterator over all the roots of subtrees containing cofaces of all
|
|
29
|
+
* dimension of a given simplex.
|
|
30
|
+
*
|
|
31
|
+
* Specifically, consider a simplex \f$\sigma\f$ whose vertices have maximal label
|
|
32
|
+
* u. A maximal subtree of cofaces for \f$\sigma\f$ is a subtree of the simplex tree
|
|
33
|
+
* rooted at a Node of label u, for which the root represents itself a coface of
|
|
34
|
+
* \f$\sigma\f$.
|
|
35
|
+
*
|
|
36
|
+
* \details All Nodes of the simplex must store intrusive list hooks (option
|
|
37
|
+
* link_nodes_by_label == true) in order to connect all nodes with a fixed label u
|
|
38
|
+
* into a list.
|
|
39
|
+
*
|
|
40
|
+
* Forward iterator, value_type is SimplexTree::Simplex_handle.
|
|
41
|
+
*
|
|
42
|
+
* The implementation uses a filter iterator on all Nodes of label u, checking
|
|
43
|
+
* whether they represent a coface of \f$\sigma\f$ or not.
|
|
44
|
+
*/
|
|
45
|
+
template <class SimplexTree>
|
|
46
|
+
class Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator
|
|
47
|
+
: public boost::iterator_facade<Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree>,
|
|
48
|
+
typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
|
|
49
|
+
public:
|
|
50
|
+
using Simplex_handle = typename SimplexTree::Simplex_handle;
|
|
51
|
+
using Siblings = typename SimplexTree::Siblings;
|
|
52
|
+
using Vertex_handle = typename SimplexTree::Vertex_handle;
|
|
53
|
+
using Node = typename SimplexTree::Node;
|
|
54
|
+
using Static_vertex_vector = typename SimplexTree::Static_vertex_vector;
|
|
55
|
+
|
|
56
|
+
/** \brief Predicate to check whether an input SimplexTree::Node represents a
|
|
57
|
+
* coface of a simplex simp_, stored as a std::vector of
|
|
58
|
+
* SimplexTree::Vertex_handle sorted in decreasing Vertex_handle order.
|
|
59
|
+
*
|
|
60
|
+
* \details Given a SimplexHandle in a simplex tree cpx_, traverses the tree
|
|
61
|
+
* upwards
|
|
62
|
+
* to find the sequence of Vertex_handle of simp_ as a subsequence of labels
|
|
63
|
+
* encountered.
|
|
64
|
+
* Does not test sh itself.
|
|
65
|
+
* Used for filter_iterator in the optimized algorithm for
|
|
66
|
+
* star_simplex_range.
|
|
67
|
+
*/
|
|
68
|
+
class is_coface {
|
|
69
|
+
public:
|
|
70
|
+
is_coface() : cpx_(nullptr) {}
|
|
71
|
+
is_coface(SimplexTree* cpx, Static_vertex_vector&& simp) : cpx_(cpx), simp_(simp) {}
|
|
72
|
+
|
|
73
|
+
// Return true iff traversing the Node upwards to the root reads a
|
|
74
|
+
// coface of simp_
|
|
75
|
+
bool operator()(typename SimplexTree::Hooks_simplex_base& curr_hooks) {
|
|
76
|
+
Node& curr_node = static_cast<Node&>(curr_hooks);
|
|
77
|
+
Simplex_handle sh = cpx_->simplex_handle_from_node(curr_node);
|
|
78
|
+
// first Node must always have label simp_.begin(); we assume it is true
|
|
79
|
+
auto&& rng = cpx_->simplex_vertex_range(sh);
|
|
80
|
+
auto rng_it = rng.begin();
|
|
81
|
+
GUDHI_CHECK(*rng_it == simp_.front(), std::invalid_argument("first Node must always have label simp_.begin()"));
|
|
82
|
+
auto simp_it = simp_.begin();
|
|
83
|
+
// is simp_ a face of the simplex defined by sh ?
|
|
84
|
+
return std::includes(++rng_it, rng.end(), ++simp_it, simp_.end(), std::greater<Vertex_handle>());
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private:
|
|
88
|
+
SimplexTree* cpx_;
|
|
89
|
+
Static_vertex_vector simp_; // vertices of simplex, in reverse order
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
typedef boost::filter_iterator<is_coface, typename SimplexTree::List_max_vertex::iterator>
|
|
93
|
+
Filtered_cofaces_simplex_iterator;
|
|
94
|
+
// any end() iterator
|
|
95
|
+
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator() : predicate_(), st_(nullptr) {}
|
|
96
|
+
|
|
97
|
+
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator(SimplexTree* cpx,
|
|
98
|
+
Static_vertex_vector&& simp)
|
|
99
|
+
: predicate_(cpx, std::move(simp)), st_(cpx) {
|
|
100
|
+
GUDHI_CHECK(!simp.empty(), std::invalid_argument("cannot call for cofaces of an empty simplex"));
|
|
101
|
+
auto list_ptr = st_->nodes_by_label(simp.front());
|
|
102
|
+
GUDHI_CHECK(list_ptr != nullptr, std::runtime_error("invalid call to cofaces forest"));
|
|
103
|
+
|
|
104
|
+
it_ = boost::make_filter_iterator(predicate_, list_ptr->begin(), list_ptr->end());
|
|
105
|
+
end_ = boost::make_filter_iterator(predicate_, list_ptr->end(), list_ptr->end());
|
|
106
|
+
Node& curr_node = static_cast<Node&>(*it_);
|
|
107
|
+
sh_ = st_->simplex_handle_from_node(curr_node);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private:
|
|
111
|
+
friend class boost::iterator_core_access;
|
|
112
|
+
|
|
113
|
+
// valid when iterating along the SAME list of max vertex.
|
|
114
|
+
bool equal(Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator const& other) const {
|
|
115
|
+
if (other.st_ == nullptr) {
|
|
116
|
+
return (st_ == nullptr);
|
|
117
|
+
}
|
|
118
|
+
if (st_ == nullptr) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return (it_ == other.it_);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
Simplex_handle const& dereference() const { return sh_; }
|
|
125
|
+
|
|
126
|
+
void increment() {
|
|
127
|
+
if (++it_ == end_) {
|
|
128
|
+
st_ = nullptr;
|
|
129
|
+
} //== end
|
|
130
|
+
else { // update sh_
|
|
131
|
+
Node& curr_node = static_cast<Node&>(*it_);
|
|
132
|
+
sh_ = st_->simplex_handle_from_node(curr_node);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// given a Node of label max_v, returns true if the associated simplex is a coface of the simplex {..., max_v}. The
|
|
137
|
+
// predicate stores the vertices of the simplex whose star we compute.
|
|
138
|
+
is_coface predicate_;
|
|
139
|
+
SimplexTree* st_;
|
|
140
|
+
// filtered iterators over Nodes, filtered with predicate_
|
|
141
|
+
Filtered_cofaces_simplex_iterator it_;
|
|
142
|
+
Filtered_cofaces_simplex_iterator end_;
|
|
143
|
+
// current Simplex_handle corresponding to Node pointed at by it_
|
|
144
|
+
Simplex_handle sh_;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/** \brief Iterator over the simplices of the star of a simplex.
|
|
148
|
+
*
|
|
149
|
+
* \details All Nodes of the simplex must store intrusive list hooks (option
|
|
150
|
+
* link_nodes_by_label == true) in order to connect all nodes with a fixed label u
|
|
151
|
+
* into a list.
|
|
152
|
+
*
|
|
153
|
+
* Forward iterator, value_type is SimplexTree::Simplex_handle.
|
|
154
|
+
*
|
|
155
|
+
* The implementation uses a
|
|
156
|
+
* Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator to iterate through all
|
|
157
|
+
* roots of cofaces Nodes, and traverses each such subtree of the simplex tree.
|
|
158
|
+
*/
|
|
159
|
+
template <class SimplexTree>
|
|
160
|
+
class Simplex_tree_optimized_star_simplex_iterator
|
|
161
|
+
: public boost::iterator_facade<Simplex_tree_optimized_star_simplex_iterator<SimplexTree>,
|
|
162
|
+
typename SimplexTree::Simplex_handle const, boost::forward_traversal_tag> {
|
|
163
|
+
public:
|
|
164
|
+
using Simplex_handle = typename SimplexTree::Simplex_handle;
|
|
165
|
+
using Siblings = typename SimplexTree::Siblings;
|
|
166
|
+
using Vertex_handle = typename SimplexTree::Vertex_handle;
|
|
167
|
+
using Node = typename SimplexTree::Node;
|
|
168
|
+
using Static_vertex_vector = typename SimplexTree::Static_vertex_vector;
|
|
169
|
+
|
|
170
|
+
// any end() iterator
|
|
171
|
+
Simplex_tree_optimized_star_simplex_iterator() : st_(nullptr) {}
|
|
172
|
+
|
|
173
|
+
Simplex_tree_optimized_star_simplex_iterator(SimplexTree* cpx, Static_vertex_vector&& simp)
|
|
174
|
+
: st_(cpx), it_(cpx, std::move(simp)), end_(), sh_(*it_), sib_(st_->self_siblings(sh_)), children_stack_() {
|
|
175
|
+
if (it_ == end_) {
|
|
176
|
+
st_ = nullptr;
|
|
177
|
+
return;
|
|
178
|
+
} // no coface subtree => end()
|
|
179
|
+
is_root_ = true;
|
|
180
|
+
sh_ = *it_; // sh_ is the root
|
|
181
|
+
sib_ = st_->self_siblings(sh_); // Siblings containing sh_
|
|
182
|
+
if (st_->has_children(sh_)) {
|
|
183
|
+
children_stack_.push_back(st_->children(sh_));
|
|
184
|
+
}
|
|
185
|
+
return; // first root of coface subtree
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private:
|
|
189
|
+
friend class boost::iterator_core_access;
|
|
190
|
+
|
|
191
|
+
// valid when iterating along the SAME list of max vertex.
|
|
192
|
+
bool equal(Simplex_tree_optimized_star_simplex_iterator const& other) const {
|
|
193
|
+
if (other.st_ == nullptr) {
|
|
194
|
+
return (st_ == nullptr);
|
|
195
|
+
}
|
|
196
|
+
if (st_ == nullptr) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return (&(sh_->second) == &(other.sh_->second));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
Simplex_handle const& dereference() const { return sh_; }
|
|
203
|
+
|
|
204
|
+
/* Go to the next valid Simplex_handle for a coface, using a breadth first
|
|
205
|
+
* search approach.
|
|
206
|
+
*
|
|
207
|
+
* Invariant:
|
|
208
|
+
*
|
|
209
|
+
* sh_ is a coface,
|
|
210
|
+
* sib_ the Siblings containing sh_,
|
|
211
|
+
* it_ the root of a coface subtree, such that dim_root_ <= exact_dim_cofaces_.
|
|
212
|
+
* bfs_queue contains Siblings inside the coface subtree.
|
|
213
|
+
*
|
|
214
|
+
* Additionally,
|
|
215
|
+
*
|
|
216
|
+
* - computing all cofaces: sh_ points to a coface of any dimension. bfs_queue
|
|
217
|
+
* contains a collection of Siblings* that must be considered (as well as there
|
|
218
|
+
* children). These are all sets of children of simplices in
|
|
219
|
+
* [ sib_->members().begin(), sh_ ]
|
|
220
|
+
*/
|
|
221
|
+
void increment_all_cofaces() {
|
|
222
|
+
++sh_; // next sibling
|
|
223
|
+
// if no more sibling or root of coface tree, go down or to next subtree
|
|
224
|
+
if (is_root_ || sh_ == sib_->members().end()) {
|
|
225
|
+
is_root_ = false;
|
|
226
|
+
if (!children_stack_.empty()) {
|
|
227
|
+
sib_ = children_stack_.back();
|
|
228
|
+
children_stack_.pop_back();
|
|
229
|
+
sh_ = sib_->members().begin(); // don't track dimensions
|
|
230
|
+
if (st_->has_children(sh_)) {
|
|
231
|
+
children_stack_.push_back(st_->children(sh_));
|
|
232
|
+
}
|
|
233
|
+
} else { // bfs_queue == empty, go to root of next coface subtree
|
|
234
|
+
if (++it_ == end_) {
|
|
235
|
+
st_ = nullptr;
|
|
236
|
+
return;
|
|
237
|
+
} // no more subtree => end()
|
|
238
|
+
is_root_ = true;
|
|
239
|
+
sh_ = *it_; // sh_ is the root
|
|
240
|
+
sib_ = st_->self_siblings(sh_); // Siblings containing sh_
|
|
241
|
+
if (st_->has_children(sh_)) {
|
|
242
|
+
children_stack_.push_back(st_->children(sh_));
|
|
243
|
+
}
|
|
244
|
+
return; // next root of coface
|
|
245
|
+
}
|
|
246
|
+
} else { // sh_ is valid, simply add its children to the queue
|
|
247
|
+
if (st_->has_children(sh_)) {
|
|
248
|
+
children_stack_.push_back(st_->children(sh_));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// For cofaces, enumerating all the star and testing which simplices have the right dimension is suboptimal.
|
|
254
|
+
// This could be optimized later.
|
|
255
|
+
void increment() { increment_all_cofaces(); }
|
|
256
|
+
|
|
257
|
+
// Let s be the simplex in a complex C whose star is
|
|
258
|
+
// iterated through. Let max_v denote the maximal label of vertices in s.
|
|
259
|
+
SimplexTree* st_; // Simplex tree for complex C
|
|
260
|
+
// The cofaces of s form a subforest of the simplex tree. The roots of trees in this
|
|
261
|
+
// forest have label max_v.
|
|
262
|
+
//[it_,end_) == range of Simplex_handles of the roots of the cofaces trees (any dim)
|
|
263
|
+
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> it_;
|
|
264
|
+
Simplex_tree_optimized_cofaces_rooted_subtrees_simplex_iterator<SimplexTree> end_;
|
|
265
|
+
// curr Simplex_handle, returned by operator*, pointing to a coface of s
|
|
266
|
+
Simplex_handle sh_;
|
|
267
|
+
// set of siblings containing sh_ in the Simplex_tree
|
|
268
|
+
Siblings* sib_; //
|
|
269
|
+
// Save children in a list to avoid calling sib_->members().find(.)
|
|
270
|
+
std::vector<Siblings*> children_stack_;
|
|
271
|
+
// true iff sh_ points to the root of a coface subtree
|
|
272
|
+
bool is_root_;
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
} // namespace Gudhi
|
|
276
|
+
|
|
277
|
+
#endif // SIMPLEX_TREE_SIMPLEX_TREE_STAR_SIMPLEX_ITERATORS_H_
|