doc/examples/triangle.rst
author Christos Mantoulidis <cmad@stanford.edu>
Tue, 04 Aug 2009 13:23:16 -0700
branchdev
changeset 156 f75fb57d2831
parent 134 c270826fd4a8
child 181 1ee6edc17cb6
permissions -rw-r--r--
Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.

.. _triangle-example:

Triangle example
================

Simple example of a filtered triangle is given in
:sfile:`examples/triangle/triangle.cpp`. Its equivalent in Python appears in
:sfile:`examples/triangle/triangle.py`, and we describe it next.

.. literalinclude:: ../../examples/triangle/triangle.py
   :language: python

After the necessary imports, the ``complex`` is setup explicitly as a list of
simplices. Each :class:`Simplex` constructor takes an iterable sequence of
vertices, and optionally a data value.

The complex must be sorted lexicographically to compute persistence using
:class:`StaticPersistence`, and it is accomplished via a helper comparison function :func:`vertex_cmp`, which compares simplices with respect to the lexicographic ordering::

    complex.sort(vertex_cmp)

A filtration ``f`` is initialized using the :class:`Filtration` class, which
takes a list of lexicographically sorted simplices and a comparison that defines
in what order the simplices should come in the filtration. In this case we use
:func:`data_cmp`, which simply compares simplices' :attr:`~Simplex.data`
attributes.

:class:`StaticPersistence` is initialized with the filtration, and its method
:meth:`~StaticPersistence.pair_simplices` pairs the simplices of the
filtration::

    p = StaticPersistence(f)
    p.pair_simplices()

Subsequently, we iterate over ``p`` to access a representation of each simplex
in the filtration order. We output each simplex, its sign, and its pair. Note
``complex[f[p(i)]]``: ``p(i)`` gives the integer index of the iterator ``i`` in
the filtration ``f``; in turn ``f[p(i)]`` gives the index of the simplex in the
(lexicographically ordered) ``complex``. So the entire expression returns
individual simplices. Naturally, one could use this to access the
:attr:`~Simplex.data` attribute of the simplices to output the actual
persistence diagram, as is done in the :ref:`alpha-shape-example` and the
:ref:`rips-example`.