| dmitriy@126 | 1 | #/usr/bin/env python |
| dmitriy@126 | 2 | |
| dmitriy@126 | 3 | |
| dmitriy@126 | 4 | from dionysus import Rips, PairwiseDistances, StaticPersistence, Filtration, points_file, \ |
| dmitriy@126 | 5 | ExplicitDistances, data_dim_cmp |
| dmitriy@126 | 6 | from sys import argv, exit |
| dmitriy@126 | 7 | import time |
| dmitriy@126 | 8 | |
| dmitriy@145 | 9 | def main(filename, skeleton, max): |
| dmitriy@145 | 10 | points = [p for p in points_file(filename)] |
| dmitriy@145 | 11 | distances = PairwiseDistances(points) |
| dmitriy@147 | 12 | # distances = ExplicitDistances(distances) # speeds up generation of the Rips complex at the expense of memory usage |
| dmitriy@145 | 13 | rips = Rips(distances) |
| dmitriy@145 | 14 | print time.asctime(), "Rips initialized" |
| dmitriy@126 | 15 | |
| dmitriy@181 | 16 | simplices = Filtration() |
| dmitriy@145 | 17 | rips.generate(skeleton, max, simplices.append) |
| dmitriy@145 | 18 | print time.asctime(), "Generated complex: %d simplices" % len(simplices) |
| dmitriy@126 | 19 | |
| dmitriy@145 | 20 | # While this step is unnecessary (Filtration below can be passed rips.cmp), |
| dmitriy@145 | 21 | # it greatly speeds up the running times |
| dmitriy@145 | 22 | for s in simplices: s.data = rips.eval(s) |
| dmitriy@145 | 23 | print time.asctime(), simplices[0], '...', simplices[-1] |
| dmitriy@126 | 24 | |
| dmitriy@181 | 25 | simplices.sort(data_dim_cmp) # could be rips.cmp if s.data for s in simplices is not set |
| dmitriy@145 | 26 | print time.asctime(), "Set up filtration" |
| dmitriy@126 | 27 | |
| dmitriy@181 | 28 | p = StaticPersistence(simplices) |
| dmitriy@145 | 29 | print time.asctime(), "Initialized StaticPersistence" |
| dmitriy@126 | 30 | |
| dmitriy@145 | 31 | p.pair_simplices() |
| dmitriy@145 | 32 | print time.asctime(), "Simplices paired" |
| dmitriy@126 | 33 | |
| dmitriy@145 | 34 | print "Outputting persistence diagram" |
| dmitriy@181 | 35 | smap = p.make_simplex_map(simplices) |
| dmitriy@145 | 36 | for i in p: |
| dmitriy@145 | 37 | if i.sign(): |
| dmitriy@181 | 38 | b = smap[i] |
| dmitriy@126 | 39 | |
| dmitriy@145 | 40 | if b.dimension() >= skeleton: continue |
| dmitriy@126 | 41 | |
| dmitriy@181 | 42 | if i.unpaired(): |
| dmitriy@145 | 43 | print b.dimension(), b.data, "inf" |
| dmitriy@145 | 44 | continue |
| dmitriy@132 | 45 | |
| dmitriy@181 | 46 | d = smap[i.pair()] |
| dmitriy@145 | 47 | print b.dimension(), b.data, d.data |
| dmitriy@132 | 48 | |
| dmitriy@145 | 49 | if __name__ == '__main__': |
| dmitriy@145 | 50 | if len(argv) < 4: |
| dmitriy@145 | 51 | print "Usage: %s POINTS SKELETON MAX" % argv[0] |
| dmitriy@145 | 52 | exit() |
| dmitriy@132 | 53 | |
| dmitriy@145 | 54 | filename = argv[1] |
| dmitriy@145 | 55 | skeleton = int(argv[2]) |
| dmitriy@145 | 56 | max = float(argv[3]) |
| dmitriy@132 | 57 | |
| dmitriy@145 | 58 | main(filename, skeleton, max) |