08-extended-persistence.py
author Dmitriy Morozov <dmitriy@mrzv.org>
Sun, 17 Jun 2012 12:14:23 -0700
changeset 4 3315b6204a33
parent 3 ef86268a3695
permissions -rw-r--r--
Minor touches

# Extended persistence
w = -1
cone = [Simplex([w] + [v for v in s.vertices]) for s in elephant_complex]
cone.append(Simplex([w]))

def projection(points, axis = 1):
    def value(v):
        return points[v][axis]

    return value
value = projection(elephant_points, 1)

def ep_compare(values):
    def max_vertex(s):
        return max(values(v) for v in s.vertices if v != w)

    def min_vertex(s):
        return min(values(v) for v in s.vertices if v != w)

    def compare(s1, s2):
        if s1.dimension() == 0 and w in s1.vertices:
            return -1
        if s2.dimension() == 0 and w in s2.vertices:
            return 1

        if s1.dimension() != s2.dimension():
            return cmp(s1.dimension(), s2.dimension())

        if (w in s1.vertices) ^ (w in s2.vertices):       # only one cone simplex
            return 1 if w in s1.vertices else -1
        elif w in s1.vertices:
            return -cmp(min_vertex(s1), min_vertex(s2))
        else:
            return cmp(max_vertex(s1), max_vertex(s2))

    return compare

f = Filtration(elephant_complex + cone)
f.sort(ep_compare(value))

persistence = StaticPersistence(f)
persistence.pair_simplices()

def eval_ep(values):
    def eval(s):
        if s.dimension() == 0 and w in s.vertices:
            return float('inf')
        if w in s.vertices:
            return min(values(v) for v in s.vertices if v != w)
        else:
            return max(values(v) for v in s.vertices)
    return eval

dgms = init_diagrams(persistence, f, eval_ep(value), lambda i: i)

print show_diagram(dgms)
#print dgms
#print len(dgms)