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
multipers/function_rips.pyx
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
# cimport multipers.tensor as mt
|
|
2
|
-
from libc.stdint cimport intptr_t, uint16_t, uint32_t, int32_t
|
|
3
|
-
from libcpp.vector cimport vector
|
|
4
|
-
from libcpp cimport bool, int, float
|
|
5
|
-
from libcpp.utility cimport pair, tuple
|
|
6
|
-
from typing import Optional,Iterable,Callable
|
|
7
|
-
|
|
8
|
-
import numpy as np
|
|
9
|
-
cimport numpy as cnp
|
|
10
|
-
cnp.import_array()
|
|
11
|
-
|
|
12
|
-
ctypedef double value_type
|
|
13
|
-
python_value_type=np.float64
|
|
14
|
-
|
|
15
|
-
ctypedef int32_t indices_type # uint fails for some reason
|
|
16
|
-
python_indices_type=np.int32
|
|
17
|
-
|
|
18
|
-
ctypedef int32_t tensor_dtype
|
|
19
|
-
python_tensor_dtype = np.int32
|
|
20
|
-
|
|
21
|
-
ctypedef pair[vector[vector[indices_type]], vector[tensor_dtype]] signed_measure_type
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
from multipers.simplex_tree_multi import SimplexTreeMulti_Ff64
|
|
25
|
-
from gudhi.simplex_tree import SimplexTree
|
|
26
|
-
|
|
27
|
-
cdef extern from "multi_parameter_rank_invariant/function_rips.h" namespace "Gudhi::multiparameter::function_rips":
|
|
28
|
-
void compute_function_rips_surface_python(const intptr_t, tensor_dtype* , const vector[indices_type], indices_type,indices_type, bool, bool, indices_type) except + nogil
|
|
29
|
-
signed_measure_type compute_function_rips_signed_measure_python(const intptr_t, tensor_dtype* , const vector[indices_type], indices_type,indices_type, bool, bool, indices_type) except + nogil
|
|
30
|
-
pair[vector[value_type],int] get_degree_rips_st_python(const intptr_t,const intptr_t, const vector[int]) except + nogil
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
import multipers.grids as mpg
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def get_degree_rips(st, vector[int] degrees, grid_strategy="exact", resolution=0):
|
|
38
|
-
assert isinstance(st,SimplexTree), "Input has to be a Gudhi simplextree for now."
|
|
39
|
-
assert st.dimension() == 1, "Simplextree has to be of dimension 1. You can use the `prune_above_dimension` method."
|
|
40
|
-
degree_rips_st = SimplexTreeMulti_Ff64(num_parameters=degrees.size())
|
|
41
|
-
cdef intptr_t simplextree_ptr = st.thisptr
|
|
42
|
-
cdef intptr_t st_multi_ptr = degree_rips_st.thisptr
|
|
43
|
-
cdef pair[vector[value_type],int] out
|
|
44
|
-
with nogil:
|
|
45
|
-
out = get_degree_rips_st_python(simplextree_ptr, st_multi_ptr, degrees)
|
|
46
|
-
filtrations = np.asarray(out.first)
|
|
47
|
-
cdef int max_degree = out.second
|
|
48
|
-
cdef bool inf_flag = filtrations[-1] == np.inf
|
|
49
|
-
if inf_flag:
|
|
50
|
-
filtrations = filtrations[:-1]
|
|
51
|
-
filtrations, = mpg.compute_grid([filtrations],strategy=grid_strategy,resolution=resolution)
|
|
52
|
-
if inf_flag:
|
|
53
|
-
filtrations = np.concatenate([filtrations, [np.inf]])
|
|
54
|
-
degree_rips_st.grid_squeeze([filtrations]*degree_rips_st.num_parameters, inplace=True, coordinate_values=True)
|
|
55
|
-
degree_rips_st.filtration_grid = [filtrations, np.asarray(degrees)[::-1]]
|
|
56
|
-
degree_rips_st._is_function_simplextree=True
|
|
57
|
-
return degree_rips_st,max_degree
|
|
58
|
-
|
|
59
|
-
def function_rips_surface(st_multi, vector[indices_type] homological_degrees, bool mobius_inversion=True, bool zero_pad=False, indices_type n_jobs=0):
|
|
60
|
-
assert st_multi.is_squeezed, "Squeeze first !"
|
|
61
|
-
cdef intptr_t st_multi_ptr = st_multi.thisptr
|
|
62
|
-
cdef indices_type I = len(st_multi.filtration_grid[0])
|
|
63
|
-
cdef indices_type J = st_multi.num_parameters
|
|
64
|
-
container_shape = (homological_degrees.size(),I,J)
|
|
65
|
-
container_array = np.ascontiguousarray(np.zeros(container_shape, dtype=python_tensor_dtype).flatten())
|
|
66
|
-
assert len(container_array) < np.iinfo(np.uint32).max, "Too large container. Raise an issue on github if you encounter this issue. (Due to tensor's operator[])"
|
|
67
|
-
cdef tensor_dtype[::1] container = container_array
|
|
68
|
-
cdef tensor_dtype* container_ptr = &container[0]
|
|
69
|
-
with nogil:
|
|
70
|
-
compute_function_rips_surface_python(st_multi_ptr,container_ptr, homological_degrees, I,J, mobius_inversion, zero_pad, n_jobs)
|
|
71
|
-
filtration_grid = st_multi.filtration_grid
|
|
72
|
-
if filtration_grid[0][-1] == np.inf:
|
|
73
|
-
filtration_grid[0][-1] = filtration_grid[0][-2]
|
|
74
|
-
return filtration_grid, container_array.reshape(container_shape)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def function_rips_signed_measure(st_multi, vector[indices_type] homological_degrees, bool mobius_inversion=True, bool zero_pad=False, indices_type n_jobs=0, bool reconvert = True):
|
|
79
|
-
assert st_multi.is_squeezed
|
|
80
|
-
cdef intptr_t st_multi_ptr = st_multi.thisptr
|
|
81
|
-
cdef indices_type I = len(st_multi.filtration_grid[0])
|
|
82
|
-
cdef indices_type J = st_multi.num_parameters
|
|
83
|
-
container_shape = (homological_degrees.size(),I,J)
|
|
84
|
-
container_array = np.ascontiguousarray(np.zeros(container_shape, dtype=python_tensor_dtype).flatten())
|
|
85
|
-
assert len(container_array) < np.iinfo(np.uint32).max, "Too large container. Raise an issue on github if you encounter this issue. (Due to tensor's operator[])"
|
|
86
|
-
cdef tensor_dtype[::1] container = container_array
|
|
87
|
-
cdef tensor_dtype* container_ptr = &container[0]
|
|
88
|
-
cdef signed_measure_type out
|
|
89
|
-
# TODO nogil
|
|
90
|
-
with nogil:
|
|
91
|
-
out = compute_function_rips_signed_measure_python(st_multi_ptr,container_ptr, homological_degrees, I,J, mobius_inversion, zero_pad, n_jobs)
|
|
92
|
-
pts, weights = np.asarray(out.first, dtype=int).reshape(-1, 3), np.asarray(out.second, dtype=int)
|
|
93
|
-
|
|
94
|
-
degree_indices = [np.argwhere(pts[:,0] == degree_index).flatten() for degree_index, degree in enumerate(homological_degrees)] ## TODO : maybe optimize
|
|
95
|
-
sms = [(pts[id,1:],weights[id]) for id in degree_indices]
|
|
96
|
-
if not reconvert: return sms
|
|
97
|
-
|
|
98
|
-
grid_conversion = st_multi.filtration_grid
|
|
99
|
-
for degree_index,(pts,weights) in enumerate(sms):
|
|
100
|
-
coords = np.empty(shape=pts.shape, dtype=float)
|
|
101
|
-
for i in range(coords.shape[1]):
|
|
102
|
-
coords[:,i] = np.asarray(grid_conversion[i])[pts[:,i]]
|
|
103
|
-
sms[degree_index]=(coords, weights)
|
|
104
|
-
|
|
105
|
-
return sms
|
|
1
|
+
# cimport multipers.tensor as mt
|
|
2
|
+
from libc.stdint cimport intptr_t, uint16_t, uint32_t, int32_t
|
|
3
|
+
from libcpp.vector cimport vector
|
|
4
|
+
from libcpp cimport bool, int, float
|
|
5
|
+
from libcpp.utility cimport pair, tuple
|
|
6
|
+
from typing import Optional,Iterable,Callable
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
cimport numpy as cnp
|
|
10
|
+
cnp.import_array()
|
|
11
|
+
|
|
12
|
+
ctypedef double value_type
|
|
13
|
+
python_value_type=np.float64
|
|
14
|
+
|
|
15
|
+
ctypedef int32_t indices_type # uint fails for some reason
|
|
16
|
+
python_indices_type=np.int32
|
|
17
|
+
|
|
18
|
+
ctypedef int32_t tensor_dtype
|
|
19
|
+
python_tensor_dtype = np.int32
|
|
20
|
+
|
|
21
|
+
ctypedef pair[vector[vector[indices_type]], vector[tensor_dtype]] signed_measure_type
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
from multipers.simplex_tree_multi import SimplexTreeMulti_Ff64
|
|
25
|
+
from gudhi.simplex_tree import SimplexTree
|
|
26
|
+
|
|
27
|
+
cdef extern from "multi_parameter_rank_invariant/function_rips.h" namespace "Gudhi::multiparameter::function_rips":
|
|
28
|
+
void compute_function_rips_surface_python(const intptr_t, tensor_dtype* , const vector[indices_type], indices_type,indices_type, bool, bool, indices_type) except + nogil
|
|
29
|
+
signed_measure_type compute_function_rips_signed_measure_python(const intptr_t, tensor_dtype* , const vector[indices_type], indices_type,indices_type, bool, bool, indices_type) except + nogil
|
|
30
|
+
pair[vector[value_type],int] get_degree_rips_st_python(const intptr_t,const intptr_t, const vector[int]) except + nogil
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
import multipers.grids as mpg
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_degree_rips(st, vector[int] degrees, grid_strategy="exact", resolution=0):
|
|
38
|
+
assert isinstance(st,SimplexTree), "Input has to be a Gudhi simplextree for now."
|
|
39
|
+
assert st.dimension() == 1, "Simplextree has to be of dimension 1. You can use the `prune_above_dimension` method."
|
|
40
|
+
degree_rips_st = SimplexTreeMulti_Ff64(num_parameters=degrees.size())
|
|
41
|
+
cdef intptr_t simplextree_ptr = st.thisptr
|
|
42
|
+
cdef intptr_t st_multi_ptr = degree_rips_st.thisptr
|
|
43
|
+
cdef pair[vector[value_type],int] out
|
|
44
|
+
with nogil:
|
|
45
|
+
out = get_degree_rips_st_python(simplextree_ptr, st_multi_ptr, degrees)
|
|
46
|
+
filtrations = np.asarray(out.first)
|
|
47
|
+
cdef int max_degree = out.second
|
|
48
|
+
cdef bool inf_flag = filtrations[-1] == np.inf
|
|
49
|
+
if inf_flag:
|
|
50
|
+
filtrations = filtrations[:-1]
|
|
51
|
+
filtrations, = mpg.compute_grid([filtrations],strategy=grid_strategy,resolution=resolution)
|
|
52
|
+
if inf_flag:
|
|
53
|
+
filtrations = np.concatenate([filtrations, [np.inf]])
|
|
54
|
+
degree_rips_st.grid_squeeze([filtrations]*degree_rips_st.num_parameters, inplace=True, coordinate_values=True)
|
|
55
|
+
degree_rips_st.filtration_grid = [filtrations, np.asarray(degrees)[::-1]]
|
|
56
|
+
degree_rips_st._is_function_simplextree=True
|
|
57
|
+
return degree_rips_st,max_degree
|
|
58
|
+
|
|
59
|
+
def function_rips_surface(st_multi, vector[indices_type] homological_degrees, bool mobius_inversion=True, bool zero_pad=False, indices_type n_jobs=0):
|
|
60
|
+
assert st_multi.is_squeezed, "Squeeze first !"
|
|
61
|
+
cdef intptr_t st_multi_ptr = st_multi.thisptr
|
|
62
|
+
cdef indices_type I = len(st_multi.filtration_grid[0])
|
|
63
|
+
cdef indices_type J = st_multi.num_parameters
|
|
64
|
+
container_shape = (homological_degrees.size(),I,J)
|
|
65
|
+
container_array = np.ascontiguousarray(np.zeros(container_shape, dtype=python_tensor_dtype).flatten())
|
|
66
|
+
assert len(container_array) < np.iinfo(np.uint32).max, "Too large container. Raise an issue on github if you encounter this issue. (Due to tensor's operator[])"
|
|
67
|
+
cdef tensor_dtype[::1] container = container_array
|
|
68
|
+
cdef tensor_dtype* container_ptr = &container[0]
|
|
69
|
+
with nogil:
|
|
70
|
+
compute_function_rips_surface_python(st_multi_ptr,container_ptr, homological_degrees, I,J, mobius_inversion, zero_pad, n_jobs)
|
|
71
|
+
filtration_grid = st_multi.filtration_grid
|
|
72
|
+
if filtration_grid[0][-1] == np.inf:
|
|
73
|
+
filtration_grid[0][-1] = filtration_grid[0][-2]
|
|
74
|
+
return filtration_grid, container_array.reshape(container_shape)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def function_rips_signed_measure(st_multi, vector[indices_type] homological_degrees, bool mobius_inversion=True, bool zero_pad=False, indices_type n_jobs=0, bool reconvert = True):
|
|
79
|
+
assert st_multi.is_squeezed
|
|
80
|
+
cdef intptr_t st_multi_ptr = st_multi.thisptr
|
|
81
|
+
cdef indices_type I = len(st_multi.filtration_grid[0])
|
|
82
|
+
cdef indices_type J = st_multi.num_parameters
|
|
83
|
+
container_shape = (homological_degrees.size(),I,J)
|
|
84
|
+
container_array = np.ascontiguousarray(np.zeros(container_shape, dtype=python_tensor_dtype).flatten())
|
|
85
|
+
assert len(container_array) < np.iinfo(np.uint32).max, "Too large container. Raise an issue on github if you encounter this issue. (Due to tensor's operator[])"
|
|
86
|
+
cdef tensor_dtype[::1] container = container_array
|
|
87
|
+
cdef tensor_dtype* container_ptr = &container[0]
|
|
88
|
+
cdef signed_measure_type out
|
|
89
|
+
# TODO nogil
|
|
90
|
+
with nogil:
|
|
91
|
+
out = compute_function_rips_signed_measure_python(st_multi_ptr,container_ptr, homological_degrees, I,J, mobius_inversion, zero_pad, n_jobs)
|
|
92
|
+
pts, weights = np.asarray(out.first, dtype=int).reshape(-1, 3), np.asarray(out.second, dtype=int)
|
|
93
|
+
|
|
94
|
+
degree_indices = [np.argwhere(pts[:,0] == degree_index).flatten() for degree_index, degree in enumerate(homological_degrees)] ## TODO : maybe optimize
|
|
95
|
+
sms = [(pts[id,1:],weights[id]) for id in degree_indices]
|
|
96
|
+
if not reconvert: return sms
|
|
97
|
+
|
|
98
|
+
grid_conversion = st_multi.filtration_grid
|
|
99
|
+
for degree_index,(pts,weights) in enumerate(sms):
|
|
100
|
+
coords = np.empty(shape=pts.shape, dtype=float)
|
|
101
|
+
for i in range(coords.shape[1]):
|
|
102
|
+
coords[:,i] = np.asarray(grid_conversion[i])[pts[:,i]]
|
|
103
|
+
sms[degree_index]=(coords, weights)
|
|
104
|
+
|
|
105
|
+
return sms
|
|
Binary file
|