Moved lsfiltration.py into examples/pl-functions + added lscubes.py example (cubical lower-star filtration) dev
authorDmitriy Morozov <dmitriy@mrzv.org>
Tue, 26 Jan 2010 11:00:51 -0800
branchdev
changeset 191 2d8fba6d1d58
parent 190 6edd7c861bc0
child 192 19d35448c7c7
Moved lsfiltration.py into examples/pl-functions + added lscubes.py example (cubical lower-star filtration)
examples/lsfiltration.py
examples/pl-functions/cube.py
examples/pl-functions/lscubes.py
examples/pl-functions/lsfiltration.py
--- a/examples/lsfiltration.py	Tue Jan 12 14:36:38 2010 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-
-from    dionysus        import Simplex, Filtration, StaticPersistence, vertex_cmp
-from    sys             import argv, exit
-
-
-def max_vertex(s, vertices):
-    return max((vertices[v] for v in s.vertices))
-
-def max_vertex_cmp(s1, s2, vertices):
-    m1 = max_vertex(s1, vertices)
-    m2 = max_vertex(s2, vertices)
-    return cmp(m1, m2) or cmp(s1.dimension(), s2.dimension())
-
-def lsf(values_filename, simplices_filename):
-    # Read vertices
-    vertices = []
-    with open(values_filename) as f:
-        for line in f:
-            if line.startswith('#'): continue
-            vertices.append(float(line.split()[1]))
-
-    # Read simplices
-    fltr = Filtration()
-    with open(simplices_filename) as f:
-        for line in f:
-            if line.startswith('#'): continue
-            fltr.append(Simplex(map(int, line.split())))
-    fltr.sort(lambda x,y: max_vertex_cmp(x,y,vertices))
-
-    # Compute persistence
-    p = StaticPersistence(fltr)
-    p.pair_simplices()
-    
-    # Output the persistence diagram
-    smap = p.make_simplex_map(fltr)
-    for i in p:
-        if not i.sign(): continue
-
-        b = smap[i]
-        d = smap[i.pair()]
-
-        if i.unpaired():
-            print b.dimension(), max_vertex(b, vertices), "inf"
-            continue
-
-        print b.dimension(), max_vertex(b, vertices), max_vertex(d, vertices)
-
-
-if __name__ == '__main__':
-    if len(argv) < 3:
-        print "Usage: %s VERTICES SIMPLICES" % argv[0]
-        print 
-        print "Computes persistence of the lower star filtration of the simplicial "
-        print "complex explicitly listed out in SIMPLICES with vertex values given in VERTICES."
-        exit()
-
-    values = argv[1]
-    simplices = argv[2]
-
-    lsf(values, simplices)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/pl-functions/cube.py	Tue Jan 26 11:00:51 2010 -0800
@@ -0,0 +1,40 @@
+def log2(x):
+    i = 0
+    while x:
+        x >>= 1
+        i += 1
+    return i-1        
+
+class Cube:
+    def __init__(self, vertices):
+        self.vertices = vertices
+
+    def dimension(self):
+        return log2(len(self.vertices))
+
+    def boundary(self):
+        for i in xrange(self.dimension()):
+            for side in [0,1]:
+                vertices = []
+                for idx in xrange(len(self.vertices)/2):
+                    # Insert i-th bit equal to side
+                    v = (idx & ~(2**i-1)) << 1
+                    if side: v |= 2**i
+                    v |= (idx & (2**i - 1))
+                    vertices.append(self.vertices[v])
+                yield Cube(vertices)    
+
+    def __hash__(self):
+        return hash(tuple(self.vertices))
+
+    def __eq__(self, other):
+        return self.vertices == other.vertices
+
+    def __repr__(self):
+        return " ".join(map(str, self.vertices))
+
+
+if __name__ == '__main__':
+    c = Cube(['a', 'b', 'c', 'd'])
+    print c
+    for sb in c.boundary(): print sb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/pl-functions/lscubes.py	Tue Jan 26 11:00:51 2010 -0800
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+from    dionysus        import CohomologyPersistence
+from    cube            import Cube
+from    sys             import argv, exit
+
+
+def max_vertex(s, vertices):
+    return max((vertices[v] for v in s.vertices))
+
+def max_vertex_cmp(s1, s2, vertices):
+    m1 = max_vertex(s1, vertices)
+    m2 = max_vertex(s2, vertices)
+    return cmp(m1, m2) or cmp(s1.dimension(), s2.dimension())
+
+def lsf(values_filename, cubes_filename, prime = 11):
+    # Read vertices
+    vertices = []
+    with open(values_filename) as f:
+        for line in f:
+            if line.startswith('#'): continue
+            vertices.append(float(line.split()[0]))
+
+    # Read cubes
+    fltr = []
+    with open(cubes_filename) as f:
+        for line in f:
+            if line.startswith('#'): continue
+            fltr.append(Cube(map(int, line.split())))
+    fltr.sort(lambda x,y: max_vertex_cmp(x,y,vertices))
+    for i,c in enumerate(fltr): c.data = i
+
+    ch = CohomologyPersistence(prime)
+    complex = {}
+
+    for c in fltr:
+        # print "%s: %s" % (c, " + ".join(map(str, c.boundary())))
+        # print complex
+        i,d = ch.add([complex[cb] for cb in c.boundary()], c.data)
+        complex[c] = i
+        if d:
+            birth = d
+            print c.dimension() - 1, max_vertex(fltr[birth], vertices), max_vertex(c, vertices)
+
+if __name__ == '__main__':
+    if len(argv) < 3:
+        print "Usage: %s VERTICES CUBES" % argv[0]
+        print 
+        print "Computes persistence of the lower star filtration of the cubical "
+        print "complex explicitly listed out in CUBES with vertex values given in VERTICES."
+        exit()
+
+    values = argv[1]
+    cubes = argv[2]
+
+    lsf(values, cubes)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/pl-functions/lsfiltration.py	Tue Jan 26 11:00:51 2010 -0800
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+
+from    dionysus        import Simplex, Filtration, StaticPersistence, vertex_cmp
+from    sys             import argv, exit
+
+
+def max_vertex(s, vertices):
+    return max((vertices[v] for v in s.vertices))
+
+def max_vertex_cmp(s1, s2, vertices):
+    m1 = max_vertex(s1, vertices)
+    m2 = max_vertex(s2, vertices)
+    return cmp(m1, m2) or cmp(s1.dimension(), s2.dimension())
+
+def lsf(values_filename, simplices_filename):
+    # Read vertices
+    vertices = []
+    with open(values_filename) as f:
+        for line in f:
+            if line.startswith('#'): continue
+            vertices.append(float(line.split()[0]))
+
+    # Read simplices
+    fltr = Filtration()
+    with open(simplices_filename) as f:
+        for line in f:
+            if line.startswith('#'): continue
+            fltr.append(Simplex(map(int, line.split())))
+    fltr.sort(lambda x,y: max_vertex_cmp(x,y,vertices))
+
+    # Compute persistence
+    p = StaticPersistence(fltr)
+    p.pair_simplices()
+    
+    # Output the persistence diagram
+    smap = p.make_simplex_map(fltr)
+    for i in p:
+        if not i.sign(): continue
+
+        b = smap[i]
+        d = smap[i.pair()]
+
+        if i.unpaired():
+            print b.dimension(), max_vertex(b, vertices), "inf"
+            continue
+
+        print b.dimension(), max_vertex(b, vertices), max_vertex(d, vertices)
+
+
+if __name__ == '__main__':
+    if len(argv) < 3:
+        print "Usage: %s VERTICES SIMPLICES" % argv[0]
+        print 
+        print "Computes persistence of the lower star filtration of the simplicial "
+        print "complex explicitly listed out in SIMPLICES with vertex values given in VERTICES."
+        exit()
+
+    values = argv[1]
+    simplices = argv[2]
+
+    lsf(values, simplices)