multipers 2.3.3b6__cp310-cp310-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-310-x86_64-linux-gnu.so +0 -0
- multipers/function_rips.pyx +105 -0
- multipers/grids.cpython-310-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-310-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-310-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-310-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-310-x86_64-linux-gnu.so +0 -0
- multipers/point_measure.pyx +395 -0
- multipers/simplex_tree_multi.cpython-310-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-310-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,129 @@
|
|
|
1
|
+
/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT.
|
|
2
|
+
* See file LICENSE for full license details.
|
|
3
|
+
* Author(s): David Loiseaux
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2021 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - 2022/03 Hannah Schreiber: Integration of the new Vineyard_persistence class, renaming and cleanup.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @file combinatory.h
|
|
12
|
+
* @author David Loiseaux, Hannah Schreiber
|
|
13
|
+
* @brief Combinatorial and sorting functions
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#ifndef COMBINATORY_H_INCLUDED
|
|
17
|
+
#define COMBINATORY_H_INCLUDED
|
|
18
|
+
|
|
19
|
+
#include <vector>
|
|
20
|
+
#include <iostream>
|
|
21
|
+
#include <functional>
|
|
22
|
+
#include <algorithm>
|
|
23
|
+
#include <climits>
|
|
24
|
+
#include <assert.h>
|
|
25
|
+
#include "utilities.h"
|
|
26
|
+
#include "debug.h"
|
|
27
|
+
|
|
28
|
+
namespace Gudhi::multiparameter::mma::Combinatorics {
|
|
29
|
+
|
|
30
|
+
using Gudhi::multiparameter::mma::permutation_type;
|
|
31
|
+
|
|
32
|
+
template<typename T> void compose(std::vector<T> &p, const permutation_type &q);
|
|
33
|
+
unsigned int prod(const std::vector<unsigned int>& toMultiply,
|
|
34
|
+
unsigned int until = UINT_MAX);
|
|
35
|
+
template<typename T>
|
|
36
|
+
permutation_type sort_and_return_permutation(
|
|
37
|
+
std::vector<T>& toSort,
|
|
38
|
+
std::function<bool(T&, T&)> lessOrEqualComparator);
|
|
39
|
+
template<typename T>
|
|
40
|
+
void quicksort_and_record_permutation(
|
|
41
|
+
std::vector<T>& toSort,
|
|
42
|
+
permutation_type& p,
|
|
43
|
+
unsigned int low,
|
|
44
|
+
unsigned int high,
|
|
45
|
+
std::function<bool(T&, T&)> lessOrEqualComparator);
|
|
46
|
+
|
|
47
|
+
template<typename T>
|
|
48
|
+
void compose(std::vector<T> &p,const permutation_type &q){
|
|
49
|
+
unsigned int n = p.size();
|
|
50
|
+
// assert(q.size() == n);
|
|
51
|
+
std::vector<T> r(n);
|
|
52
|
+
for(unsigned int i = 0; i< n; i++){
|
|
53
|
+
r[i] = p[q[i]];
|
|
54
|
+
}
|
|
55
|
+
p.swap(r);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
template<typename T>
|
|
59
|
+
std::vector<T> inverse(const std::vector<T> &p){
|
|
60
|
+
unsigned int n = p.size();
|
|
61
|
+
std::vector<T> inv(n);
|
|
62
|
+
for(unsigned int i = 0; i< n; i++)
|
|
63
|
+
inv[p[i]] = i;
|
|
64
|
+
|
|
65
|
+
return inv;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
unsigned int prod(const std::vector<unsigned int>& toMultiply,
|
|
69
|
+
unsigned int until)
|
|
70
|
+
{
|
|
71
|
+
unsigned int output = 1;
|
|
72
|
+
for (unsigned int i = 0; i < toMultiply.size() && i <= until; i++){
|
|
73
|
+
output *= toMultiply[i];
|
|
74
|
+
}
|
|
75
|
+
return output;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
template<typename T>
|
|
79
|
+
permutation_type sort_and_return_permutation(
|
|
80
|
+
std::vector<T>& toSort, std::function<bool(T&, T&)> lessOrEqualComparator)
|
|
81
|
+
{
|
|
82
|
+
unsigned int n = toSort.size();
|
|
83
|
+
|
|
84
|
+
// initialize p as the identity
|
|
85
|
+
permutation_type p(n);
|
|
86
|
+
for (unsigned int i = 0; i < n ; i++) p[i] = i;
|
|
87
|
+
|
|
88
|
+
// call the recursive function doing the job
|
|
89
|
+
quicksort_and_record_permutation<T>(toSort, p, 0, n - 1, lessOrEqualComparator);
|
|
90
|
+
|
|
91
|
+
return p;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
template<typename T>
|
|
95
|
+
void quicksort_and_record_permutation(
|
|
96
|
+
std::vector<T>& toSort,
|
|
97
|
+
permutation_type& p,
|
|
98
|
+
unsigned int low,
|
|
99
|
+
unsigned int high,
|
|
100
|
+
std::function<bool(T&, T&)> lessOrEqualComparator)
|
|
101
|
+
{
|
|
102
|
+
// compatibility check
|
|
103
|
+
assert(toSort.size() == p.size());
|
|
104
|
+
assert(high < toSort.size());
|
|
105
|
+
|
|
106
|
+
if (high <= low) return;
|
|
107
|
+
|
|
108
|
+
// take the last element as pivot.
|
|
109
|
+
T pivot = toSort[high];
|
|
110
|
+
|
|
111
|
+
int i = low - 1 ;
|
|
112
|
+
|
|
113
|
+
for (unsigned int j = low; j < high; j++){
|
|
114
|
+
if (lessOrEqualComparator(toSort[j], pivot)){
|
|
115
|
+
i++;
|
|
116
|
+
std::swap(toSort[i], toSort[j]);
|
|
117
|
+
std::swap(p[i], p[j]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
std::swap(toSort[i+1], toSort[high]);
|
|
121
|
+
std::swap(p[i+1], p[high]);
|
|
122
|
+
|
|
123
|
+
quicksort_and_record_permutation<T>(toSort, p, low, std::max(i, 0), lessOrEqualComparator);
|
|
124
|
+
quicksort_and_record_permutation<T>(toSort, p, i + 2, high, lessOrEqualComparator);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
} //namespace Combinatorics
|
|
128
|
+
|
|
129
|
+
#endif // COMBINATORY_H_INCLUDED
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* This file is part of the MMA Library -
|
|
2
|
+
* https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. See
|
|
3
|
+
* file LICENSE for full license details. Author(s): David Loiseaux
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2021 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - 2022/03 Hannah Schreiber: Integration of the new Vineyard_persistence
|
|
9
|
+
* class, renaming and cleanup.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @file debug.h
|
|
13
|
+
* @author David Loiseaux, Hannah Schreiber
|
|
14
|
+
* @brief Display functions for debug purposes
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#ifndef DEBUG_H_INCLUDED
|
|
18
|
+
#define DEBUG_H_INCLUDED
|
|
19
|
+
|
|
20
|
+
#include <chrono>
|
|
21
|
+
#include <iostream>
|
|
22
|
+
#include <list>
|
|
23
|
+
#include <vector>
|
|
24
|
+
|
|
25
|
+
namespace Gudhi::multiparameter::mma::Debug {
|
|
26
|
+
|
|
27
|
+
using clk = std::chrono::high_resolution_clock;
|
|
28
|
+
using tp = clk::time_point;
|
|
29
|
+
|
|
30
|
+
constexpr bool debug = false;
|
|
31
|
+
|
|
32
|
+
class Timer {
|
|
33
|
+
public:
|
|
34
|
+
Timer() : activated_(false) {}
|
|
35
|
+
Timer(const std::string &string, bool verbose)
|
|
36
|
+
: timer_(clk::now()), activated_(verbose) {
|
|
37
|
+
if (verbose) {
|
|
38
|
+
std::cout << string << std::flush;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
~Timer() {
|
|
42
|
+
if (activated_) {
|
|
43
|
+
std::chrono::duration<double> elapsed =
|
|
44
|
+
std::chrono::duration_cast<std::chrono::duration<double>>(clk::now() -
|
|
45
|
+
timer_);
|
|
46
|
+
std::cout << " Done ! (" << elapsed.count() << " s)." << std::endl;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private:
|
|
51
|
+
tp timer_;
|
|
52
|
+
bool activated_;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
template <typename T> void disp_vect(std::vector<T> v) {
|
|
56
|
+
for (auto i = 0u; i < v.size(); i++) {
|
|
57
|
+
std::cout << v[i] << " ";
|
|
58
|
+
}
|
|
59
|
+
std::cout << std::endl;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
template <typename T> void disp_vect(std::list<T> v) {
|
|
63
|
+
while (!v.empty()) {
|
|
64
|
+
std::cout << v.front() << " ";
|
|
65
|
+
v.pop_front();
|
|
66
|
+
}
|
|
67
|
+
std::cout << std::endl;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
template <typename T> void disp_vect(std::vector<std::pair<T, T>> v) {
|
|
71
|
+
for (unsigned int i = 0; i < v.size(); i++) {
|
|
72
|
+
std::cout << "(" << v[i].first << " " << v[i].second << ") ";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
template <typename T>
|
|
77
|
+
void disp_vect(std::vector<std::vector<T>> v, bool show_small = true) {
|
|
78
|
+
for (auto i = 0u; i < v.size(); i++) {
|
|
79
|
+
if (v[i].size() <= 1 && !show_small)
|
|
80
|
+
continue;
|
|
81
|
+
std::cout << "(";
|
|
82
|
+
for (auto j = 0u; j < v[i].size(); j++) {
|
|
83
|
+
std::cout << v[i][j];
|
|
84
|
+
if (j < v[i].size() - 1)
|
|
85
|
+
std::cout << " ";
|
|
86
|
+
}
|
|
87
|
+
std::cout << ") ";
|
|
88
|
+
}
|
|
89
|
+
std::cout << std::endl;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
} // namespace Gudhi::multiparameter::mma::Debug
|
|
93
|
+
namespace std {
|
|
94
|
+
template <typename T>
|
|
95
|
+
std::ostream &operator<<(std::ostream &stream, const std::vector<T> truc) {
|
|
96
|
+
stream << "[";
|
|
97
|
+
for (unsigned int i = 0; i < truc.size() - 1; i++) {
|
|
98
|
+
stream << truc[i] << ", ";
|
|
99
|
+
}
|
|
100
|
+
if (!truc.empty())
|
|
101
|
+
stream << truc.back();
|
|
102
|
+
stream << "]";
|
|
103
|
+
return stream;
|
|
104
|
+
}
|
|
105
|
+
} // namespace std
|
|
106
|
+
|
|
107
|
+
#endif // DEBUG_H_INCLUDED
|
|
File without changes
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/* This file is part of the MMA Library -
|
|
2
|
+
* https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. See
|
|
3
|
+
* file LICENSE for full license details. Author(s): David Loiseaux
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2021 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - 2022/03 Hannah Schreiber: Integration of the new Vineyard_persistence
|
|
9
|
+
* class, renaming and cleanup.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @file format_python-cpp.h
|
|
13
|
+
* @author David Loiseaux, Hannah Schreiber
|
|
14
|
+
* @brief Functions that change the format of data to communicate between C++
|
|
15
|
+
* and python.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef FORMAT_PYTHON_CPP_H_INCLUDED
|
|
19
|
+
#define FORMAT_PYTHON_CPP_H_INCLUDED
|
|
20
|
+
|
|
21
|
+
#include <cstddef>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "multiparameter_module_approximation/utilities.h"
|
|
25
|
+
#include <gudhi/Simplex_tree.h>
|
|
26
|
+
#include <gudhi/Simplex_tree_multi.h>
|
|
27
|
+
|
|
28
|
+
namespace Gudhi::multiparameter::mma {
|
|
29
|
+
|
|
30
|
+
// Lexical order + dimension
|
|
31
|
+
bool inline is_strictly_smaller_simplex(const boundary_type &s1,
|
|
32
|
+
const boundary_type &s2) {
|
|
33
|
+
if (s1.size() < s2.size())
|
|
34
|
+
return true;
|
|
35
|
+
if (s1.size() > s2.size())
|
|
36
|
+
return false;
|
|
37
|
+
|
|
38
|
+
for (unsigned int i = 0; i < s1.size(); i++) {
|
|
39
|
+
if (s1[i] < s2[i])
|
|
40
|
+
return true;
|
|
41
|
+
if (s1[i] > s2[i])
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// std::pair<boundary_matrix, multifiltration_type>
|
|
48
|
+
// inline simplextree_to_boundary_filtration(const uintptr_t splxptr) {
|
|
49
|
+
// using option =
|
|
50
|
+
// Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<>;
|
|
51
|
+
// Gudhi::Simplex_tree<option> &simplexTree =
|
|
52
|
+
// *(Gudhi::Simplex_tree<option> *)(splxptr);
|
|
53
|
+
//
|
|
54
|
+
// unsigned int numberOfSimplices = simplexTree.num_simplices();
|
|
55
|
+
// boundary_matrix boundaries(numberOfSimplices);
|
|
56
|
+
// boundary_matrix simplices(numberOfSimplices);
|
|
57
|
+
// if (simplexTree.num_simplices() <= 0)
|
|
58
|
+
// return {{}, {{}}};
|
|
59
|
+
// unsigned int filtration_number =
|
|
60
|
+
// simplexTree.filtration(*(simplexTree.complex_simplex_range().begin()))
|
|
61
|
+
// .size();
|
|
62
|
+
// std::vector<filtration_type> filtration(filtration_number,
|
|
63
|
+
// filtration_type(numberOfSimplices));
|
|
64
|
+
//
|
|
65
|
+
// unsigned int count = 0;
|
|
66
|
+
// for (auto sh : simplexTree.filtration_simplex_range())
|
|
67
|
+
// simplexTree.assign_key(sh, count++);
|
|
68
|
+
//
|
|
69
|
+
// unsigned int i = 0;
|
|
70
|
+
// for (auto &simplex : simplexTree.filtration_simplex_range()) {
|
|
71
|
+
// for (const auto &simplex_id : simplexTree.boundary_simplex_range(simplex)) {
|
|
72
|
+
// boundaries[i].push_back(simplexTree.key(simplex_id));
|
|
73
|
+
// }
|
|
74
|
+
// for (const auto &vertex : simplexTree.simplex_vertex_range(simplex)) {
|
|
75
|
+
// simplices[i].push_back(vertex);
|
|
76
|
+
// }
|
|
77
|
+
// const auto &temp = simplexTree.filtration(simplex);
|
|
78
|
+
// for (unsigned int j = 0; j < temp.size(); j++)
|
|
79
|
+
// filtration[j][i] = temp[j];
|
|
80
|
+
// i++;
|
|
81
|
+
// }
|
|
82
|
+
// for (boundary_type &simplex : simplices) {
|
|
83
|
+
// std::sort(simplex.begin(), simplex.end());
|
|
84
|
+
// }
|
|
85
|
+
// permutation_type p =
|
|
86
|
+
// Combinatorics::sort_and_return_permutation<boundary_type>(
|
|
87
|
+
// simplices, &is_strictly_smaller_simplex);
|
|
88
|
+
//
|
|
89
|
+
// for (auto &F : filtration) {
|
|
90
|
+
// Combinatorics::compose(F, p);
|
|
91
|
+
// }
|
|
92
|
+
//
|
|
93
|
+
// Combinatorics::compose(boundaries, p);
|
|
94
|
+
//
|
|
95
|
+
// auto inv = Combinatorics::inverse(p);
|
|
96
|
+
//
|
|
97
|
+
// for (boundary_type &simplex : boundaries) {
|
|
98
|
+
// for (auto &b : simplex)
|
|
99
|
+
// b = inv[b];
|
|
100
|
+
// std::sort(simplex.begin(), simplex.end());
|
|
101
|
+
// }
|
|
102
|
+
//
|
|
103
|
+
// return std::make_pair(boundaries, filtration);
|
|
104
|
+
// }
|
|
105
|
+
|
|
106
|
+
template <typename Options>
|
|
107
|
+
using scc_type =
|
|
108
|
+
std::vector<std::pair<std::vector<std::vector<typename Options::value_type>>, boundary_matrix>>;
|
|
109
|
+
template <typename STOptions>
|
|
110
|
+
inline scc_type<STOptions> simplextree_to_scc(Gudhi::Simplex_tree<STOptions> &st) {
|
|
111
|
+
scc_type<STOptions> out(st.dimension() + 1);
|
|
112
|
+
if (st.num_simplices() <= 0)
|
|
113
|
+
return out;
|
|
114
|
+
|
|
115
|
+
/* Assigns keys to simplices according their dimension */
|
|
116
|
+
std::vector<int> simplices_per_block_dim(st.dimension() + 1);
|
|
117
|
+
for (auto sh : st.filtration_simplex_range())
|
|
118
|
+
st.assign_key(sh, simplices_per_block_dim[st.dimension(sh)]++);
|
|
119
|
+
|
|
120
|
+
std::vector<unsigned int> key_boundary_container;
|
|
121
|
+
for (auto &simplex : st.filtration_simplex_range()) {
|
|
122
|
+
key_boundary_container.clear();
|
|
123
|
+
for (const auto &simplex_id : st.boundary_simplex_range(simplex)) {
|
|
124
|
+
key_boundary_container.push_back(st.key(simplex_id));
|
|
125
|
+
}
|
|
126
|
+
auto &[block_filtrations, block_matrix] = out[st.dimension(simplex)];
|
|
127
|
+
const typename STOptions::Filtration_value &simplex_filtration = st.filtration(simplex);
|
|
128
|
+
block_matrix.push_back(key_boundary_container);
|
|
129
|
+
|
|
130
|
+
block_filtrations.push_back(static_cast<typename STOptions::Filtration_value::Generator>(simplex_filtration));
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
template <typename Options>
|
|
135
|
+
using kscc_type =
|
|
136
|
+
std::vector<std::pair<std::vector<std::vector<std::vector< typename Options::value_type >>>, boundary_matrix>>;
|
|
137
|
+
template <typename STOptions>
|
|
138
|
+
inline kscc_type<STOptions> kcritical_simplextree_to_scc(Gudhi::Simplex_tree<STOptions> &st) {
|
|
139
|
+
static_assert(STOptions::Filtration_value::is_multi_critical);
|
|
140
|
+
kscc_type<STOptions> out(st.dimension() + 1);
|
|
141
|
+
if (st.num_simplices() <= 0)
|
|
142
|
+
return out;
|
|
143
|
+
|
|
144
|
+
/* Assigns keys to simplices according their dimension */
|
|
145
|
+
std::vector<int> simplices_per_block_dim(st.dimension() + 1);
|
|
146
|
+
for (auto sh : st.complex_simplex_range())
|
|
147
|
+
st.assign_key(sh, simplices_per_block_dim[st.dimension(sh)]++);
|
|
148
|
+
|
|
149
|
+
std::vector<unsigned int> key_boundary_container;
|
|
150
|
+
for (auto &simplex : st.complex_simplex_range()) {
|
|
151
|
+
key_boundary_container.clear();
|
|
152
|
+
for (const auto &simplex_id : st.boundary_simplex_range(simplex)) {
|
|
153
|
+
key_boundary_container.push_back(st.key(simplex_id));
|
|
154
|
+
}
|
|
155
|
+
auto &[block_filtrations, block_matrix] = out[st.dimension(simplex)];
|
|
156
|
+
const typename STOptions::Filtration_value &simplex_filtration = st.filtration(simplex);
|
|
157
|
+
block_matrix.push_back(key_boundary_container);
|
|
158
|
+
block_filtrations.push_back(
|
|
159
|
+
std::vector<std::vector<typename STOptions::Filtration_value::value_type>>(
|
|
160
|
+
simplex_filtration.begin(), simplex_filtration.end()));
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
template <typename value_type>
|
|
166
|
+
using function_scc_type = std::vector<
|
|
167
|
+
std::pair<std::vector<std::vector<std::vector<value_type>>>, boundary_matrix>>;
|
|
168
|
+
template <typename STOptions>
|
|
169
|
+
inline function_scc_type<typename STOptions::Filtration_value::value_type>
|
|
170
|
+
function_simplextree_to_scc(Gudhi::Simplex_tree<STOptions> &st) {
|
|
171
|
+
using value_type =
|
|
172
|
+
typename STOptions::Filtration_value::value_type;
|
|
173
|
+
function_scc_type<value_type> out(st.dimension() + 1);
|
|
174
|
+
if (st.num_simplices() <= 0)
|
|
175
|
+
return out;
|
|
176
|
+
|
|
177
|
+
/* Assigns keys to simplices according their dimension */
|
|
178
|
+
std::vector<int> simplices_per_block_dim(st.dimension() + 1);
|
|
179
|
+
for (auto sh : st.filtration_simplex_range())
|
|
180
|
+
st.assign_key(sh, simplices_per_block_dim[st.dimension(sh)]++);
|
|
181
|
+
|
|
182
|
+
std::vector<unsigned int> key_boundary_container;
|
|
183
|
+
for (auto &simplex : st.filtration_simplex_range()) {
|
|
184
|
+
key_boundary_container.clear();
|
|
185
|
+
for (const auto &simplex_id : st.boundary_simplex_range(simplex)) {
|
|
186
|
+
key_boundary_container.push_back(st.key(simplex_id));
|
|
187
|
+
}
|
|
188
|
+
auto &[block_filtrations, block_matrix] = out[st.dimension(simplex)];
|
|
189
|
+
const auto &simplex_filtration = st.filtration(simplex);
|
|
190
|
+
block_matrix.push_back(key_boundary_container);
|
|
191
|
+
std::vector<std::vector<value_type>> _filtration;
|
|
192
|
+
for (std::size_t i = 0; i < simplex_filtration.size(); i++) {
|
|
193
|
+
_filtration.push_back(
|
|
194
|
+
{static_cast<value_type>(simplex_filtration[i]), static_cast<value_type>(i)});
|
|
195
|
+
}
|
|
196
|
+
block_filtrations.push_back(_filtration);
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// scc_type inline simplextree_to_scc(const uintptr_t splxptr) {
|
|
202
|
+
// using option =
|
|
203
|
+
// Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<>;
|
|
204
|
+
// Gudhi::Simplex_tree<option> &st = *(Gudhi::Simplex_tree<option> *)(splxptr);
|
|
205
|
+
// return simplextree_to_scc<option>(st);
|
|
206
|
+
// }
|
|
207
|
+
// function_scc_type inline function_simplextree_to_scc(const uintptr_t splxptr) {
|
|
208
|
+
// using option =
|
|
209
|
+
// Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<>;
|
|
210
|
+
// Gudhi::Simplex_tree<option> &st = *(Gudhi::Simplex_tree<option> *)(splxptr);
|
|
211
|
+
// return function_simplextree_to_scc<option>(st);
|
|
212
|
+
// }
|
|
213
|
+
template <typename Options>
|
|
214
|
+
using flattened_scc_type =
|
|
215
|
+
std::pair<std::vector<std::vector<typename Options::value_type>>,
|
|
216
|
+
std::vector<std::vector<unsigned int>>>;
|
|
217
|
+
|
|
218
|
+
template <typename Options>
|
|
219
|
+
flattened_scc_type<Options> inline simplextree_to_ordered_bf(
|
|
220
|
+
Gudhi::Simplex_tree<Options> &st) {
|
|
221
|
+
auto scc = simplextree_to_scc<Options>(st);
|
|
222
|
+
flattened_scc_type<Options> out;
|
|
223
|
+
auto &[filtration, boundary] = out;
|
|
224
|
+
std::size_t num_simplices = 0;
|
|
225
|
+
std::vector<std::size_t> cumsum_sizes = {0, 0};
|
|
226
|
+
for (auto &[f, b] : scc) {
|
|
227
|
+
num_simplices += b.size();
|
|
228
|
+
cumsum_sizes.push_back(num_simplices);
|
|
229
|
+
}
|
|
230
|
+
filtration.reserve(num_simplices);
|
|
231
|
+
boundary.reserve(num_simplices);
|
|
232
|
+
for (auto i = 0u; i < scc.size(); ++i) {
|
|
233
|
+
auto shift = cumsum_sizes[i];
|
|
234
|
+
auto &[f, b] = scc[i];
|
|
235
|
+
for (auto j = 0u; j < b.size(); ++j) {
|
|
236
|
+
filtration.push_back(f[j]);
|
|
237
|
+
auto new_b = b[j];
|
|
238
|
+
for (auto &stuff : new_b)
|
|
239
|
+
stuff += shift;
|
|
240
|
+
boundary.push_back(new_b);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return out;
|
|
244
|
+
}
|
|
245
|
+
// template <
|
|
246
|
+
// typename Options =
|
|
247
|
+
// Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<>>
|
|
248
|
+
// flattened_scc_type<Options> simplextree_to_ordered_bf(const uintptr_t splxptr) {
|
|
249
|
+
// Gudhi::Simplex_tree<Options> &st = *(Gudhi::Simplex_tree<Options> *)(splxptr);
|
|
250
|
+
// return simplextree_to_ordered_bf<Options>(st);
|
|
251
|
+
// }
|
|
252
|
+
template <typename MultiFiltration>
|
|
253
|
+
using BoundaryFiltration =
|
|
254
|
+
std::pair<boundary_matrix, std::vector<MultiFiltration>>;
|
|
255
|
+
|
|
256
|
+
template <class SimplexTree>
|
|
257
|
+
BoundaryFiltration<typename SimplexTree::Options::Filtration_value>
|
|
258
|
+
st2bf(SimplexTree &st) {
|
|
259
|
+
|
|
260
|
+
BoundaryFiltration<typename SimplexTree::Options::Filtration_value> out;
|
|
261
|
+
auto &[matrix, filtrations] = out;
|
|
262
|
+
matrix.reserve(st.num_simplices());
|
|
263
|
+
filtrations.reserve(st.num_simplices());
|
|
264
|
+
if (st.num_simplices() <= 0)
|
|
265
|
+
return out;
|
|
266
|
+
|
|
267
|
+
/* Assigns keys to simplices according their dimension */
|
|
268
|
+
int count = 0;
|
|
269
|
+
for (auto sh : st.complex_simplex_range())
|
|
270
|
+
st.assign_key(sh, count++);
|
|
271
|
+
|
|
272
|
+
std::vector<unsigned int> key_boundary_container;
|
|
273
|
+
for (auto &simplex : st.complex_simplex_range()) {
|
|
274
|
+
key_boundary_container.clear();
|
|
275
|
+
for (const auto &simplex_id : st.boundary_simplex_range(simplex)) {
|
|
276
|
+
key_boundary_container.push_back(st.key(simplex_id));
|
|
277
|
+
}
|
|
278
|
+
matrix.push_back(key_boundary_container);
|
|
279
|
+
filtrations.push_back(st.filtration(simplex));
|
|
280
|
+
}
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
} // namespace Gudhi::multiparameter::mma
|
|
285
|
+
|
|
286
|
+
#endif // FORMAT_PYTHON_CPP_H_INCLUDED
|