multipers 2.4.0b1__cp312-cp312-macosx_11_0_arm64.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.
- multipers/.dylibs/libboost_timer.dylib +0 -0
- multipers/.dylibs/libc++.1.0.dylib +0 -0
- multipers/.dylibs/libtbb.12.17.dylib +0 -0
- multipers/__init__.py +33 -0
- multipers/_signed_measure_meta.py +426 -0
- multipers/_slicer_meta.py +231 -0
- multipers/array_api/__init__.py +62 -0
- multipers/array_api/numpy.py +124 -0
- multipers/array_api/torch.py +133 -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 +736 -0
- multipers/filtration_conversions.pxd.tp +226 -0
- multipers/filtrations/__init__.py +21 -0
- multipers/filtrations/density.py +529 -0
- multipers/filtrations/filtrations.py +480 -0
- multipers/filtrations.pxd +534 -0
- multipers/filtrations.pxd.tp +332 -0
- multipers/function_rips.cpython-312-darwin.so +0 -0
- multipers/function_rips.pyx +104 -0
- multipers/grids.cpython-312-darwin.so +0 -0
- multipers/grids.pyx +538 -0
- multipers/gudhi/Persistence_slices_interface.h +213 -0
- multipers/gudhi/Simplex_tree_interface.h +274 -0
- multipers/gudhi/Simplex_tree_multi_interface.h +648 -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 +52 -0
- multipers/gudhi/gudhi/Degree_rips_bifiltration.h +2307 -0
- multipers/gudhi/gudhi/Dynamic_multi_parameter_filtration.h +2524 -0
- multipers/gudhi/gudhi/Fields/Multi_field.h +453 -0
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +460 -0
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +444 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +584 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +490 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +580 -0
- multipers/gudhi/gudhi/Fields/Z2_field.h +391 -0
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +389 -0
- multipers/gudhi/gudhi/Fields/Zp_field.h +493 -0
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +384 -0
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +492 -0
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
- multipers/gudhi/gudhi/Matrix.h +2200 -0
- multipers/gudhi/gudhi/Multi_filtration/Multi_parameter_generator.h +1712 -0
- multipers/gudhi/gudhi/Multi_filtration/multi_filtration_conversions.h +237 -0
- multipers/gudhi/gudhi/Multi_filtration/multi_filtration_utils.h +225 -0
- multipers/gudhi/gudhi/Multi_parameter_filtered_complex.h +485 -0
- multipers/gudhi/gudhi/Multi_parameter_filtration.h +2643 -0
- multipers/gudhi/gudhi/Multi_persistence/Box.h +233 -0
- multipers/gudhi/gudhi/Multi_persistence/Line.h +309 -0
- multipers/gudhi/gudhi/Multi_persistence/Multi_parameter_filtered_complex_pcoh_interface.h +268 -0
- multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_cohomology.h +159 -0
- multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_matrix.h +463 -0
- multipers/gudhi/gudhi/Multi_persistence/Point.h +853 -0
- multipers/gudhi/gudhi/Off_reader.h +173 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +834 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +838 -0
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +833 -0
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1367 -0
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1157 -0
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +869 -0
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +905 -0
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +122 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +260 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +288 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +170 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +247 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +571 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +182 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +130 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +235 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +312 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1092 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +923 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +914 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +930 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1071 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +203 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +886 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +984 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1213 -0
- multipers/gudhi/gudhi/Persistence_matrix/index_mapper.h +58 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +227 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +200 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +166 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +319 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +562 -0
- multipers/gudhi/gudhi/Persistence_on_a_line.h +152 -0
- multipers/gudhi/gudhi/Persistence_on_rectangle.h +617 -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 +769 -0
- multipers/gudhi/gudhi/Points_off_io.h +171 -0
- multipers/gudhi/gudhi/Projective_cover_kernel.h +379 -0
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +559 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +121 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
- multipers/gudhi/gudhi/Simplex_tree/filtration_value_utils.h +155 -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 +60 -0
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +105 -0
- multipers/gudhi/gudhi/Simplex_tree.h +3170 -0
- multipers/gudhi/gudhi/Slicer.h +848 -0
- multipers/gudhi/gudhi/Thread_safe_slicer.h +393 -0
- multipers/gudhi/gudhi/distance_functions.h +62 -0
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
- multipers/gudhi/gudhi/multi_simplex_tree_helpers.h +147 -0
- multipers/gudhi/gudhi/persistence_interval.h +263 -0
- multipers/gudhi/gudhi/persistence_matrix_options.h +188 -0
- multipers/gudhi/gudhi/reader_utils.h +367 -0
- multipers/gudhi/gudhi/simple_mdspan.h +484 -0
- multipers/gudhi/gudhi/slicer_helpers.h +779 -0
- multipers/gudhi/tmp_h0_pers/mma_interface_h0.h +223 -0
- multipers/gudhi/tmp_h0_pers/naive_merge_tree.h +536 -0
- multipers/io.cpython-312-darwin.so +0 -0
- multipers/io.pyx +472 -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 +1667 -0
- multipers/ml/sliced_wasserstein.py +461 -0
- multipers/ml/tools.py +113 -0
- multipers/mma_structures.cpython-312-darwin.so +0 -0
- multipers/mma_structures.pxd +134 -0
- multipers/mma_structures.pyx +1483 -0
- multipers/mma_structures.pyx.tp +1126 -0
- multipers/multi_parameter_rank_invariant/diff_helpers.h +85 -0
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +95 -0
- multipers/multi_parameter_rank_invariant/function_rips.h +317 -0
- multipers/multi_parameter_rank_invariant/hilbert_function.h +761 -0
- multipers/multi_parameter_rank_invariant/persistence_slices.h +149 -0
- multipers/multi_parameter_rank_invariant/rank_invariant.h +350 -0
- multipers/multiparameter_edge_collapse.py +41 -0
- multipers/multiparameter_module_approximation/approximation.h +2541 -0
- multipers/multiparameter_module_approximation/debug.h +107 -0
- multipers/multiparameter_module_approximation/format_python-cpp.h +292 -0
- multipers/multiparameter_module_approximation/utilities.h +428 -0
- multipers/multiparameter_module_approximation.cpython-312-darwin.so +0 -0
- multipers/multiparameter_module_approximation.pyx +286 -0
- multipers/ops.cpython-312-darwin.so +0 -0
- multipers/ops.pyx +231 -0
- multipers/pickle.py +89 -0
- multipers/plots.py +550 -0
- multipers/point_measure.cpython-312-darwin.so +0 -0
- multipers/point_measure.pyx +409 -0
- multipers/simplex_tree_multi.cpython-312-darwin.so +0 -0
- multipers/simplex_tree_multi.pxd +136 -0
- multipers/simplex_tree_multi.pyx +11719 -0
- multipers/simplex_tree_multi.pyx.tp +2102 -0
- multipers/slicer.cpython-312-darwin.so +0 -0
- multipers/slicer.pxd +2097 -0
- multipers/slicer.pxd.tp +263 -0
- multipers/slicer.pyx +13042 -0
- multipers/slicer.pyx.tp +1259 -0
- multipers/tensor/tensor.h +672 -0
- multipers/tensor.pxd +13 -0
- multipers/test.pyx +44 -0
- multipers/tests/__init__.py +70 -0
- multipers/torch/__init__.py +1 -0
- multipers/torch/diff_grids.py +240 -0
- multipers/torch/rips_density.py +310 -0
- multipers/vector_interface.pxd +46 -0
- multipers-2.4.0b1.dist-info/METADATA +131 -0
- multipers-2.4.0b1.dist-info/RECORD +184 -0
- multipers-2.4.0b1.dist-info/WHEEL +6 -0
- multipers-2.4.0b1.dist-info/licenses/LICENSE +21 -0
- multipers-2.4.0b1.dist-info/top_level.txt +1 -0
multipers/ml/kernels.py
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from sklearn.base import BaseEstimator, TransformerMixin, clone
|
|
2
|
+
import numpy as np
|
|
3
|
+
from typing import Iterable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# To do k folds with a distance matrix, we need to slice it into list of distances.
|
|
7
|
+
# k-fold usually shuffles the lists, so we need to add an identifier to each entry,
|
|
8
|
+
#
|
|
9
|
+
class DistanceMatrix2DistanceList(BaseEstimator, TransformerMixin):
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
super().__init__()
|
|
12
|
+
|
|
13
|
+
def fit(self, X, y=None):
|
|
14
|
+
return self
|
|
15
|
+
|
|
16
|
+
def transform(self, X):
|
|
17
|
+
X = np.asarray(X)
|
|
18
|
+
assert X.ndim == 2 # Its a matrix
|
|
19
|
+
return np.asarray([[i, *distance_to_pt] for i, distance_to_pt in enumerate(X)])
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DistanceList2DistanceMatrix(BaseEstimator, TransformerMixin):
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
super().__init__()
|
|
25
|
+
|
|
26
|
+
def fit(self, X, y=None):
|
|
27
|
+
return self
|
|
28
|
+
|
|
29
|
+
def transform(self, X):
|
|
30
|
+
index_list = (
|
|
31
|
+
np.asarray(X[:, 0], dtype=int) + 1
|
|
32
|
+
) # shift of 1, because the first index is for indexing the pts
|
|
33
|
+
return X[:, index_list] # The distance matrix of the index_list
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class DistanceMatrices2DistancesList(BaseEstimator, TransformerMixin):
|
|
37
|
+
"""
|
|
38
|
+
Input (degree) x (distance matrix) or (axis) x (degree) x (distance matrix D)
|
|
39
|
+
Output _ (D1) x opt (axis) x (degree) x (D2, , with indices first)
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self) -> None:
|
|
43
|
+
super().__init__()
|
|
44
|
+
self._axes = None
|
|
45
|
+
|
|
46
|
+
def fit(self, X, y=None):
|
|
47
|
+
X = np.asarray(X)
|
|
48
|
+
self._axes = X.ndim == 4
|
|
49
|
+
assert (
|
|
50
|
+
self._axes or X.ndim == 3
|
|
51
|
+
), " Bad input shape. Input is either (degree) x (distance matrix) or (axis) x (degree) x (distance matrix) "
|
|
52
|
+
|
|
53
|
+
return self
|
|
54
|
+
|
|
55
|
+
def transform(self, X):
|
|
56
|
+
X = np.asarray(X)
|
|
57
|
+
assert (X.ndim == 3 and not self._axes) or (
|
|
58
|
+
X.ndim == 4 and self._axes
|
|
59
|
+
), f"X shape ({X.shape}) is not valid"
|
|
60
|
+
if self._axes:
|
|
61
|
+
out = np.asarray(
|
|
62
|
+
[
|
|
63
|
+
[
|
|
64
|
+
DistanceMatrix2DistanceList().fit_transform(M)
|
|
65
|
+
for M in matrices_in_axes
|
|
66
|
+
]
|
|
67
|
+
for matrices_in_axes in X
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
return np.moveaxis(out, [2, 0, 1, 3], [0, 1, 2, 3])
|
|
71
|
+
else:
|
|
72
|
+
out = np.array(
|
|
73
|
+
[DistanceMatrix2DistanceList().fit_transform(M) for M in X]
|
|
74
|
+
) # indices are at [:,0,Any_coord]
|
|
75
|
+
# return np.moveaxis(out, 0, -1) ## indices are at [:,0,any_coord], degree axis is the last
|
|
76
|
+
return np.moveaxis(out, [1, 0, 2], [0, 1, 2])
|
|
77
|
+
|
|
78
|
+
def predict(self, X):
|
|
79
|
+
return self.transform(X)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class DistancesLists2DistanceMatrices(BaseEstimator, TransformerMixin):
|
|
83
|
+
"""
|
|
84
|
+
Input (D1) x opt (axis) x (degree) x (D2 with indices first)
|
|
85
|
+
Output opt (axis) x (degree) x (distance matrix (D1,D2))
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def __init__(self) -> None:
|
|
89
|
+
super().__init__()
|
|
90
|
+
self.train_indices = None
|
|
91
|
+
self._axes = None
|
|
92
|
+
|
|
93
|
+
def fit(self, X: np.ndarray, y=None):
|
|
94
|
+
X = np.asarray(X)
|
|
95
|
+
assert X.ndim in [3, 4]
|
|
96
|
+
self._axes = X.ndim == 4
|
|
97
|
+
if self._axes:
|
|
98
|
+
self.train_indices = np.asarray(X[:, 0, 0, 0], dtype=int)
|
|
99
|
+
else:
|
|
100
|
+
self.train_indices = np.asarray(X[:, 0, 0], dtype=int)
|
|
101
|
+
return self
|
|
102
|
+
|
|
103
|
+
def transform(self, X):
|
|
104
|
+
X = np.asarray(X)
|
|
105
|
+
assert X.ndim in [3, 4]
|
|
106
|
+
# test_indices = np.asarray(X[:,0,0], dtype=int)
|
|
107
|
+
# print(X.shape, self.train_indices, test_indices, flush=1)
|
|
108
|
+
# First coord of X is test indices by design, train indices have to be selected in the second coord, last one is the degree
|
|
109
|
+
if self._axes:
|
|
110
|
+
Y = X[:, :, :, self.train_indices + 1]
|
|
111
|
+
return np.moveaxis(Y, [0, 1, 2, 3], [2, 0, 1, 3])
|
|
112
|
+
else:
|
|
113
|
+
Y = X[
|
|
114
|
+
:, :, self.train_indices + 1
|
|
115
|
+
] # we only keep the good indices # shift of 1, because the first index is for indexing the pts
|
|
116
|
+
return np.moveaxis(
|
|
117
|
+
Y, [0, 1, 2], [1, 0, 2]
|
|
118
|
+
) # we put back the degree axis first
|
|
119
|
+
|
|
120
|
+
# # out = np.moveaxis(Y,-1,0) ## we put back the degree axis first
|
|
121
|
+
# return out
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class DistanceMatrix2Kernel(BaseEstimator, TransformerMixin):
|
|
125
|
+
"""
|
|
126
|
+
Input : (degree) x (distance matrix) or (axis) x (degree) x (distance matrix) in the second case, axis HAS to be specified (meant for cross validation)
|
|
127
|
+
Output : kernel of the same shape of distance matrix
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
def __init__(
|
|
131
|
+
self,
|
|
132
|
+
sigma: float | Iterable[float] = 1,
|
|
133
|
+
axis: int | None = None,
|
|
134
|
+
weights: Iterable[float] | float = 1,
|
|
135
|
+
) -> None:
|
|
136
|
+
super().__init__()
|
|
137
|
+
self.sigma = sigma
|
|
138
|
+
self.axis = axis
|
|
139
|
+
self.weights = weights
|
|
140
|
+
# self._num_axes=None
|
|
141
|
+
self._num_degrees = None
|
|
142
|
+
|
|
143
|
+
def fit(self, X, y=None):
|
|
144
|
+
if len(X) == 0:
|
|
145
|
+
return self
|
|
146
|
+
assert X.ndim in [3, 4], "Bad input."
|
|
147
|
+
if self.axis is None:
|
|
148
|
+
assert X.ndim == 3 or X.shape[0] == 1, "Set an axis for data with axis !"
|
|
149
|
+
if X.shape[0] == 1 and X.ndim == 4:
|
|
150
|
+
self.axis = 0
|
|
151
|
+
self._num_degrees = len(X[0])
|
|
152
|
+
else:
|
|
153
|
+
self._num_degrees = len(X)
|
|
154
|
+
else:
|
|
155
|
+
assert X.ndim == 4, "Cannot choose axis from data with no axis !"
|
|
156
|
+
self._num_degrees = len(X[self.axis])
|
|
157
|
+
if isinstance(self.weights, float) or isinstance(self.weights, int):
|
|
158
|
+
self.weights = [self.weights] * self._num_degrees
|
|
159
|
+
assert (
|
|
160
|
+
len(self.weights) == self._num_degrees
|
|
161
|
+
), f"Number of weights ({len(self.weights)}) has to be the same as the number of degrees ({self._num_degrees})"
|
|
162
|
+
return self
|
|
163
|
+
|
|
164
|
+
def transform(self, X) -> np.ndarray:
|
|
165
|
+
if self.axis is not None:
|
|
166
|
+
X = X[self.axis]
|
|
167
|
+
# TODO : pykeops, and full pipeline w/ pykeops
|
|
168
|
+
kernels = np.asarray(
|
|
169
|
+
[
|
|
170
|
+
np.exp(-distance_matrix / (2 * self.sigma**2)) * weight
|
|
171
|
+
for distance_matrix, weight in zip(X, self.weights)
|
|
172
|
+
]
|
|
173
|
+
)
|
|
174
|
+
out = np.mean(kernels, axis=0)
|
|
175
|
+
|
|
176
|
+
return out
|