Skip to main content

Lockfree Persistent Homology Algorithm Toolbox

Project description

LoPHAT

Lockfree Persistent Homology Algorithm Toolbox

crates.io PyPi docs.rs Read the Docs

Try in: Your BrowserGoogle Colab

Overview

LoPHAT is a Rust library implementing the lockfree algorithm for computing persistent homology (PH), introduced in [1]. Python bindings are provided via PyO3, with an interface familiar to those who have used PHAT [2].

The primary goal of this library is to make the algorithm accessible to those wishing to compute PH of arbitrary filtered chain complexes. In particular, LoPHAT is not specialised to compute PH of common filtrations or even filtered simplicial complexes. As such, you should expect LoPHAT to under-perform as compared to giotto-ph [3] or oineus [4], both of which use the algorithm of [1].

The only changes from the algorithm described in [1] are:

  • We use the pinboard library for epoch-based memory management of the matrices.
  • We store the $j^{th}$ column of $R$ and $V$ alongside each other in memory, allowing a full $R=DV$ decomposition (rather than just computing pairings).
  • We additionally employ the clearing optimisation [5] and provide methods for anti-transpotion (so as to compute persistent cohomology).
  • We distribute chunks via work-stealing, using the rayon library.

Warning LoPHAT is currently in beta. The implementation is not optimised, the API is not fixed and tests are limited.

Usage in Rust

Install with

cargo add lophat

For usage, please consult the Rust docs.

Usage in Python

The Python bindings can be installed via

pip install lophat

If this fails, it is probably pip trying to install from source without a cargo toolchain present. To force installing from binary run

pip install --only-binary lophat lophat

This provides you with one function, compute_pairings, which returns the diagram as a set of paired columns and a set of unpaired columns. By default, this uses all available threads and the lockfree algorithm of [1]. To use serial algorithm or limit number of threads, additionally provide a LoPhatOptions object.

For more details, please consult the Python docs. For example usage, see the file example.py or this Google colab notebook.

TODO

  • Change options struct for each algorithm
  • Decide on new Python bindings
  • Increase property testing
  • Write unit tests
  • Write integration tests (testing V)
  • Benchmark
  • Abstract out matrix trait?
  • Reduce memory usage when V not maintained

References

[1] Morozov, Dmitriy, and Arnur Nigmetov. "Towards lockfree persistent homology." Proceedings of the 32nd ACM Symposium on Parallelism in Algorithms and Architectures. 2020.

[2] Bauer, Ulrich, et al. "Phat–persistent homology algorithms toolbox." Journal of symbolic computation 78 (2017): 76-90. Bitbucket

[3] Pérez, Julián Burella, et al. "giotto-ph: A python library for high-performance computation of persistent homology of Vietoris-Rips filtrations." arXiv preprint arXiv:2107.05412 (2021). GitHub

[4] Nigmetov, Arnur, Morozov, Dmitriy, and USDOE. Oineus v1.0. Computer software. https://www.osti.gov//servlets/purl/1774764. USDOE. 1 Apr. 2021. Web. doi:10.11578/dc.20210407.1. GitHub

[5] Bauer, Ulrich, Michael Kerber, and Jan Reininghaus. "Clear and compress: Computing persistent homology in chunks." Topological Methods in Data Analysis and Visualization III: Theory, Algorithms, and Applications. Springer International Publishing, 2014.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lophat-0.9.2.tar.gz (30.2 kB view hashes)

Uploaded Source

Built Distributions

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

lophat-0.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

lophat-0.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl (364.2 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

lophat-0.9.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl (379.0 kB view hashes)

Uploaded PyPy macOS 10.7+ x86-64

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

lophat-0.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

lophat-0.9.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl (364.0 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

lophat-0.9.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl (380.0 kB view hashes)

Uploaded PyPy macOS 10.7+ x86-64

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (311.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.4 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

lophat-0.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

lophat-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686

lophat-0.9.2-cp311-none-win_amd64.whl (222.8 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

lophat-0.9.2-cp311-none-win32.whl (210.6 kB view hashes)

Uploaded CPython 3.11 Windows x86

lophat-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (308.7 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686

lophat-0.9.2-cp311-cp311-macosx_11_0_arm64.whl (363.6 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

lophat-0.9.2-cp311-cp311-macosx_10_7_x86_64.whl (377.7 kB view hashes)

Uploaded CPython 3.11 macOS 10.7+ x86-64

lophat-0.9.2-cp310-none-win_amd64.whl (222.8 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

lophat-0.9.2-cp310-none-win32.whl (210.6 kB view hashes)

Uploaded CPython 3.10 Windows x86

lophat-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (308.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686

lophat-0.9.2-cp310-cp310-macosx_11_0_arm64.whl (363.6 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

lophat-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl (377.7 kB view hashes)

Uploaded CPython 3.10 macOS 10.7+ x86-64

lophat-0.9.2-cp39-none-win_amd64.whl (223.0 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

lophat-0.9.2-cp39-none-win32.whl (210.9 kB view hashes)

Uploaded CPython 3.9 Windows x86

lophat-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

lophat-0.9.2-cp39-cp39-macosx_11_0_arm64.whl (363.9 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

lophat-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl (378.4 kB view hashes)

Uploaded CPython 3.9 macOS 10.7+ x86-64

lophat-0.9.2-cp38-none-win_amd64.whl (222.8 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

lophat-0.9.2-cp38-none-win32.whl (211.0 kB view hashes)

Uploaded CPython 3.8 Windows x86

lophat-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.3 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

lophat-0.9.2-cp37-none-win_amd64.whl (222.7 kB view hashes)

Uploaded CPython 3.7 Windows x86-64

lophat-0.9.2-cp37-none-win32.whl (211.2 kB view hashes)

Uploaded CPython 3.7 Windows x86

lophat-0.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.1 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

lophat-0.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.4 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ s390x

lophat-0.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ppc64le

lophat-0.9.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARMv7l

lophat-0.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

lophat-0.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page