![]() |
CAPD RedHom Library
|
python homology.py <inputfile>
import capdRedHom
import sys
import ast
def read_dat(filename):
def read(filename):
with open(filename, 'r') as input:
for line in input:
simplex = map(int, line.split())
yield simplex
facets = list(read(filename))
complex = capdRedHom.SimplicialComplex(facets)
return complex
def read_pcub(filename):
def read(filename):
with open(filename, 'r') as input:
for line in input:
cube = ast.literal_eval(line)
yield cube
cubes = list(read(filename))
complex = capdRedHom.CubicalComplex(cubes=cubes)
return complex
def read(filename):
if filename.endswith('.dat'):
return read_dat(filename)
elif filename.endswith('.pcub_py'):
return read_pcub(filename)
else:
raise RuntimeError("Supported file types: {}".format(['.dat', '.pcub_py']))
if __name__ == '__main__':
complex = read(sys.argv[1])
algorithm = capdRedHom.BettiNumbersOverZ(complex)
betti = algorithm()
print "Betti: ", betti
Example input files:
(1, 1),(0, 1),(0, 1),(0, 0) (0, 0),(0, 1),(0, 0),(0, 1) (0, 1),(1, 1),(0, 1),(0, 0) (0, 0),(0, 1),(0, 1),(1, 1) (0, 1),(0, 0),(1, 1),(0, 1) (0, 1),(0, 0),(0, 0),(0, 1) (0, 0),(0, 1),(1, 1),(0, 1) (1, 1),(0, 1),(1, 1),(0, 1) (0, 1),(1, 1),(0, 0),(0, 1) (1, 1),(0, 1),(0, 1),(1, 1) (0, 1),(1, 1),(1, 1),(0, 1) (0, 1),(1, 1),(0, 1),(1, 1) (0, 1),(0, 0),(0, 1),(1, 1) (1, 1),(0, 1),(0, 0),(0, 1) (0, 0),(0, 1),(0, 1),(0, 0) (0, 1),(0, 0),(0, 1),(0, 0)
0 1 2 2 3 6 0 1 5 1 3 6 1 3 4 1 2 4 2 3 5 0 3 5 0 3 4 0 2 6 0 4 6 2 4 5 4 5 6 1 5 6
python image_persistence.py <inputfile>
import sys, os
import gzip
import capdRedHom
try:
import matplotlib
matplotlib.use("Agg")
except:
pass
def read_image(filename):
if filename.endswith('.gz'):
fileobj = gzip.open(filename, 'rb')
filename = filename[:-3]
else:
fileobj = open(filename, 'rb')
if filename.endswith('fits'):
import pyfits
data_cube, header_data_cube = pyfits.getdata(fileobj, 0, header=True)
data = data_cube
else:
try:
from skimage.io import imread
image = imread(fileobj).astype(float)
data = image
except ImportError as ex:
import PIL.Image
image = PIL.Image.open(fileobj)
w, h = image.size
image_pixels = image.load()
data = [ [image_pixels[i, j] for j in xrange(w)] for i in xrange(h)]
return data
def compute_persistence_homology(data):
algorithm = capdRedHom.persistence.ImagePersistentHomology(data)
algorithm()
full_diagram = algorithm.diagram()
dim_1_diagram = algorithm.diagram(1)
dim_10_diagram = algorithm.diagram(10) # empty dimension
return full_diagram, dim_1_diagram, dim_10_diagram
def main(argv=sys.argv):
image_file = argv[1]
image_file_bn = os.path.basename(image_file)
image = read_image(image_file)
diagram, dim_1_diagram, dim_10_diagram = compute_persistence_homology(image)
finite, infinite = (len(diagram.finite_intervals), len(diagram.infinite_intervals))
dim_1_finite, dim_1_infinite = (len(dim_1_diagram.finite_intervals), len(dim_1_diagram.infinite_intervals))
dim_10_finite, dim_10_infinite = (len(dim_10_diagram.finite_intervals), len(dim_10_diagram.infinite_intervals))
print "Persistence diagram contains {} finite intervals and {} infinite interals".format(finite, infinite)
print "Persistence diagram in dimension 1 contains {} finite intervals and {} infinite interals".format(dim_1_finite, dim_1_infinite)
print "Persistence diagram in dimension 10 contains {} finite intervals and {} infinite interals".format(dim_10_finite, dim_10_infinite)
with open(image_file_bn + '.intervals', 'w') as out:
for interval in diagram:
out.write('{} {}\n'.format(*interval))
try:
import matplotlib.pyplot as plt
plot_diagram = capdRedHom.persistence.PlotDiagram(diagram)
plot_diagram(plt)
plt.savefig(image_file_bn + '.png')
plt.clf()
matplotlib.pyplot.close("all")
except ImportError:
pass
if __name__ == '__main__':
main(sys.argv)
Example input files:
python bottleneck_distance.py <use infinite: 0 1> <diagram1> <diagram2>
import sys
import capdRedHom
def read_diagram(fn):
with open(fn) as file:
diagram = capdRedHom.persistence.Diagram.read_from(file)
return diagram
def main(argv=sys.argv):
use_inf = bool(argv[1])
diagram_1 = read_diagram(argv[2])
diagram_2 = read_diagram(argv[3])
if capdRedHom.persistence.BottleneckDistance.enabled():
distance = capdRedHom.persistence.BottleneckDistance(diagram_1, diagram_2, use_inf, 0.001)
dist = distance()
print dist
else:
print "Not enabled"
if __name__ == '__main__':
main(sys.argv)
Example input files: diagram1 diagram2
python wasserstein_distance.py <use infinite: 0 1> <diagram1> <diagram2>
import sys
import capdRedHom
def read_diagram(fn):
with open(fn) as file:
diagram = capdRedHom.persistence.Diagram.read_from(file)
return diagram
def main(argv=sys.argv):
use_inf = bool(argv[1])
diagram_1 = read_diagram(argv[2])
diagram_2 = read_diagram(argv[3])
if capdRedHom.persistence.WassersteinDistance.enabled():
distance = capdRedHom.persistence.WassersteinDistance(diagram_1, diagram_2, use_inf)
dist = distance()
print dist
else:
print "Not enabled"
if __name__ == '__main__':
main(sys.argv)