summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathieu <mathieu.carriere3@gmail.com>2020-03-10 19:13:37 -0400
committermathieu <mathieu.carriere3@gmail.com>2020-03-10 19:13:37 -0400
commit5a737eefc7abd690e8a174d2557d0157e77f5f4c (patch)
tree3f486a990033b4acfc4d9f51ced87c604ad0811a
parentfe754ca20cf942e2af186f14e5a3d24e23b6c80e (diff)
new fixes
-rw-r--r--src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h1
-rw-r--r--src/python/gudhi/cubical_complex.pyx32
-rw-r--r--src/python/gudhi/periodic_cubical_complex.pyx28
-rw-r--r--src/python/gudhi/simplex_tree.pyx2
-rw-r--r--src/python/include/Persistent_cohomology_interface.h3
-rwxr-xr-xsrc/python/test/test_cubical_complex.py5
6 files changed, 52 insertions, 19 deletions
diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h
index bf09532e..37514dee 100644
--- a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h
+++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h
@@ -340,7 +340,6 @@ class Bitmap_cubical_complex : public T {
* that provides ranges for the Boundary_simplex_iterator.
**/
Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) { return this->get_boundary_of_a_cell(sh); }
- Boundary_simplex_range coboundary_simplex_range(Simplex_handle sh) { return this->get_coboundary_of_a_cell(sh); }
/**
* filtration_simplex_range creates an object of a Filtration_simplex_range class
diff --git a/src/python/gudhi/cubical_complex.pyx b/src/python/gudhi/cubical_complex.pyx
index 8cf43539..9e701fe6 100644
--- a/src/python/gudhi/cubical_complex.pyx
+++ b/src/python/gudhi/cubical_complex.pyx
@@ -148,22 +148,22 @@ cdef class CubicalComplex:
def cofaces_of_persistence_pairs(self):
"""A persistence interval is described by a pair of cells, one that creates the
- feature and one that kills it. The filtration values of those 2 cells give coordinates
- for a point in a persistence diagram, or a bar in a barcode. Structurally, in the
- cubical complexes provided here, the filtration value of any cell is the minimum of the
- filtration values of the maximal cells that contain it. Connecting persistence diagram
- coordinates to the corresponding value in the input (i.e. the filtration values of
- the top-dimensional cells) is useful for differentiation purposes.
-
- This function returns a list of pairs of top-dimensional cells corresponding to
- the persistence birth and death cells of the filtration. The cells are represented by
- their indices in the input list of top-dimensional cells (and not their indices in the
- internal datastructure that includes non-maximal cells). Note that when two adjacent
- top-dimensional cells have the same filtration value, we arbitrarily return one of the two
- when calling the function on one of their common faces.
-
- :returns: The top-dimensional cells/cofaces of the positive and negative cells.
- :rtype: list of pairs(index of positive top-dimensional cell, index of negative top-dimensional cell)
+ feature and one that kills it. The filtration values of those 2 cells give coordinates
+ for a point in a persistence diagram, or a bar in a barcode. Structurally, in the
+ cubical complexes provided here, the filtration value of any cell is the minimum of the
+ filtration values of the maximal cells that contain it. Connecting persistence diagram
+ coordinates to the corresponding value in the input (i.e. the filtration values of
+ the top-dimensional cells) is useful for differentiation purposes.
+
+ This function returns a list of pairs of top-dimensional cells corresponding to
+ the persistence birth and death cells of the filtration. The cells are represented by
+ their indices in the input list of top-dimensional cells (and not their indices in the
+ internal datastructure that includes non-maximal cells). Note that when two adjacent
+ top-dimensional cells have the same filtration value, we arbitrarily return one of the two
+ when calling the function on one of their common faces.
+
+ :returns: The top-dimensional cells/cofaces of the positive and negative cells, together with the corresponding homological dimension.
+ :rtype: numpy array of integers of shape [number_of_persistence_points, 3], the integers of eah row being: (homological dimension, index of positive top-dimensional cell, index of negative top-dimensional cell). If the homological feature is essential, i.e., if the death time is +infinity, then the index of the corresponding negative top-dimensional cell is -1.
"""
cdef vector[vector[int]] persistence_result
if self.pcohptr != NULL:
diff --git a/src/python/gudhi/periodic_cubical_complex.pyx b/src/python/gudhi/periodic_cubical_complex.pyx
index 37f76201..ba039e80 100644
--- a/src/python/gudhi/periodic_cubical_complex.pyx
+++ b/src/python/gudhi/periodic_cubical_complex.pyx
@@ -31,6 +31,7 @@ cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi":
cdef cppclass Periodic_cubical_complex_persistence_interface "Gudhi::Persistent_cohomology_interface<Gudhi::Cubical_complex::Cubical_complex_interface<Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double>>>":
Periodic_cubical_complex_persistence_interface(Periodic_cubical_complex_base_interface * st, bool persistence_dim_max)
vector[pair[int, pair[double, double]]] get_persistence(int homology_coeff_field, double min_persistence)
+ vector[vector[int]] cofaces_of_cubical_persistence_pairs()
vector[int] betti_numbers()
vector[int] persistent_betti_numbers(double from_value, double to_value)
vector[pair[double,double]] intervals_in_dimension(int dimension)
@@ -155,6 +156,33 @@ cdef class PeriodicCubicalComplex:
persistence_result = self.pcohptr.get_persistence(homology_coeff_field, min_persistence)
return persistence_result
+ def cofaces_of_persistence_pairs(self):
+ """A persistence interval is described by a pair of cells, one that creates the
+ feature and one that kills it. The filtration values of those 2 cells give coordinates
+ for a point in a persistence diagram, or a bar in a barcode. Structurally, in the
+ cubical complexes provided here, the filtration value of any cell is the minimum of the
+ filtration values of the maximal cells that contain it. Connecting persistence diagram
+ coordinates to the corresponding value in the input (i.e. the filtration values of
+ the top-dimensional cells) is useful for differentiation purposes.
+
+ This function returns a list of pairs of top-dimensional cells corresponding to
+ the persistence birth and death cells of the filtration. The cells are represented by
+ their indices in the input list of top-dimensional cells (and not their indices in the
+ internal datastructure that includes non-maximal cells). Note that when two adjacent
+ top-dimensional cells have the same filtration value, we arbitrarily return one of the two
+ when calling the function on one of their common faces.
+
+ :returns: The top-dimensional cells/cofaces of the positive and negative cells, together with the corresponding homological dimension.
+ :rtype: numpy array of integers of shape [number_of_persistence_points, 3], the integers of eah row being: (homological dimension, index of positive top-dimensional cell, index of negative top-dimensional cell). If the homological feature is essential, i.e., if the death time is +infinity, then the index of the corresponding negative top-dimensional cell is -1.
+ """
+ cdef vector[vector[int]] persistence_result
+ if self.pcohptr != NULL:
+ persistence_result = self.pcohptr.cofaces_of_cubical_persistence_pairs()
+ else:
+ print("cofaces_of_persistence_pairs function requires persistence function"
+ " to be launched first.")
+ return np.array(persistence_result)
+
def betti_numbers(self):
"""This function returns the Betti numbers of the complex.
diff --git a/src/python/gudhi/simplex_tree.pyx b/src/python/gudhi/simplex_tree.pyx
index 85d25492..b18627c4 100644
--- a/src/python/gudhi/simplex_tree.pyx
+++ b/src/python/gudhi/simplex_tree.pyx
@@ -508,7 +508,7 @@ cdef class SimplexTree:
"""
if self.pcohptr != NULL:
if persistence_file != '':
- self.pcohptr.write_output_diagram(str.encode(persistence_file))
+ self.pcohptr.write_output_diagram(persistence_file.encode('utf-8'))
else:
print("persistence_file must be specified")
else:
diff --git a/src/python/include/Persistent_cohomology_interface.h b/src/python/include/Persistent_cohomology_interface.h
index e5accf50..defac88c 100644
--- a/src/python/include/Persistent_cohomology_interface.h
+++ b/src/python/include/Persistent_cohomology_interface.h
@@ -75,12 +75,13 @@ persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomol
int top_dimensional_coface(int splx){
if (stptr_->dimension(splx) == stptr_->dimension()){return splx;}
else{
- for (auto v : stptr_->coboundary_simplex_range(splx)){
+ for (auto v : stptr_->get_coboundary_of_a_cell(splx)){
if(stptr_->filtration(v) == stptr_->filtration(splx)){
return top_dimensional_coface(v);
}
}
}
+ return splx;
}
std::vector<std::vector<int>> cofaces_of_cubical_persistence_pairs() {
diff --git a/src/python/test/test_cubical_complex.py b/src/python/test/test_cubical_complex.py
index 8c1b2600..8af63355 100755
--- a/src/python/test/test_cubical_complex.py
+++ b/src/python/test/test_cubical_complex.py
@@ -147,3 +147,8 @@ def test_connected_sublevel_sets():
periodic_dimensions = periodic_dimensions)
assert cub.persistence() == [(0, (2.0, float("inf")))]
assert cub.betti_numbers() == [1, 0, 0]
+
+def test_connected_sublevel_sets():
+ cub = CubicalComplex(top_dimensional_cells = [[0, 0, 0], [0, 1, 0], [0, 0, 0]])
+ cub.persistence()
+ assert cub.cofaces_of_persistence_pairs() == np.array([[1, 7, 4], [0, 8, -1]])