summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2020-03-07 14:05:05 +0100
committerMarc Glisse <marc.glisse@inria.fr>2020-03-07 14:05:05 +0100
commit35e08b30836fb0c419c0377eaf51d2a3b16e7670 (patch)
treef6e659e8d0b0b37c8ee4576a075fd727bcddd313 /src
parent64199fd8037556f135f90102ba8270cccf9d3e60 (diff)
min_persistence for generators
Diffstat (limited to 'src')
-rw-r--r--src/python/gudhi/simplex_tree.pxd4
-rw-r--r--src/python/gudhi/simplex_tree.pyx36
-rw-r--r--src/python/include/Persistent_cohomology_interface.h10
3 files changed, 30 insertions, 20 deletions
diff --git a/src/python/gudhi/simplex_tree.pxd b/src/python/gudhi/simplex_tree.pxd
index 4e435c67..53e2bbc9 100644
--- a/src/python/gudhi/simplex_tree.pxd
+++ b/src/python/gudhi/simplex_tree.pxd
@@ -53,5 +53,5 @@ cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi":
vector[pair[double,double]] intervals_in_dimension(int dimension)
void write_output_diagram(string diagram_file_name)
vector[pair[vector[int], vector[int]]] persistence_pairs()
- pair[vector[vector[int]], vector[vector[int]]] lower_star_generators()
- pair[vector[vector[int]], vector[vector[int]]] flag_generators()
+ pair[vector[vector[int]], vector[vector[int]]] lower_star_generators(double)
+ pair[vector[vector[int]], vector[vector[int]]] flag_generators(double)
diff --git a/src/python/gudhi/simplex_tree.pyx b/src/python/gudhi/simplex_tree.pyx
index 1c9b9cf1..3f582ac9 100644
--- a/src/python/gudhi/simplex_tree.pyx
+++ b/src/python/gudhi/simplex_tree.pyx
@@ -395,7 +395,7 @@ cdef class SimplexTree:
:param min_persistence: The minimum persistence value to take into
account (strictly greater than min_persistence). Default value is
0.0.
- Sets min_persistence to -1.0 to see all values.
+ Set min_persistence to -1.0 to see all values.
:type min_persistence: float.
:param persistence_dim_max: If true, the persistent homology for the
maximal dimension in the complex is computed. If false, it is
@@ -515,42 +515,48 @@ cdef class SimplexTree:
print("intervals_in_dim function requires persistence function"
" to be launched first.")
- def lower_star_persistence_generators(self):
+ def lower_star_persistence_generators(self, min_persistence=0.):
"""Assuming this is a lower-star filtration, this function returns the persistence pairs,
where each simplex is replaced with the vertex that gave it its filtration value.
- :returns: first the regular persistence pairs, grouped by dimension, with one vertex per extremity,
+ :param min_persistence: The minimum persistence value to take into
+ account (strictly greater than min_persistence). Default value is
+ 0.0.
+ Set min_persistence to -1.0 to see all values.
+ :type min_persistence: float.
+ :returns: First the regular persistence pairs, grouped by dimension, with one vertex per extremity,
and second the essential features, grouped by dimension, with one vertex each
:rtype: Tuple[List[numpy.array[int] of shape (n,2)], List[numpy.array[int] of shape (m,)]]
- :note: intervals_in_dim function requires
- :func:`persistence()<gudhi.SimplexTree.persistence>`
- function to be launched first.
+ :note: lower_star_persistence_generators requires that `persistence()` be called first.
"""
if self.pcohptr != NULL:
- gen = self.pcohptr.lower_star_generators()
+ gen = self.pcohptr.lower_star_generators(min_persistence)
normal = [np_array(d).reshape(-1,2) for d in gen.first]
infinite = [np_array(d) for d in gen.second]
return (normal, infinite)
else:
print("lower_star_persistence_generators() requires that persistence() be called first.")
- def flag_persistence_generators(self):
+ def flag_persistence_generators(self, min_persistence=0.):
"""Assuming this is a flag complex, this function returns the persistence pairs,
where each simplex is replaced with the vertices of the edges that gave it its filtration value.
- :returns: first the regular persistence pairs of dimension 0, with one vertex for birth and two for death;
+ :param min_persistence: The minimum persistence value to take into
+ account (strictly greater than min_persistence). Default value is
+ 0.0.
+ Set min_persistence to -1.0 to see all values.
+ :type min_persistence: float.
+ :returns: First the regular persistence pairs of dimension 0, with one vertex for birth and two for death;
then the other regular persistence pairs, grouped by dimension, with 2 vertices per extremity;
then the connected components, with one vertex each;
finally the other essential features, grouped by dimension, with 2 vertices for birth.
- :rtype: Tuple[List[numpy.array[int] of shape (n,3)], List[numpy.array[int] of shape (m,4)], List[numpy.array[int] of shape (l,)], List[numpy.array[int] of shape (k,2)]]
+ :rtype: Tuple[numpy.array[int] of shape (n,3), List[numpy.array[int] of shape (m,4)], numpy.array[int] of shape (l,), List[numpy.array[int] of shape (k,2)]]
- :note: intervals_in_dim function requires
- :func:`persistence()<gudhi.SimplexTree.persistence>`
- function to be launched first.
+ :note: flag_persistence_generators requires that `persistence()` be called first.
"""
if self.pcohptr != NULL:
- gen = self.pcohptr.flag_generators()
+ gen = self.pcohptr.flag_generators(min_persistence)
if len(gen.first) == 0:
normal0 = np_array([])
normals = np_array([])
@@ -568,4 +574,4 @@ cdef class SimplexTree:
return (normal0, normals, infinite0, infinites)
else:
- print("lower_star_persistence_generators() requires that persistence() be called first.")
+ print("flag_persistence_generators() requires that persistence() be called first.")
diff --git a/src/python/include/Persistent_cohomology_interface.h b/src/python/include/Persistent_cohomology_interface.h
index 6e9aac52..8e721fc0 100644
--- a/src/python/include/Persistent_cohomology_interface.h
+++ b/src/python/include/Persistent_cohomology_interface.h
@@ -95,11 +95,10 @@ persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomol
}
// TODO: (possibly at the python level)
- // - an option to ignore intervals of length 0?
// - an option to return only some of those vectors?
typedef std::pair<std::vector<std::vector<int>>, std::vector<std::vector<int>>> Generators;
- Generators lower_star_generators() {
+ Generators lower_star_generators(double min_persistence) {
Generators out;
// diags[i] should be interpreted as vector<array<int,2>>
auto& diags = out.first;
@@ -108,6 +107,8 @@ persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomol
for (auto pair : Base::get_persistent_pairs()) {
auto s = std::get<0>(pair);
auto t = std::get<1>(pair);
+ if(stptr_->filtration(t) - stptr_->filtration(s) <= min_persistence)
+ continue;
int dim = stptr_->dimension(s);
auto v = stptr_->vertex_with_same_filtration(s);
if(t == stptr_->null_simplex()) {
@@ -123,7 +124,8 @@ persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomol
return out;
}
- Generators flag_generators() {
+ // An alternative, to avoid those different sizes, would be to "pad" vertex generator v as (v, v) or (v, -1). When using it as index, this corresponds to adding the vertex filtration values either on the diagonal of the distance matrix, or as an extra row or column.
+ Generators flag_generators(double min_persistence) {
Generators out;
// diags[0] should be interpreted as vector<array<int,3>> and other diags[i] as vector<array<int,4>>
auto& diags = out.first;
@@ -132,6 +134,8 @@ persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomol
for (auto pair : Base::get_persistent_pairs()) {
auto s = std::get<0>(pair);
auto t = std::get<1>(pair);
+ if(stptr_->filtration(t) - stptr_->filtration(s) <= min_persistence)
+ continue;
int dim = stptr_->dimension(s);
bool infinite = t == stptr_->null_simplex();
if(infinite) {