.. |wheels| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/wheels.yml/badge.svg
.. _wheels:
.. |ci| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/ci.yml/badge.svg
.. _ci:
.. |docs| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/deploy-github-pages.yml/badge.svg
.. _docs:
|wheels|_ |ci|_ |docs|_
=========
giotto-ph
=========
``giotto-ph`` is a high-performance implementation of Vietoris–Rips (VR) persistence on the CPU, and is distributed under the GNU AGPLv3 license.
It consists of an improved reimplementation of `Morozov and Nigmetov's "lock-free Ripser" <https://dl.acm.org/doi/10.1145/3350755.3400244>`_
and in addition makes use of a parallel implementation of the *apparent pairs* optimization used in `Ripser v1.2 <https://github.com/Ripser/ripser>`_.
It also contains an improved reimplementation of `GUDHI's Edge Collapse (EC) algorithm <https://hal.inria.fr/hal-02395227>`_ and offers support
for weighted VR filtrations. See also `Morozov's Ripser fork <https://github.com/mrzv/ripser/tree/lockfree>`_, Nigmetov's
`Oineus library <https://github.com/grey-narn/oineus>`_, and `GUDHI's EC implementation <http://gudhi.gforge.inria.fr/doc/latest/group__edge__collapse.html>`_.
``giotto-ph`` is part of the `Giotto <https://github.com/giotto-ai>`_ family of open-source projects and designed for tight integration with
the `giotto-tda <https://github.com/giotto-ai/giotto-tda>`_ and `pyflagser <https://github.com/giotto-ai/giotto-tda>`_ libraries.
Project genesis
===============
``giotto-ph`` is the result of a collaborative effort between `L2F SA <https://www.l2f.ch/>`_,
the `Laboratory for Topology and Neuroscience <https://www.epfl.ch/labs/hessbellwald-lab/>`_ at EPFL,
and the `Institute of Reconfigurable & Embedded Digital Systems (REDS) <https://heig-vd.ch/en/research/reds>`_ of HEIG-VD.
License
=======
.. _L2F team: business@l2f.ch
``giotto-ph`` is distributed under the AGPLv3 `license <https://github.com/giotto-ai/giotto-tda/blob/master/LICENSE>`_.
If you need a different distribution license, please contact the `L2F team`_.
Parallel persistent homology backend
====================================
Computing persistence barcodes of large datasets and in high homology degrees is challenging even on modern hardware. ``giotto-ph``'s persistent homology backend
is able to distribute the key stages of the computation (namely, search for apparent pairs and coboundary matrix reduction) across an arbitrary number of available CPU threads.
On challenging datasets, the scaling is quite favourable as shown in the following figure (for more details, see our paper linked below):
.. image:: https://raw.githubusercontent.com/giotto-ai/giotto-ph/main/docs/images/multithreading_speedup.svg
:width: 500px
:align: center
Basic usage in Python
=====================
Basic imports:
.. code-block:: python
import numpy as np
from gph import ripser_parallel
Point clouds
------------
Persistence diagram of a random point cloud of 100 points in 3D Euclidean space, up to homology dimension 2, using all available threads:
.. code-block:: python
pc = np.random.random((100, 3))
dgm = ripser_parallel(pc, maxdim=2, n_threads=-1)
Distance matrices and graphs
----------------------------
You can also work with distance matrices by passing ``metric="precomputed"``:
.. code-block:: python
from scipy.spatial.distance import pdist, squareform
# A distance matrix
dm = squareform(pdist(pc))
dgm = ripser_parallel(pc, metric="precomputed", maxdim=2, n_threads=-1)
More generally, you can work with dense or sparse adjacency matrices of weighted graphs. Here is a dense square matrix interpreted as the adjacency matrix of a fully connected weighted graph with 100 vertices:
.. code-block:: python
# Entries can be negative. The only constraint is that, for every i and j, dm[i, j] ≥ max(dm[i, i], dm[j, j])
# With dense input, the lower diagonal is ignored
adj_dense = np.random.random((100, 100))
np.fill_diagonal(adj_dense, 0)
dgm = ripser_parallel(adj_dense, metric="precomputed", maxdim=2, n_threads=-1)
And here is a sparse adjacency matrix:
.. code-block:: python
# See API reference for treatment of entries below the diagonal
from scipy.sparse import random
adj_sparse = random(100, 100, density=0.1)
dgm = ripser_parallel(adj_sparse, metric="precomputed", maxdim=2, n_threads=-1)
Edge Collapser
--------------
Push the computation to higher homology dimensions and larger point clouds/distance matrices/adjacency matrices using edge collapses:
.. code-block:: python
dgm_higher = ripser_parallel(pc, maxdim=5, collapse_edges=True, n_threads=-1)
(Note: not all datasets and configurations will benefit from edge collapses. For more details, see our paper below.)
Weighted Rips Filtrations
-------------------------
Use the ``weights`` and ``weight_params`` parameters to constructed a weighted Rips filtration as defined in `this paper <https://doi.org/10.1007/978-3-030-43408-3_2>`_. ``weights`` can either be a custom 1D array of vertex weights, or the string ``"DTM"`` for distance-to-measure reweighting:
.. code-block:: python
dgm_dtm = ripser_parallel(pc, weights="DTM", n_threads=-1)
Documentation and Tutorials
===========================
Jupyter notebook tutorials can be found in the `examples folder <https://github.com/giotto-ai/giotto-ph/blob/main/examples>`_.
The API reference can be found at https://giotto-ai.github.io/giotto-ph.
Installation
============
Dependencies
------------
The latest stable version of ``giotto-ph`` requires:
- Python (>= 3.6)
- NumPy (>= 1.19.1)
- SciPy (>= 1.5.0)
- scikit-learn (>= 0.23.1)
User installation
-----------------
The simplest way to install ``giotto-ph`` is using ``pip`` ::
python -m pip install -U giotto-ph
If necessary, this will also automatically install all the above dependencies. Note: we recommend
upgrading ``pip`` to a recent version as the above may fail on very old versions.
Developer installation
----------------------
Please consult the `dedicated page <https://giotto-ai.github.io/giotto-ph/build/html/installation.html#developer-installation>`_
for detailed instructions on how to build ``giotto-ph`` from sources across different platforms.
.. _contributing-section:
Contributing
============
We welcome new contributors of all experience levels. The Giotto community goals are to be helpful, welcoming,
and effective. To learn more about making a contribution to ``giotto-ph``, please consult `the relevant page
<https://giotto-ai.github.io/gtda-docs/latest/contributing/index.html>`_.
Testing
-------
After installation, you can launch the test suite from inside the
source directory ::
pytest gph
Important links
===============
- Issue tracker: https://github.com/giotto-ai/giotto-ph/issues
Citing giotto-ph
=================
If you use ``giotto-ph`` in a scientific publication, we would appreciate citations to the following paper:
`giotto-ph: A Python Library for High-Performance Computation of Persistent Homology of Vietoris–Rips Filtrations <https://arxiv.org/abs/2107.05412>`_, Burella Pérez *et al*, arXiv:2107.05412, 2021.
You can use the following BibTeX entry:
.. code:: bibtex
@misc{burella2021giottoph,
title={giotto-ph: A Python Library for High-Performance Computation of Persistent Homology of Vietoris--Rips Filtrations},
author={Julián Burella Pérez and Sydney Hauke and Umberto Lupo and Matteo Caorsi and Alberto Dassatti},
year={2021},
eprint={2107.05412},
archivePrefix={arXiv},
primaryClass={cs.CG}
}
Community
=========
giotto-ai Slack workspace: https://slack.giotto.ai/
Contacts
========
maintainers@giotto.ai
Raw data
{
"_id": null,
"home_page": "https://github.com/giotto-ai/giotto-ph",
"name": "giotto-ph",
"maintainer": "Juli\u00e1n Burella P\u00e9rez and Umberto Lupo",
"docs_url": null,
"requires_python": "",
"maintainer_email": "maintainers@giotto.ai",
"keywords": "machine learning,topological data analysis,persistent homology",
"author": "",
"author_email": "",
"download_url": "https://github.com/giotto-ai/giotto-ph/tarball/v0.2.2",
"platform": null,
"description": "\n.. |wheels| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/wheels.yml/badge.svg\n.. _wheels:\n\n.. |ci| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/ci.yml/badge.svg\n.. _ci:\n\n.. |docs| image:: https://github.com/giotto-ai/giotto-ph/actions/workflows/deploy-github-pages.yml/badge.svg\n.. _docs:\n\n|wheels|_ |ci|_ |docs|_\n\n=========\ngiotto-ph\n=========\n\n``giotto-ph`` is a high-performance implementation of Vietoris\u2013Rips (VR) persistence on the CPU, and is distributed under the GNU AGPLv3 license.\nIt consists of an improved reimplementation of `Morozov and Nigmetov's \"lock-free Ripser\" <https://dl.acm.org/doi/10.1145/3350755.3400244>`_\nand in addition makes use of a parallel implementation of the *apparent pairs* optimization used in `Ripser v1.2 <https://github.com/Ripser/ripser>`_.\nIt also contains an improved reimplementation of `GUDHI's Edge Collapse (EC) algorithm <https://hal.inria.fr/hal-02395227>`_ and offers support\nfor weighted VR filtrations. See also `Morozov's Ripser fork <https://github.com/mrzv/ripser/tree/lockfree>`_, Nigmetov's\n`Oineus library <https://github.com/grey-narn/oineus>`_, and `GUDHI's EC implementation <http://gudhi.gforge.inria.fr/doc/latest/group__edge__collapse.html>`_.\n\n``giotto-ph`` is part of the `Giotto <https://github.com/giotto-ai>`_ family of open-source projects and designed for tight integration with\nthe `giotto-tda <https://github.com/giotto-ai/giotto-tda>`_ and `pyflagser <https://github.com/giotto-ai/giotto-tda>`_ libraries.\n\n\nProject genesis\n===============\n\n``giotto-ph`` is the result of a collaborative effort between `L2F SA <https://www.l2f.ch/>`_,\nthe `Laboratory for Topology and Neuroscience <https://www.epfl.ch/labs/hessbellwald-lab/>`_ at EPFL,\nand the `Institute of Reconfigurable & Embedded Digital Systems (REDS) <https://heig-vd.ch/en/research/reds>`_ of HEIG-VD.\n\n\nLicense\n=======\n\n.. _L2F team: business@l2f.ch\n\n``giotto-ph`` is distributed under the AGPLv3 `license <https://github.com/giotto-ai/giotto-tda/blob/master/LICENSE>`_.\nIf you need a different distribution license, please contact the `L2F team`_.\n\n\nParallel persistent homology backend\n====================================\n\nComputing persistence barcodes of large datasets and in high homology degrees is challenging even on modern hardware. ``giotto-ph``'s persistent homology backend\nis able to distribute the key stages of the computation (namely, search for apparent pairs and coboundary matrix reduction) across an arbitrary number of available CPU threads.\n\nOn challenging datasets, the scaling is quite favourable as shown in the following figure (for more details, see our paper linked below):\n\n.. image:: https://raw.githubusercontent.com/giotto-ai/giotto-ph/main/docs/images/multithreading_speedup.svg\n :width: 500px\n :align: center\n\n\nBasic usage in Python\n=====================\n\nBasic imports:\n\n.. code-block:: python\n \n import numpy as np\n from gph import ripser_parallel\n\nPoint clouds\n------------\n\nPersistence diagram of a random point cloud of 100 points in 3D Euclidean space, up to homology dimension 2, using all available threads:\n\n.. code-block:: python\n\n pc = np.random.random((100, 3))\n dgm = ripser_parallel(pc, maxdim=2, n_threads=-1)\n\nDistance matrices and graphs\n----------------------------\n\nYou can also work with distance matrices by passing ``metric=\"precomputed\"``:\n\n.. code-block:: python\n\n from scipy.spatial.distance import pdist, squareform\n \n # A distance matrix\n dm = squareform(pdist(pc))\n dgm = ripser_parallel(pc, metric=\"precomputed\", maxdim=2, n_threads=-1)\n\nMore generally, you can work with dense or sparse adjacency matrices of weighted graphs. Here is a dense square matrix interpreted as the adjacency matrix of a fully connected weighted graph with 100 vertices:\n\n.. code-block:: python\n\n # Entries can be negative. The only constraint is that, for every i and j, dm[i, j] \u2265 max(dm[i, i], dm[j, j])\n # With dense input, the lower diagonal is ignored\n adj_dense = np.random.random((100, 100))\n np.fill_diagonal(adj_dense, 0)\n dgm = ripser_parallel(adj_dense, metric=\"precomputed\", maxdim=2, n_threads=-1)\n\nAnd here is a sparse adjacency matrix:\n\n.. code-block:: python\n\n # See API reference for treatment of entries below the diagonal\n from scipy.sparse import random\n adj_sparse = random(100, 100, density=0.1)\n dgm = ripser_parallel(adj_sparse, metric=\"precomputed\", maxdim=2, n_threads=-1)\n\nEdge Collapser\n--------------\n\nPush the computation to higher homology dimensions and larger point clouds/distance matrices/adjacency matrices using edge collapses:\n\n.. code-block:: python\n\n dgm_higher = ripser_parallel(pc, maxdim=5, collapse_edges=True, n_threads=-1)\n\n(Note: not all datasets and configurations will benefit from edge collapses. For more details, see our paper below.)\n\nWeighted Rips Filtrations\n-------------------------\n\nUse the ``weights`` and ``weight_params`` parameters to constructed a weighted Rips filtration as defined in `this paper <https://doi.org/10.1007/978-3-030-43408-3_2>`_. ``weights`` can either be a custom 1D array of vertex weights, or the string ``\"DTM\"`` for distance-to-measure reweighting:\n\n.. code-block:: python\n\n dgm_dtm = ripser_parallel(pc, weights=\"DTM\", n_threads=-1)\n\n\nDocumentation and Tutorials\n===========================\n\nJupyter notebook tutorials can be found in the `examples folder <https://github.com/giotto-ai/giotto-ph/blob/main/examples>`_.\nThe API reference can be found at https://giotto-ai.github.io/giotto-ph.\n\n\nInstallation\n============\n\nDependencies\n------------\n\nThe latest stable version of ``giotto-ph`` requires:\n\n- Python (>= 3.6)\n- NumPy (>= 1.19.1)\n- SciPy (>= 1.5.0)\n- scikit-learn (>= 0.23.1)\n\nUser installation\n-----------------\n\nThe simplest way to install ``giotto-ph`` is using ``pip`` ::\n\n python -m pip install -U giotto-ph\n\nIf necessary, this will also automatically install all the above dependencies. Note: we recommend\nupgrading ``pip`` to a recent version as the above may fail on very old versions.\n\nDeveloper installation\n----------------------\n\nPlease consult the `dedicated page <https://giotto-ai.github.io/giotto-ph/build/html/installation.html#developer-installation>`_\nfor detailed instructions on how to build ``giotto-ph`` from sources across different platforms.\n\n.. _contributing-section:\n\n\nContributing\n============\n\nWe welcome new contributors of all experience levels. The Giotto community goals are to be helpful, welcoming,\nand effective. To learn more about making a contribution to ``giotto-ph``, please consult `the relevant page\n<https://giotto-ai.github.io/gtda-docs/latest/contributing/index.html>`_.\n\nTesting\n-------\n\nAfter installation, you can launch the test suite from inside the\nsource directory ::\n\n pytest gph\n\n\nImportant links\n===============\n\n- Issue tracker: https://github.com/giotto-ai/giotto-ph/issues\n\n\nCiting giotto-ph\n=================\n\nIf you use ``giotto-ph`` in a scientific publication, we would appreciate citations to the following paper:\n\n `giotto-ph: A Python Library for High-Performance Computation of Persistent Homology of Vietoris\u2013Rips Filtrations <https://arxiv.org/abs/2107.05412>`_, Burella P\u00e9rez *et al*, arXiv:2107.05412, 2021.\n\nYou can use the following BibTeX entry:\n\n.. code:: bibtex\n\n @misc{burella2021giottoph,\n title={giotto-ph: A Python Library for High-Performance Computation of Persistent Homology of Vietoris--Rips Filtrations},\n author={Juli\u00e1n Burella P\u00e9rez and Sydney Hauke and Umberto Lupo and Matteo Caorsi and Alberto Dassatti},\n year={2021},\n eprint={2107.05412},\n archivePrefix={arXiv},\n primaryClass={cs.CG}\n }\n\n\nCommunity\n=========\n\ngiotto-ai Slack workspace: https://slack.giotto.ai/\n\nContacts\n========\n\nmaintainers@giotto.ai\n\n\n",
"bugtrack_url": null,
"license": "GNU AGPLv3",
"summary": "High performance tool for Persistent Homology computations.",
"version": "0.2.2",
"project_urls": {
"Download": "https://github.com/giotto-ai/giotto-ph/tarball/v0.2.2",
"Homepage": "https://github.com/giotto-ai/giotto-ph"
},
"split_keywords": [
"machine learning",
"topological data analysis",
"persistent homology"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "01bae98f061d1b3367f3feac3841817d7b1ef412bd9a5c9e1681af3222a0c00d",
"md5": "b6a05cdc8a2d49f3f4b1f7b52b76078c",
"sha256": "fb41b484775095c9de5ab28b20844aab3cfe942a4a2fee079141e33a5e3bbe80"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp310-cp310-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "b6a05cdc8a2d49f3f4b1f7b52b76078c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 709954,
"upload_time": "2022-08-17T11:59:28",
"upload_time_iso_8601": "2022-08-17T11:59:28.824380Z",
"url": "https://files.pythonhosted.org/packages/01/ba/e98f061d1b3367f3feac3841817d7b1ef412bd9a5c9e1681af3222a0c00d/giotto_ph-0.2.2-cp310-cp310-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "90070d2a0a3a6afb807376031079b112e10510c5bbff2d543ec32c401847cac3",
"md5": "1b436b25bc73e04814fffad95a237f8d",
"sha256": "b970dc0cb1b49848f28de5f860f9431af28e723f623a19f93fa36ea889e66551"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "1b436b25bc73e04814fffad95a237f8d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 526442,
"upload_time": "2022-08-17T11:59:31",
"upload_time_iso_8601": "2022-08-17T11:59:31.274984Z",
"url": "https://files.pythonhosted.org/packages/90/07/0d2a0a3a6afb807376031079b112e10510c5bbff2d543ec32c401847cac3/giotto_ph-0.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "01931114f10265f5641af674a52816316bcd793eabf41a441e3ec12b13b52ae1",
"md5": "103b82c803c7e524190bcf020fa1b083",
"sha256": "63a02ac472d6013ca87f4e5c54cf7773e60d67272a6aac6aa8d4d06e504a14b1"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "103b82c803c7e524190bcf020fa1b083",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 374818,
"upload_time": "2022-08-17T11:59:33",
"upload_time_iso_8601": "2022-08-17T11:59:33.738320Z",
"url": "https://files.pythonhosted.org/packages/01/93/1114f10265f5641af674a52816316bcd793eabf41a441e3ec12b13b52ae1/giotto_ph-0.2.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7d69705dd702b17127c83ceca634f5ca5fd3cc0a7ceb5c5980d3b7971c2221bc",
"md5": "c840d1a1f48f69d4f692a046c040a823",
"sha256": "6c706aa06a19b85311caa49f3009d00f280d639fa5a560670b4099808c010099"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "c840d1a1f48f69d4f692a046c040a823",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 382019,
"upload_time": "2022-08-17T11:59:35",
"upload_time_iso_8601": "2022-08-17T11:59:35.689113Z",
"url": "https://files.pythonhosted.org/packages/7d/69/705dd702b17127c83ceca634f5ca5fd3cc0a7ceb5c5980d3b7971c2221bc/giotto_ph-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8c1860c009ef8c49967bc77c6d37a9c56a70d6b8540c4f2d955a7099fa6d1acb",
"md5": "aaff323cf7b32c3588a3ee27119a819c",
"sha256": "870a4e3d096950250356722cadb2906f631b981682d517b87552ed28bedf3858"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "aaff323cf7b32c3588a3ee27119a819c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 529367,
"upload_time": "2022-08-17T11:59:37",
"upload_time_iso_8601": "2022-08-17T11:59:37.937830Z",
"url": "https://files.pythonhosted.org/packages/8c/18/60c009ef8c49967bc77c6d37a9c56a70d6b8540c4f2d955a7099fa6d1acb/giotto_ph-0.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b19c6f89de1fac3b2391b7c811ec9849e8f9d7eeb06c959ca44fe29f5fdb939f",
"md5": "866d75bac47fd46d39f078109f71da1f",
"sha256": "66eb4988c9303c9e1ed05101f925309b105c94ad03bfc0c610e78666ee84349d"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "866d75bac47fd46d39f078109f71da1f",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 377670,
"upload_time": "2022-08-17T11:59:40",
"upload_time_iso_8601": "2022-08-17T11:59:40.384103Z",
"url": "https://files.pythonhosted.org/packages/b1/9c/6f89de1fac3b2391b7c811ec9849e8f9d7eeb06c959ca44fe29f5fdb939f/giotto_ph-0.2.2-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c6fb7c342c27c6d9345cf2a4ec1c4307918762a6ea4476f13a2fa282401c470c",
"md5": "f60b6383f2e91e208370d1fbd5c678ed",
"sha256": "25e0eb6aca72a5a6c58a0f79a4ee8bda0cc502ab5af9a2d9c5bf988778b8b544"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp38-cp38-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "f60b6383f2e91e208370d1fbd5c678ed",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 710194,
"upload_time": "2022-08-17T11:59:41",
"upload_time_iso_8601": "2022-08-17T11:59:41.953597Z",
"url": "https://files.pythonhosted.org/packages/c6/fb/7c342c27c6d9345cf2a4ec1c4307918762a6ea4476f13a2fa282401c470c/giotto_ph-0.2.2-cp38-cp38-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9bb36100d864f4eb44e2cb34573f9f3fa0aec8f0da526e4b39c7ee7fc3b8de75",
"md5": "078fe6059ca77f2c75d59bc1fccd7e96",
"sha256": "bc6646b00c0b91709b5d208eaae8b84a264bf53d66714ded9a131d809a4c2da7"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "078fe6059ca77f2c75d59bc1fccd7e96",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 526105,
"upload_time": "2022-08-17T11:59:44",
"upload_time_iso_8601": "2022-08-17T11:59:44.086420Z",
"url": "https://files.pythonhosted.org/packages/9b/b3/6100d864f4eb44e2cb34573f9f3fa0aec8f0da526e4b39c7ee7fc3b8de75/giotto_ph-0.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2b4371fa461c1a50b307dc2b9d8a801bc734b79b4cbcf04440fa07a5c58e7500",
"md5": "8882cf0fd64724a233b732a1a8e3cc5c",
"sha256": "3e92b37c6469a3b10417c59b6ff464c99facfd20356b06c1c7b92e6e1ae9b4dc"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "8882cf0fd64724a233b732a1a8e3cc5c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 374175,
"upload_time": "2022-08-17T11:59:46",
"upload_time_iso_8601": "2022-08-17T11:59:46.186531Z",
"url": "https://files.pythonhosted.org/packages/2b/43/71fa461c1a50b307dc2b9d8a801bc734b79b4cbcf04440fa07a5c58e7500/giotto_ph-0.2.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1aab1557f2a22f45b2b90a41283707b89afad97898c5530a53df4616a7888fd1",
"md5": "50b50f9dbe260f9b9da8a1df36c29d8f",
"sha256": "3b5ef5ad7b518b3e710ab4ebde8f907f21e3432bb41cf98ca68a49f9d6e9f93c"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp39-cp39-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "50b50f9dbe260f9b9da8a1df36c29d8f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 710629,
"upload_time": "2022-08-17T11:59:50",
"upload_time_iso_8601": "2022-08-17T11:59:50.973729Z",
"url": "https://files.pythonhosted.org/packages/1a/ab/1557f2a22f45b2b90a41283707b89afad97898c5530a53df4616a7888fd1/giotto_ph-0.2.2-cp39-cp39-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3c06da63c2e139b6e18bfc6d87d9628736b5c5d2a6639fa43779d9ffe5101585",
"md5": "8011239dba0ac9d7f160724b77ec45a5",
"sha256": "be88b5a9f01fda76a5b2a8170ff971152d2479b74e43c9aac8eb8e9de055752b"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8011239dba0ac9d7f160724b77ec45a5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 527020,
"upload_time": "2022-08-17T11:59:52",
"upload_time_iso_8601": "2022-08-17T11:59:52.892880Z",
"url": "https://files.pythonhosted.org/packages/3c/06/da63c2e139b6e18bfc6d87d9628736b5c5d2a6639fa43779d9ffe5101585/giotto_ph-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5f06e2ca1531d40c4c2027657cacc6a6744baaa7eb1e2d0cfe39f82b62357a2f",
"md5": "5bcf59c1698d154f75f2a3b24d06216e",
"sha256": "1ebd2e821955ffffc464ed3285b8feae1f8d168563e6d30cf45ab93cece359c5"
},
"downloads": -1,
"filename": "giotto_ph-0.2.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5bcf59c1698d154f75f2a3b24d06216e",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 374967,
"upload_time": "2022-08-17T11:59:54",
"upload_time_iso_8601": "2022-08-17T11:59:54.604889Z",
"url": "https://files.pythonhosted.org/packages/5f/06/e2ca1531d40c4c2027657cacc6a6744baaa7eb1e2d0cfe39f82b62357a2f/giotto_ph-0.2.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-08-17 11:59:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "giotto-ai",
"github_project": "giotto-ph",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "giotto-ph"
}