Omni-field Persistence

It’s possible to compute persistence over all fields Zp at once, by doing some extra bookkeeping. OmniFieldPersistence performs the necessary operations. We start with a triangulation of the Klein bottle:

>>> klein_bottle = [[0], [1], [2], [3], [4], [5], [6], [7], [8],
...       [0,1], [1,2], [2,0], [0,3], [3,4], [4,0],
...       [1,5], [5,6], [6,2], [2,7], [7,8], [8,1],
...       [3,5], [5,7], [7,3], [4,6], [6,8], [8,4],
...       [0,5], [1,7], [2,3], [3,6], [5,8], [7,4],
...       [4,2], [6,1], [8,0],
...       [0,3,5], [0,1,5], [1,5,7], [1,2,7], [2,7,3], [2,3,0],
...       [3,4,6], [3,5,6], [5,6,8], [5,7,8], [7,8,4], [7,3,4],
...       [4,0,2], [4,6,2], [6,2,1], [6,8,1], [8,1,0], [8,4,0]]
>>> f = d.Filtration(klein_bottle)
>>> print(f)
Filtration with 54 simplices

We can compute persistence over all fields Zp at once:

>>> ofp = d.omnifield_homology_persistence(f)

We can examine which primes produce special results. This does not necessarily mean that persistence diagram over the respective finite fields looks different, but it does indicate that something special happened during the reduction. In contrast, for any prime not in this list, the persistence diagrams look the same.

>>> print(ofp.primes())
[2]

To access the results, we can construct persistence diagrams over a particular Zp. E.g., over Z2, we get:

>>> dgms = d.init_diagrams(ofp, f, 2)
>>> for i, dgm in enumerate(dgms):
...     print("Dimension:", i)
...     for pt in dgm:
...         print(pt)
Dimension: 0
(0,inf)
Dimension: 1
(0,inf)
(0,inf)
Dimension: 2
(0,inf)

Indicating that H0(K,Z2)=Z2,H1(K,Z2)=Z2Z2,H2(K,Z2)=Z2.

But over Z3 (as well as over any other Zp), we get:

>>> dgms = d.init_diagrams(ofp, f, 3)
>>> for i, dgm in enumerate(dgms):
...     print("Dimension:", i)
...     for pt in dgm:
...         print(pt)
Dimension: 0
(0,inf)
Dimension: 1
(0,inf)
Dimension: 2

Indicating that H0(K,Z3)=Z3,H1(K,Z3)=Z3,H2(K,Z3)=0.

It’s possible to examine the columns of the reduced matrices over any given prime:

 >>> for i in range(len(ofp)):
 ...     if ofp.special(i, 2):
 ...         print("Column %d mod %d:" % (i,2), ofp.column(i, 2))
 ...         print("Column %d mod %d:" % (i,3), ofp.column(i, 3))
 Column 53 mod 2:
 Column 53 mod 3: 1*9 + 1*10 + 2*11