summaryrefslogtreecommitdiff
path: root/src/python/gudhi
diff options
context:
space:
mode:
authorMathieuCarriere <mathieu.carriere3@gmail.com>2022-06-07 10:47:40 +0200
committerMathieuCarriere <mathieu.carriere3@gmail.com>2022-06-07 10:47:40 +0200
commitc3199271e3e6cff0ae4e134c0409c9bb604fa1be (patch)
treebfa52a6567c14a018fda58cc4edcfdd74ba8d395 /src/python/gudhi
parent49a3d91048f85dc080da520a527497cd2426d2e8 (diff)
fix doc + added homology field coeff
Diffstat (limited to 'src/python/gudhi')
-rw-r--r--src/python/gudhi/tensorflow/cubical_layer.py10
-rw-r--r--src/python/gudhi/tensorflow/lower_star_simplex_tree_layer.py15
-rw-r--r--src/python/gudhi/tensorflow/rips_layer.py10
3 files changed, 21 insertions, 14 deletions
diff --git a/src/python/gudhi/tensorflow/cubical_layer.py b/src/python/gudhi/tensorflow/cubical_layer.py
index 918ff43e..16dc7d35 100644
--- a/src/python/gudhi/tensorflow/cubical_layer.py
+++ b/src/python/gudhi/tensorflow/cubical_layer.py
@@ -8,7 +8,7 @@ from ..cubical_complex import CubicalComplex
# The parameters of the model are the pixel values.
-def _Cubical(Xflat, Xdim, dimensions):
+def _Cubical(Xflat, Xdim, dimensions, homology_coeff_field=11):
# Parameters: Xflat (flattened image),
# Xdim (shape of non-flattened image)
# dimensions (homology dimensions)
@@ -16,7 +16,7 @@ def _Cubical(Xflat, Xdim, dimensions):
# Compute the persistence pairs with Gudhi
# We reverse the dimensions because CubicalComplex uses Fortran ordering
cc = CubicalComplex(dimensions=Xdim[::-1], top_dimensional_cells=Xflat)
- cc.compute_persistence()
+ cc.compute_persistence(homology_coeff_field=homology_coeff_field)
# Retrieve and ouput image indices/pixels corresponding to positive and negative simplices
cof_pp = cc.cofaces_of_persistence_pairs()
@@ -37,17 +37,19 @@ class CubicalLayer(tf.keras.layers.Layer):
"""
TensorFlow layer for computing the persistent homology of a cubical complex
"""
- def __init__(self, dimensions, min_persistence=None, **kwargs):
+ def __init__(self, dimensions, min_persistence=None, homology_coeff_field=11, **kwargs):
"""
Constructor for the CubicalLayer class
Parameters:
dimensions (List[int]): homology dimensions
min_persistence (List[float]): minimum distance-to-diagonal of the points in the output persistence diagrams (default None, in which case 0. is used for all dimensions)
+ homology_coeff_field (int): homology field coefficient. Must be a prime number. Default value is 11. Max is 46337.
"""
super().__init__(dynamic=True, **kwargs)
self.dimensions = dimensions
self.min_persistence = min_persistence if min_persistence != None else [0.] * len(self.dimensions)
+ self.hcf = homology_coeff_field
assert len(self.min_persistence) == len(self.dimensions)
def call(self, X):
@@ -64,7 +66,7 @@ class CubicalLayer(tf.keras.layers.Layer):
# Don't compute gradient for this operation
Xflat = tf.reshape(X, [-1])
Xdim, Xflat_numpy = X.shape, Xflat.numpy()
- indices_list = _Cubical(Xflat_numpy, Xdim, self.dimensions)
+ indices_list = _Cubical(Xflat_numpy, Xdim, self.dimensions, self.hcf)
index_essential = np.argmin(Xflat_numpy) # index of minimum pixel value for essential persistence diagram
# Get persistence diagram by simply picking the corresponding entries in the image
self.dgms = []
diff --git a/src/python/gudhi/tensorflow/lower_star_simplex_tree_layer.py b/src/python/gudhi/tensorflow/lower_star_simplex_tree_layer.py
index 5606d1a4..e0a5b457 100644
--- a/src/python/gudhi/tensorflow/lower_star_simplex_tree_layer.py
+++ b/src/python/gudhi/tensorflow/lower_star_simplex_tree_layer.py
@@ -7,10 +7,11 @@ import tensorflow as tf
# The parameters of the model are the vertex function values of the simplex tree.
-def _LowerStarSimplexTree(simplextree, filtration, dimensions):
+def _LowerStarSimplexTree(simplextree, filtration, dimensions, homology_coeff_field=11):
# Parameters: simplextree (simplex tree on which to compute persistence)
# filtration (function values on the vertices of st),
# dimensions (homology dimensions),
+ # homology_coeff_field (homology field coefficient)
simplextree.reset_filtration(-np.inf, 0)
@@ -20,7 +21,7 @@ def _LowerStarSimplexTree(simplextree, filtration, dimensions):
simplextree.make_filtration_non_decreasing()
# Compute persistence diagram
- simplextree.compute_persistence()
+ simplextree.compute_persistence(homology_coeff_field=homology_coeff_field)
# Get vertex pairs for optimization. First, get all simplex pairs
pairs = simplextree.lower_star_persistence_generators()
@@ -42,19 +43,21 @@ class LowerStarSimplexTreeLayer(tf.keras.layers.Layer):
"""
TensorFlow layer for computing lower-star persistence out of a simplex tree
"""
- def __init__(self, simplextree, dimensions, min_persistence=None, **kwargs):
+ def __init__(self, simplextree, dimensions, min_persistence=None, homology_coeff_field=11, **kwargs):
"""
Constructor for the LowerStarSimplexTreeLayer class
Parameters:
- simplextree (gudhi.SimplexTree): underlying simplex tree. Its vertices MUST be named with integers from 0 to n = number of vertices. Note that its filtration values are modified in each call of the class.
+ simplextree (gudhi.SimplexTree): underlying simplex tree. Its vertices MUST be named with integers from 0 to n-1, where n is its number of vertices. Note that its filtration values are modified in each call of the class.
dimensions (List[int]): homology dimensions
min_persistence (List[float]): minimum distance-to-diagonal of the points in the output persistence diagrams (default None, in which case 0. is used for all dimensions)
+ homology_coeff_field (int): homology field coefficient. Must be a prime number. Default value is 11. Max is 46337.
"""
super().__init__(dynamic=True, **kwargs)
self.dimensions = dimensions
self.simplextree = simplextree
- self.min_persistence = min_persistence if min_persistence != None else [0. for _ in range(len(self.dimensions))]
+ self.min_persistence = min_persistence if min_persistence != None else [0. for _ in range(len(self.dimensions))]
+ self.hcf = homology_coeff_field
assert len(self.min_persistence) == len(self.dimensions)
def call(self, filtration):
@@ -68,7 +71,7 @@ class LowerStarSimplexTreeLayer(tf.keras.layers.Layer):
List[Tuple[tf.Tensor,tf.Tensor]]: List of lower-star persistence diagrams. The length of this list is the same than that of dimensions, i.e., there is one persistence diagram per homology dimension provided in the input list dimensions. Moreover, the finite and essential parts of the persistence diagrams are provided separately: each element of this list is a tuple of size two that contains the finite and essential parts of the corresponding persistence diagram, of shapes [num_finite_points, 2] and [num_essential_points, 1] respectively
"""
# Don't try to compute gradients for the vertex pairs
- indices = _LowerStarSimplexTree(self.simplextree, filtration.numpy(), self.dimensions)
+ indices = _LowerStarSimplexTree(self.simplextree, filtration.numpy(), self.dimensions, self.hcf)
# Get persistence diagrams
self.dgms = []
for idx_dim, dimension in enumerate(self.dimensions):
diff --git a/src/python/gudhi/tensorflow/rips_layer.py b/src/python/gudhi/tensorflow/rips_layer.py
index 97c2692d..e4d6d4c6 100644
--- a/src/python/gudhi/tensorflow/rips_layer.py
+++ b/src/python/gudhi/tensorflow/rips_layer.py
@@ -8,7 +8,7 @@ from ..rips_complex import RipsComplex
# The parameters of the model are the point coordinates.
-def _Rips(DX, max_edge, dimensions):
+def _Rips(DX, max_edge, dimensions, homology_coeff_field=11):
# Parameters: DX (distance matrix),
# max_edge (maximum edge length for Rips filtration),
# dimensions (homology dimensions)
@@ -16,7 +16,7 @@ def _Rips(DX, max_edge, dimensions):
# Compute the persistence pairs with Gudhi
rc = RipsComplex(distance_matrix=DX, max_edge_length=max_edge)
st = rc.create_simplex_tree(max_dimension=max(dimensions)+1)
- st.compute_persistence()
+ st.compute_persistence(homology_coeff_field=homology_coeff_field)
pairs = st.flag_persistence_generators()
L_indices = []
@@ -40,7 +40,7 @@ class RipsLayer(tf.keras.layers.Layer):
"""
TensorFlow layer for computing Rips persistence out of a point cloud
"""
- def __init__(self, dimensions, maximum_edge_length=np.inf, min_persistence=None, **kwargs):
+ def __init__(self, dimensions, maximum_edge_length=np.inf, min_persistence=None, homology_coeff_field=11, **kwargs):
"""
Constructor for the RipsLayer class
@@ -48,11 +48,13 @@ class RipsLayer(tf.keras.layers.Layer):
maximum_edge_length (float): maximum edge length for the Rips complex
dimensions (List[int]): homology dimensions
min_persistence (List[float]): minimum distance-to-diagonal of the points in the output persistence diagrams (default None, in which case 0. is used for all dimensions)
+ homology_coeff_field (int): homology field coefficient. Must be a prime number. Default value is 11. Max is 46337.
"""
super().__init__(dynamic=True, **kwargs)
self.max_edge = maximum_edge_length
self.dimensions = dimensions
self.min_persistence = min_persistence if min_persistence != None else [0. for _ in range(len(self.dimensions))]
+ self.hcf = homology_coeff_field
assert len(self.min_persistence) == len(self.dimensions)
def call(self, X):
@@ -69,7 +71,7 @@ class RipsLayer(tf.keras.layers.Layer):
DX = tf.norm(tf.expand_dims(X, 1)-tf.expand_dims(X, 0), axis=2)
# Compute vertices associated to positive and negative simplices
# Don't compute gradient for this operation
- indices = _Rips(DX.numpy(), self.max_edge, self.dimensions)
+ indices = _Rips(DX.numpy(), self.max_edge, self.dimensions, self.hcf)
# Get persistence diagrams by simply picking the corresponding entries in the distance matrix
self.dgms = []
for idx_dim, dimension in enumerate(self.dimensions):