multipers 2.2.3__cp312-cp312-win_amd64.whl → 2.3.1__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of multipers might be problematic. Click here for more details.
- 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.cp312-win_amd64.pyd +0 -0
- multipers/function_rips.pyx +105 -105
- multipers/grids.cp312-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.cp312-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.cp312-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.cp312-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.cp312-win_amd64.pyd +0 -0
- multipers/point_measure.pyx +322 -320
- multipers/simplex_tree_multi.cp312-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.cp312-win_amd64.pyd +0 -0
- multipers/slicer.pxd +281 -100
- 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,93 +1,84 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include "Simplex_tree_multi_interface.h"
|
|
4
|
-
#include <
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
namespace
|
|
8
|
-
namespace
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
build_idx_map(interface_multi<Filtration> &st,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
std::
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
std::
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{static_cast<int32_t>(pt_idx), static_cast<int32_t>(parameter)});
|
|
86
|
-
else
|
|
87
|
-
pt_indices[parameter] = it->second;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return {out_indices, out_unmapped_values}; // TODO return a ptr for python
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
}}} // namespace Gudhi::multiparameter::differentiation
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "Simplex_tree_multi_interface.h"
|
|
4
|
+
#include <cstdint>
|
|
5
|
+
#include <vector>
|
|
6
|
+
|
|
7
|
+
namespace Gudhi {
|
|
8
|
+
namespace multiparameter {
|
|
9
|
+
namespace differentiation {
|
|
10
|
+
|
|
11
|
+
using signed_measure_indices = std::vector<std::vector<int32_t>>;
|
|
12
|
+
template <typename Filtration>
|
|
13
|
+
using interface_multi = python_interface::interface_multi<Filtration>;
|
|
14
|
+
template <typename Filtration>
|
|
15
|
+
using signed_measure_pts = std::vector<std::vector<typename Filtration::value_type>>;
|
|
16
|
+
template <typename Filtration>
|
|
17
|
+
using idx_map_type = std::vector<std::map<typename Filtration::value_type, int32_t>>;
|
|
18
|
+
|
|
19
|
+
// O(num_simplices)
|
|
20
|
+
template <typename Filtration>
|
|
21
|
+
idx_map_type<Filtration> build_idx_map(interface_multi<Filtration> &st, const std::vector<int> &simplices_dimensions) {
|
|
22
|
+
auto num_parameters = st.get_number_of_parameters();
|
|
23
|
+
if (static_cast<int>(simplices_dimensions.size()) < num_parameters) throw;
|
|
24
|
+
int max_dim = *std::max_element(simplices_dimensions.begin(), simplices_dimensions.end());
|
|
25
|
+
int min_dim = *std::min_element(simplices_dimensions.begin(), simplices_dimensions.end());
|
|
26
|
+
max_dim = min_dim >= 0 ? max_dim : st.dimension();
|
|
27
|
+
|
|
28
|
+
idx_map_type<Filtration> idx_map(num_parameters);
|
|
29
|
+
auto splx_idx = 0u;
|
|
30
|
+
for (auto sh : st.complex_simplex_range()) { // order has to be retrieved later, so I'm
|
|
31
|
+
// not sure that skeleton iterator is well
|
|
32
|
+
// suited
|
|
33
|
+
const auto &splx_filtration = st.filtration(sh);
|
|
34
|
+
const auto splx_dim = st.dimension(sh);
|
|
35
|
+
if (splx_dim <= max_dim)
|
|
36
|
+
for (auto i = 0u; i < splx_filtration.size(); i++) {
|
|
37
|
+
if (simplices_dimensions[i] != splx_dim and simplices_dimensions[i] != -1) continue;
|
|
38
|
+
auto f = splx_filtration[i];
|
|
39
|
+
idx_map[i].try_emplace(f, splx_idx);
|
|
40
|
+
}
|
|
41
|
+
splx_idx++;
|
|
42
|
+
}
|
|
43
|
+
return idx_map;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
template <typename Filtration, typename... Args>
|
|
47
|
+
idx_map_type<Filtration> build_idx_map(const intptr_t simplextree_ptr, Args... args) {
|
|
48
|
+
auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(simplextree_ptr);
|
|
49
|
+
return build_idx_map(st_multi, args...);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// O(signed_measure_size*num_parameters)
|
|
53
|
+
template <typename Filtration>
|
|
54
|
+
std::pair<signed_measure_indices, signed_measure_indices> get_signed_measure_indices(
|
|
55
|
+
const idx_map_type<Filtration> &idx_map,
|
|
56
|
+
const signed_measure_pts<Filtration> &pts) {
|
|
57
|
+
using value_type = typename Filtration::value_type;
|
|
58
|
+
std::size_t num_pts = pts.size();
|
|
59
|
+
std::size_t num_parameters = idx_map.size();
|
|
60
|
+
signed_measure_indices out_indices(
|
|
61
|
+
num_pts,
|
|
62
|
+
std::vector<int32_t>(num_parameters,
|
|
63
|
+
-1)); // -1 to be able from indicies to get if the pt is found or not
|
|
64
|
+
signed_measure_indices out_unmapped_values;
|
|
65
|
+
for (auto pt_idx = 0u; pt_idx < num_pts; pt_idx++) {
|
|
66
|
+
auto &pt = pts[pt_idx];
|
|
67
|
+
auto &pt_indices = out_indices[pt_idx];
|
|
68
|
+
|
|
69
|
+
for (std::size_t parameter = 0u; parameter < num_parameters; parameter++) {
|
|
70
|
+
value_type f = pt[parameter];
|
|
71
|
+
const std::map<value_type, int32_t> ¶meter_map = idx_map[parameter];
|
|
72
|
+
auto it = parameter_map.find(f);
|
|
73
|
+
if (it == parameter_map.end())
|
|
74
|
+
out_unmapped_values.push_back({static_cast<int32_t>(pt_idx), static_cast<int32_t>(parameter)});
|
|
75
|
+
else
|
|
76
|
+
pt_indices[parameter] = it->second;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {out_indices, out_unmapped_values}; // TODO return a ptr for python
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
} // namespace differentiation
|
|
83
|
+
} // namespace multiparameter
|
|
84
|
+
} // namespace Gudhi
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <iostream>
|
|
4
|
-
#include <vector>
|
|
5
|
-
#include <utility> // std::pair
|
|
6
|
-
#include "Simplex_tree_multi_interface.h"
|
|
7
|
-
#include "multi_parameter_rank_invariant/persistence_slices.h"
|
|
8
|
-
|
|
9
|
-
// #include <gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h>
|
|
10
|
-
|
|
11
|
-
#include "tensor/tensor.h"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
namespace Gudhi::multiparameter::euler_characteristic{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
template<typename Filtration, typename dtype=int, typename index_type=std::uint16_t>
|
|
18
|
-
void get_euler_surface(
|
|
19
|
-
python_interface::Simplex_tree_multi_interface<Filtration, typename Filtration::value_type> &st_multi,
|
|
20
|
-
const tensor::static_tensor_view<dtype, index_type>& out, // assumes its a zero tensor
|
|
21
|
-
bool mobius_inversion,
|
|
22
|
-
bool zero_pad
|
|
23
|
-
){
|
|
24
|
-
std::vector<index_type> coordinate_container(st_multi.get_number_of_parameters());
|
|
25
|
-
for (auto sh : st_multi.complex_simplex_range()){
|
|
26
|
-
const auto& multi_filtration = st_multi.filtration(sh);
|
|
27
|
-
for (index_type i=0u; i<st_multi.get_number_of_parameters(); i++){
|
|
28
|
-
coordinate_container[i] = static_cast<index_type>(multi_filtration[i]);
|
|
29
|
-
}
|
|
30
|
-
int sign = 1-2*(st_multi.dimension(sh) % 2);
|
|
31
|
-
if (mobius_inversion && zero_pad)
|
|
32
|
-
out.add_cone_boundary(coordinate_container,sign);
|
|
33
|
-
else if (mobius_inversion)
|
|
34
|
-
out[coordinate_container] += sign;
|
|
35
|
-
else
|
|
36
|
-
out.add_cone(coordinate_container,sign);
|
|
37
|
-
}
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
template<typename Filtration, typename dtype=int, typename indices_type=uint16_t>
|
|
43
|
-
std::pair<std::vector<std::vector<indices_type>>, std::vector<dtype>> get_euler_signed_measure(
|
|
44
|
-
python_interface::Simplex_tree_multi_interface<Filtration, typename Filtration::value_type>& st_multi,
|
|
45
|
-
dtype* data_ptr,
|
|
46
|
-
std::vector<indices_type> grid_shape,
|
|
47
|
-
bool zero_pad,
|
|
48
|
-
const bool verbose = false){
|
|
49
|
-
// const bool verbose = false;
|
|
50
|
-
tensor::static_tensor_view<dtype, indices_type> container(data_ptr,grid_shape); // assumes its a zero tensor
|
|
51
|
-
if (verbose){
|
|
52
|
-
std::cout << "Container shape : ";
|
|
53
|
-
for (auto r : container.get_resolution()) std::cout << r << ", ";
|
|
54
|
-
std::cout << "\nContainer size : " << container.size();
|
|
55
|
-
std::cout << "\nComputing Euler Characteristic ...";
|
|
56
|
-
}
|
|
57
|
-
get_euler_surface(st_multi,container,true, zero_pad);
|
|
58
|
-
if (verbose){
|
|
59
|
-
std::cout << "Done." << std::endl;
|
|
60
|
-
std::cout << "Sparsifying the measure ...";
|
|
61
|
-
}
|
|
62
|
-
auto raw_signed_measure = container.sparsify();
|
|
63
|
-
if (verbose){
|
|
64
|
-
std::cout << "Done." << std::endl;
|
|
65
|
-
}
|
|
66
|
-
return raw_signed_measure;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
template<typename Filtration, typename dtype, typename indices_type, typename ... Args>
|
|
71
|
-
void get_euler_surface_python(
|
|
72
|
-
const intptr_t simplextree_ptr,
|
|
73
|
-
dtype* data_ptr,
|
|
74
|
-
const std::vector<indices_type> grid_shape,
|
|
75
|
-
bool mobius_inversion=false,
|
|
76
|
-
bool zero_pad = false,
|
|
77
|
-
bool verbose=false){
|
|
78
|
-
auto &st_multi = get_simplextree_from_pointer<python_interface::interface_multi<Filtration>>(simplextree_ptr);
|
|
79
|
-
tensor::static_tensor_view<dtype, indices_type> container(data_ptr,grid_shape); // assumes its a zero tensor
|
|
80
|
-
if (verbose){
|
|
81
|
-
std::cout << "Container shape : ";
|
|
82
|
-
for (auto r : container.get_resolution()) std::cout << r << ", ";
|
|
83
|
-
std::cout << "\nContainer size : " << container.size();
|
|
84
|
-
std::cout << "\nComputing Euler Characteristic ...";
|
|
85
|
-
}
|
|
86
|
-
get_euler_surface(st_multi,container,mobius_inversion, zero_pad);
|
|
87
|
-
if (verbose){
|
|
88
|
-
std::cout << "Done." << std::endl;
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
} // namespace rank_invariant
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <iostream>
|
|
4
|
+
#include <vector>
|
|
5
|
+
#include <utility> // std::pair
|
|
6
|
+
#include "Simplex_tree_multi_interface.h"
|
|
7
|
+
#include "multi_parameter_rank_invariant/persistence_slices.h"
|
|
8
|
+
|
|
9
|
+
// #include <gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h>
|
|
10
|
+
|
|
11
|
+
#include "tensor/tensor.h"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
namespace Gudhi::multiparameter::euler_characteristic{
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
template<typename Filtration, typename dtype=int, typename index_type=std::uint16_t>
|
|
18
|
+
void get_euler_surface(
|
|
19
|
+
python_interface::Simplex_tree_multi_interface<Filtration, typename Filtration::value_type> &st_multi,
|
|
20
|
+
const tensor::static_tensor_view<dtype, index_type>& out, // assumes its a zero tensor
|
|
21
|
+
bool mobius_inversion,
|
|
22
|
+
bool zero_pad
|
|
23
|
+
){
|
|
24
|
+
std::vector<index_type> coordinate_container(st_multi.get_number_of_parameters());
|
|
25
|
+
for (auto sh : st_multi.complex_simplex_range()){
|
|
26
|
+
const auto& multi_filtration = st_multi.filtration(sh);
|
|
27
|
+
for (index_type i=0u; i<st_multi.get_number_of_parameters(); i++){
|
|
28
|
+
coordinate_container[i] = static_cast<index_type>(multi_filtration[i]);
|
|
29
|
+
}
|
|
30
|
+
int sign = 1-2*(st_multi.dimension(sh) % 2);
|
|
31
|
+
if (mobius_inversion && zero_pad)
|
|
32
|
+
out.add_cone_boundary(coordinate_container,sign);
|
|
33
|
+
else if (mobius_inversion)
|
|
34
|
+
out[coordinate_container] += sign;
|
|
35
|
+
else
|
|
36
|
+
out.add_cone(coordinate_container,sign);
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
template<typename Filtration, typename dtype=int, typename indices_type=uint16_t>
|
|
43
|
+
std::pair<std::vector<std::vector<indices_type>>, std::vector<dtype>> get_euler_signed_measure(
|
|
44
|
+
python_interface::Simplex_tree_multi_interface<Filtration, typename Filtration::value_type>& st_multi,
|
|
45
|
+
dtype* data_ptr,
|
|
46
|
+
std::vector<indices_type> grid_shape,
|
|
47
|
+
bool zero_pad,
|
|
48
|
+
const bool verbose = false){
|
|
49
|
+
// const bool verbose = false;
|
|
50
|
+
tensor::static_tensor_view<dtype, indices_type> container(data_ptr,grid_shape); // assumes its a zero tensor
|
|
51
|
+
if (verbose){
|
|
52
|
+
std::cout << "Container shape : ";
|
|
53
|
+
for (auto r : container.get_resolution()) std::cout << r << ", ";
|
|
54
|
+
std::cout << "\nContainer size : " << container.size();
|
|
55
|
+
std::cout << "\nComputing Euler Characteristic ...";
|
|
56
|
+
}
|
|
57
|
+
get_euler_surface(st_multi,container,true, zero_pad);
|
|
58
|
+
if (verbose){
|
|
59
|
+
std::cout << "Done." << std::endl;
|
|
60
|
+
std::cout << "Sparsifying the measure ...";
|
|
61
|
+
}
|
|
62
|
+
auto raw_signed_measure = container.sparsify();
|
|
63
|
+
if (verbose){
|
|
64
|
+
std::cout << "Done." << std::endl;
|
|
65
|
+
}
|
|
66
|
+
return raw_signed_measure;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
template<typename Filtration, typename dtype, typename indices_type, typename ... Args>
|
|
71
|
+
void get_euler_surface_python(
|
|
72
|
+
const intptr_t simplextree_ptr,
|
|
73
|
+
dtype* data_ptr,
|
|
74
|
+
const std::vector<indices_type> grid_shape,
|
|
75
|
+
bool mobius_inversion=false,
|
|
76
|
+
bool zero_pad = false,
|
|
77
|
+
bool verbose=false){
|
|
78
|
+
auto &st_multi = get_simplextree_from_pointer<python_interface::interface_multi<Filtration>>(simplextree_ptr);
|
|
79
|
+
tensor::static_tensor_view<dtype, indices_type> container(data_ptr,grid_shape); // assumes its a zero tensor
|
|
80
|
+
if (verbose){
|
|
81
|
+
std::cout << "Container shape : ";
|
|
82
|
+
for (auto r : container.get_resolution()) std::cout << r << ", ";
|
|
83
|
+
std::cout << "\nContainer size : " << container.size();
|
|
84
|
+
std::cout << "\nComputing Euler Characteristic ...";
|
|
85
|
+
}
|
|
86
|
+
get_euler_surface(st_multi,container,mobius_inversion, zero_pad);
|
|
87
|
+
if (verbose){
|
|
88
|
+
std::cout << "Done." << std::endl;
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
} // namespace rank_invariant
|