polytopewalk


Namepolytopewalk JSON
Version 1.0.16 PyPI version JSON
download
home_pageNone
SummaryOpen Source Implementation of MCMC Polytope Walks
upload_time2024-12-10 23:37:31
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords mcmc dikin walk vaidya walk john walk lee sidford walk sparse sampling
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
  <img src="https://raw.githubusercontent.com/ethz-randomwalk/polytopewalk/main/docs/logo1.png" width="1000" object-fit = "cover">
</p>

![Python](https://img.shields.io/pypi/pyversions/polytopewalk.svg)
![PyPI](https://img.shields.io/pypi/v/polytopewalk)
![ciwheels](https://github.com/ethz-randomwalk/polytopewalk/actions/workflows/ciwheels.yml/badge.svg?branch=main)

# PolytopeWalk
**PolytopeWalk** is a `C++` library for running MCMC sampling algorithms to generate samples from a uniform distribution over a polytope with a `Python` interface. It handles preprocessing of the polytope and initialization as well. Current implementations include the Dikin Walk, John Walk, Vaidya Walk, Ball Walk, Lee Sidford Walk, and Hit-and-Run in both the full-dimensional formulation and the sparse constrained formulation. Code includes facial reduction and initialization algorithms for pre-processing as well. Example code that samples from both real polytopes from a data set and artificial polytopes are shown in the Examples folder. Finally, for documentation, please visit our webpage: https://polytopewalk.readthedocs.io/en/latest/ and read our paper on arXiv here: https://arxiv.org/abs/2412.06629. 

## Code Structure

<p align="center">
  <img src="https://raw.githubusercontent.com/ethz-randomwalk/polytopewalk/main/docs/code_design1.png" width="750" object-fit = "cover">
</p>

## Implemented Algorithms
Let `d` be the dimension of the polytope, `n` be the number of boundaries, and `R/r` be where the convex body contains a ball of radius `r` and is mostly contained in a ball of radius `R`. We implement the following 6 MCMC sampling algorithms for uniform sampling over polytopes.  

| Name      | Mixing Time | Author |
| ------------ | ----------------- | ------------------- |
| `Ball Walk`   | $\tau(d^2R^2/r^2)$        | [Vempala (2005)](https://faculty.cc.gatech.edu/~vempala/papers/survey.pdf)       |
| `Hit and Run`   | $\tau(d^2R^2/r^2)$         | [Lovasz (1999)](https://link.springer.com/content/pdf/10.1007/s101070050099.pdf)         |
| `Dikin Walk`   | $\tau(nd)$         | [Sachdeva and Vishnoi (2015)](https://arxiv.org/pdf/1508.01977)     |
| `Vaidya Walk`   | $\tau(n^{1/2}d^{3/2})$        |   [Chen et al. (2018)](https://jmlr.org/papers/v19/18-158.html)       |
| `John Walk`   | $\tau(d^{2.5})$        | [Chen et al. (2018)](https://jmlr.org/papers/v19/18-158.html)           |
| `Lee Sidford Walk`   | $\tau(d^{2})$         | [Laddha et al. (2019)](https://arxiv.org/abs/1911.05656)          |

For each implemented algorithm, we provide the full-dimensional formulation and the sparse constrained formulation. Each polytope can be expressed from 1 formulation to the other. The main benefit of utilizing the constrained formulation is that it maintains sparse operations in A, ensuring scalability in higher dimensions. Many of the `netlib` dataset sparse polytopes are represented in this formulation. The formulations are specified below. 

In the full-dimensional formulation with dense matrix A ($n$ x $d$ matrix) and vector b ($n$ dimensional vector), we specify the following: 

![equation](https://latex.codecogs.com/svg.image?\large&space;\mathcal{K}_1=\[x\in\mathbb{R}^d|Ax\le&space;b\])

where the polytope is specified with $n$ constraints.

In the constrained formulation with sparse matrix A ($n$ x $d$ matrix) and vector b ($n$ dimensional vector), we specify the following: 

![equation](https://latex.codecogs.com/svg.image?\large&space;\mathcal{K}_2=\[x\in\mathbb{R}^d|Ax=b,x\succeq_k&space;0\])

where the polytope is specified with $n$ equality constraints and $k$ coordinate-wise inequality constraints.



## Installation

### Dependencies
polytopewalk requires:
- Python (>= 3.9)
- NumPy (>= 1.20)
- SciPy (>= 1.6.0)

### User installation
If you already have a working installation of NumPy and SciPy, the easiest way to install polytopewalk is using `pip`:
```bash
pip install -U polytopewalk
```


## Developer Installation Instructions 

### Important links
- Official source code repo: https://github.com/ethz-randomwalk/polytopewalk
- Download releases: https://pypi.org/project/polytopewalk/

### Install prerequisites
(listed in each of the operating systems)
- macOS: ``brew install eigen glpk``
- Linux:
    - Ubuntu ``sudo apt-get install -y libeigen3-dev libglpk-dev``
    - CentOS ``yum install -y epel-release eigen3-devel glpk-devel``
- Windows: ``choco install eigen -y``
    - Then, install winglpk from sourceforge

### Local install from source via pip
```bash
git clone https://github.com/ethz-randomwalk/polytopewalk.git
cd polytopewalk
pip install .
```


### Compile C++ from source (not necessary)
Only do this, if there is need to run and test C++ code directly. For normal users, we recommend only using the Python interface. 

Build with cmake
```bash
git clone https://github.com/ethz-randomwalk/polytopewalk.git && cd polytopewalk
cmake -B build -S .
make
sudo make install
```

## Examples
The `examples` folder provides examples of sampling from both sparse (constrained) and dense (full-dimensional) formulations of the MCMC sampling algorithms. We test our random walk algorithms on family of 3 structured polytopes and 3 real life polytopes from `netlib`. The lines below show a quick demonstration of sampling from a polytope using a sparse MCMC algorithm. 
```python
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix, csr_array
from polytopewalk.sparse import SparseDikinWalk

def generate_simplex(d):
    return np.array([1/d] * d), np.array([[1] * d]), np.array([1]), d, 'simplex'

x, A, b, k, name = generate_simplex(5)
sparse_dikin = SparseDikinWalk(r = 0.9, thin = 1)
dikin_res = sparse_dikin.generateCompleteWalk(10_000, x, A, b, k, burn = 100)
```
We can also provide a corollary example using the dense formulation.
```python
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix, csr_array
from polytopewalk.dense import DikinWalk
from polytopewalk import FacialReduction

def generate_simplex(d):
    return np.array([1/d] * d), np.array([[1] * d]), np.array([1]), d, 'simplex'

fr = FacialReduction()
_, A, b, k, name = generate_simplex(5)

polytope = fr.reduce(A, b, k, sparse = False)
dense_A = polytope.dense_A
dense_b = polytope.dense_b

dc = DenseCenter()
init = dc.getInitialPoint(dense_A, dense_b)

dikin_res = dikin.generateCompleteWalk(1_000, init, dense_A, dense_b, burn = 100)
```

## Testing
The `tests` folder includes comprehensives tests of the Facial Reduction algorithm, Initialization, Weights from MCMC algorithms, and Sparse/Dense Random Walk algorithms in both Python and C++. The user can run each of the files separately to make sure the package passes all of the test suites.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "polytopewalk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "MCMC, Dikin Walk, Vaidya Walk, John Walk, Lee Sidford Walk, Sparse, Sampling",
    "author": null,
    "author_email": "Benny Sun <benny.sun@duke.edu>, Yuansi Chen <yuansi.chen@stat.math.ethz.ch>",
    "download_url": "https://files.pythonhosted.org/packages/30/b8/dcc4245b73704cdb69aba59ed7ffaffc43ed6fbc9d19e66aabda733adf15/polytopewalk-1.0.16.tar.gz",
    "platform": null,
    "description": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/ethz-randomwalk/polytopewalk/main/docs/logo1.png\" width=\"1000\" object-fit = \"cover\">\n</p>\n\n![Python](https://img.shields.io/pypi/pyversions/polytopewalk.svg)\n![PyPI](https://img.shields.io/pypi/v/polytopewalk)\n![ciwheels](https://github.com/ethz-randomwalk/polytopewalk/actions/workflows/ciwheels.yml/badge.svg?branch=main)\n\n# PolytopeWalk\n**PolytopeWalk** is a `C++` library for running MCMC sampling algorithms to generate samples from a uniform distribution over a polytope with a `Python` interface. It handles preprocessing of the polytope and initialization as well. Current implementations include the Dikin Walk, John Walk, Vaidya Walk, Ball Walk, Lee Sidford Walk, and Hit-and-Run in both the full-dimensional formulation and the sparse constrained formulation. Code includes facial reduction and initialization algorithms for pre-processing as well. Example code that samples from both real polytopes from a data set and artificial polytopes are shown in the Examples folder. Finally, for documentation, please visit our webpage: https://polytopewalk.readthedocs.io/en/latest/ and read our paper on arXiv here: https://arxiv.org/abs/2412.06629. \n\n## Code Structure\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/ethz-randomwalk/polytopewalk/main/docs/code_design1.png\" width=\"750\" object-fit = \"cover\">\n</p>\n\n## Implemented Algorithms\nLet `d` be the dimension of the polytope, `n` be the number of boundaries, and `R/r` be where the convex body contains a ball of radius `r` and is mostly contained in a ball of radius `R`. We implement the following 6 MCMC sampling algorithms for uniform sampling over polytopes.  \n\n| Name      | Mixing Time | Author |\n| ------------ | ----------------- | ------------------- |\n| `Ball Walk`   | $\\tau(d^2R^2/r^2)$        | [Vempala (2005)](https://faculty.cc.gatech.edu/~vempala/papers/survey.pdf)       |\n| `Hit and Run`   | $\\tau(d^2R^2/r^2)$         | [Lovasz (1999)](https://link.springer.com/content/pdf/10.1007/s101070050099.pdf)         |\n| `Dikin Walk`   | $\\tau(nd)$         | [Sachdeva and Vishnoi (2015)](https://arxiv.org/pdf/1508.01977)     |\n| `Vaidya Walk`   | $\\tau(n^{1/2}d^{3/2})$        |   [Chen et al. (2018)](https://jmlr.org/papers/v19/18-158.html)       |\n| `John Walk`   | $\\tau(d^{2.5})$        | [Chen et al. (2018)](https://jmlr.org/papers/v19/18-158.html)           |\n| `Lee Sidford Walk`   | $\\tau(d^{2})$         | [Laddha et al. (2019)](https://arxiv.org/abs/1911.05656)          |\n\nFor each implemented algorithm, we provide the full-dimensional formulation and the sparse constrained formulation. Each polytope can be expressed from 1 formulation to the other. The main benefit of utilizing the constrained formulation is that it maintains sparse operations in A, ensuring scalability in higher dimensions. Many of the `netlib` dataset sparse polytopes are represented in this formulation. The formulations are specified below. \n\nIn the full-dimensional formulation with dense matrix A ($n$ x $d$ matrix) and vector b ($n$ dimensional vector), we specify the following: \n\n![equation](https://latex.codecogs.com/svg.image?\\large&space;\\mathcal{K}_1=\\[x\\in\\mathbb{R}^d|Ax\\le&space;b\\])\n\nwhere the polytope is specified with $n$ constraints.\n\nIn the constrained formulation with sparse matrix A ($n$ x $d$ matrix) and vector b ($n$ dimensional vector), we specify the following: \n\n![equation](https://latex.codecogs.com/svg.image?\\large&space;\\mathcal{K}_2=\\[x\\in\\mathbb{R}^d|Ax=b,x\\succeq_k&space;0\\])\n\nwhere the polytope is specified with $n$ equality constraints and $k$ coordinate-wise inequality constraints.\n\n\n\n## Installation\n\n### Dependencies\npolytopewalk requires:\n- Python (>= 3.9)\n- NumPy (>= 1.20)\n- SciPy (>= 1.6.0)\n\n### User installation\nIf you already have a working installation of NumPy and SciPy, the easiest way to install polytopewalk is using `pip`:\n```bash\npip install -U polytopewalk\n```\n\n\n## Developer Installation Instructions \n\n### Important links\n- Official source code repo: https://github.com/ethz-randomwalk/polytopewalk\n- Download releases: https://pypi.org/project/polytopewalk/\n\n### Install prerequisites\n(listed in each of the operating systems)\n- macOS: ``brew install eigen glpk``\n- Linux:\n    - Ubuntu ``sudo apt-get install -y libeigen3-dev libglpk-dev``\n    - CentOS ``yum install -y epel-release eigen3-devel glpk-devel``\n- Windows: ``choco install eigen -y``\n    - Then, install winglpk from sourceforge\n\n### Local install from source via pip\n```bash\ngit clone https://github.com/ethz-randomwalk/polytopewalk.git\ncd polytopewalk\npip install .\n```\n\n\n### Compile C++ from source (not necessary)\nOnly do this, if there is need to run and test C++ code directly. For normal users, we recommend only using the Python interface. \n\nBuild with cmake\n```bash\ngit clone https://github.com/ethz-randomwalk/polytopewalk.git && cd polytopewalk\ncmake -B build -S .\nmake\nsudo make install\n```\n\n## Examples\nThe `examples` folder provides examples of sampling from both sparse (constrained) and dense (full-dimensional) formulations of the MCMC sampling algorithms. We test our random walk algorithms on family of 3 structured polytopes and 3 real life polytopes from `netlib`. The lines below show a quick demonstration of sampling from a polytope using a sparse MCMC algorithm. \n```python\nimport numpy as np\nfrom scipy.sparse import csr_matrix, lil_matrix, csr_array\nfrom polytopewalk.sparse import SparseDikinWalk\n\ndef generate_simplex(d):\n    return np.array([1/d] * d), np.array([[1] * d]), np.array([1]), d, 'simplex'\n\nx, A, b, k, name = generate_simplex(5)\nsparse_dikin = SparseDikinWalk(r = 0.9, thin = 1)\ndikin_res = sparse_dikin.generateCompleteWalk(10_000, x, A, b, k, burn = 100)\n```\nWe can also provide a corollary example using the dense formulation.\n```python\nimport numpy as np\nfrom scipy.sparse import csr_matrix, lil_matrix, csr_array\nfrom polytopewalk.dense import DikinWalk\nfrom polytopewalk import FacialReduction\n\ndef generate_simplex(d):\n    return np.array([1/d] * d), np.array([[1] * d]), np.array([1]), d, 'simplex'\n\nfr = FacialReduction()\n_, A, b, k, name = generate_simplex(5)\n\npolytope = fr.reduce(A, b, k, sparse = False)\ndense_A = polytope.dense_A\ndense_b = polytope.dense_b\n\ndc = DenseCenter()\ninit = dc.getInitialPoint(dense_A, dense_b)\n\ndikin_res = dikin.generateCompleteWalk(1_000, init, dense_A, dense_b, burn = 100)\n```\n\n## Testing\nThe `tests` folder includes comprehensives tests of the Facial Reduction algorithm, Initialization, Weights from MCMC algorithms, and Sparse/Dense Random Walk algorithms in both Python and C++. The user can run each of the files separately to make sure the package passes all of the test suites.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Open Source Implementation of MCMC Polytope Walks",
    "version": "1.0.16",
    "project_urls": null,
    "split_keywords": [
        "mcmc",
        " dikin walk",
        " vaidya walk",
        " john walk",
        " lee sidford walk",
        " sparse",
        " sampling"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "39995defd8e97e77c0e757fe7b119a33daf256f4409b236a210253ea3fb57d9e",
                "md5": "6b97bbd4562841b4ea26b80295287160",
                "sha256": "abeebbe7d3be304a8ec8a8f1c72d3a71568d1ba38813122acc3f6449e0ba2a93"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp310-cp310-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "6b97bbd4562841b4ea26b80295287160",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 913911,
            "upload_time": "2024-12-10T23:42:51",
            "upload_time_iso_8601": "2024-12-10T23:42:51.868994Z",
            "url": "https://files.pythonhosted.org/packages/39/99/5defd8e97e77c0e757fe7b119a33daf256f4409b236a210253ea3fb57d9e/polytopewalk-1.0.16-cp310-cp310-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "797776b8896ede551fca80c5ca19e5d0e9a088e15cc29c632d49de708fca8b71",
                "md5": "406f5aa49f1aeb84dc2cd5b3d8610044",
                "sha256": "28ac34f241c31810f3c4938a2817c13e5c3c92728b78a76f66b167d20c1fcbd9"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "406f5aa49f1aeb84dc2cd5b3d8610044",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 959539,
            "upload_time": "2024-12-10T23:42:53",
            "upload_time_iso_8601": "2024-12-10T23:42:53.754023Z",
            "url": "https://files.pythonhosted.org/packages/79/77/76b8896ede551fca80c5ca19e5d0e9a088e15cc29c632d49de708fca8b71/polytopewalk-1.0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2e08b12e38510d293d0f831973a405938dc096c7e9a07b01b9d6edb9e2a215fb",
                "md5": "a1ec027a0092924c64da87d41580cf0c",
                "sha256": "6dd65832a08db8eebdabbe70422dad55889d95fce7ebbd9cd3b64a06a473ac8a"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a1ec027a0092924c64da87d41580cf0c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 310665,
            "upload_time": "2024-12-10T23:42:56",
            "upload_time_iso_8601": "2024-12-10T23:42:56.308217Z",
            "url": "https://files.pythonhosted.org/packages/2e/08/b12e38510d293d0f831973a405938dc096c7e9a07b01b9d6edb9e2a215fb/polytopewalk-1.0.16-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ed2ba85921d20051f8ff0fc0b7689cab2e8288140353d4ad9e85425a164a971f",
                "md5": "68d1e4f7706fa517d8d0ad28b57c2ab4",
                "sha256": "b9992398aa401d85d97f309b2d40df078e1551c2133ebff13f85e1ce596e6627"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp311-cp311-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "68d1e4f7706fa517d8d0ad28b57c2ab4",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 915345,
            "upload_time": "2024-12-10T23:42:57",
            "upload_time_iso_8601": "2024-12-10T23:42:57.828034Z",
            "url": "https://files.pythonhosted.org/packages/ed/2b/a85921d20051f8ff0fc0b7689cab2e8288140353d4ad9e85425a164a971f/polytopewalk-1.0.16-cp311-cp311-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f55af6462da76a1cd079e58b803a2043e79c1910a522f5dd8522635b66437756",
                "md5": "521c8e37f50d3f6371fbf3737e035e6e",
                "sha256": "d4338a56de8b436e9d78b8fa75cd2fe00448269f8c56b412e8d02522709a006d"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "521c8e37f50d3f6371fbf3737e035e6e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 960754,
            "upload_time": "2024-12-10T23:43:00",
            "upload_time_iso_8601": "2024-12-10T23:43:00.892849Z",
            "url": "https://files.pythonhosted.org/packages/f5/5a/f6462da76a1cd079e58b803a2043e79c1910a522f5dd8522635b66437756/polytopewalk-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6244109ea4e3ba3737d83ea8705d4fbc8bc520c047bdd5ee5fa0d5c0b43b2232",
                "md5": "eb1228d4d57dc2c2929b6964d89e5464",
                "sha256": "6b698e5e84e6c491deb5fc85e9638075cbb52d8e0b3e6dd0d9f2c085d505aba7"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "eb1228d4d57dc2c2929b6964d89e5464",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 312152,
            "upload_time": "2024-12-10T23:43:03",
            "upload_time_iso_8601": "2024-12-10T23:43:03.541739Z",
            "url": "https://files.pythonhosted.org/packages/62/44/109ea4e3ba3737d83ea8705d4fbc8bc520c047bdd5ee5fa0d5c0b43b2232/polytopewalk-1.0.16-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8fd995333f65fbbbb318821143e14bd5171379710c8b61e8461f1e7b4fb1d0d5",
                "md5": "c43ae4b41984b7fc326fd7d875d521b6",
                "sha256": "d7be0cd56ee685ee83308f1d9c0fce4cfc6015352a23baca94638447f2b377dd"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp312-cp312-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c43ae4b41984b7fc326fd7d875d521b6",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 915701,
            "upload_time": "2024-12-10T23:43:04",
            "upload_time_iso_8601": "2024-12-10T23:43:04.952438Z",
            "url": "https://files.pythonhosted.org/packages/8f/d9/95333f65fbbbb318821143e14bd5171379710c8b61e8461f1e7b4fb1d0d5/polytopewalk-1.0.16-cp312-cp312-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7bce385cbf478408639405d530360e8fd78c8d4113395274c75374aa8f0152e5",
                "md5": "6d294110e256398747fe8343d62804d5",
                "sha256": "f8126ff513e63f49bd1e1579359cb74698df49f428c110c7452349e4754af77a"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6d294110e256398747fe8343d62804d5",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 960575,
            "upload_time": "2024-12-10T23:43:06",
            "upload_time_iso_8601": "2024-12-10T23:43:06.397403Z",
            "url": "https://files.pythonhosted.org/packages/7b/ce/385cbf478408639405d530360e8fd78c8d4113395274c75374aa8f0152e5/polytopewalk-1.0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "74e32270a175d03d6ef45ca89698a822101ceb8535bf192658c02e998b858fc4",
                "md5": "024658f80b78e290032557003622c91b",
                "sha256": "2de0f29708e3cf7b6c1a5f9778d89170249a6c221e27c2ad3f05114e1cf825f9"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "024658f80b78e290032557003622c91b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 311668,
            "upload_time": "2024-12-10T23:43:07",
            "upload_time_iso_8601": "2024-12-10T23:43:07.771599Z",
            "url": "https://files.pythonhosted.org/packages/74/e3/2270a175d03d6ef45ca89698a822101ceb8535bf192658c02e998b858fc4/polytopewalk-1.0.16-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "79236cf53f4f1b059359897ecc9eac2bb5848a7a19195c95331826ced6af0a27",
                "md5": "63c1ce71f43adf26d9c4ea6f20e2e7cc",
                "sha256": "078dd7672eb536980b509a02c8063d521e6130cc431ce422473f03dadb65d407"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp39-cp39-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "63c1ce71f43adf26d9c4ea6f20e2e7cc",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 914020,
            "upload_time": "2024-12-10T23:43:11",
            "upload_time_iso_8601": "2024-12-10T23:43:11.102555Z",
            "url": "https://files.pythonhosted.org/packages/79/23/6cf53f4f1b059359897ecc9eac2bb5848a7a19195c95331826ced6af0a27/polytopewalk-1.0.16-cp39-cp39-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cc2f44ccb4f2153012950ddee38673683aa4c85f13fd1b4bca01dbda24c7b115",
                "md5": "b6f9679d695f551e05a51560ff2e2a83",
                "sha256": "774107789889ddacbfd51dc382a8ee8b5bd92f586e81cde8c02985438a369b9a"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b6f9679d695f551e05a51560ff2e2a83",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 959902,
            "upload_time": "2024-12-10T23:43:13",
            "upload_time_iso_8601": "2024-12-10T23:43:13.867974Z",
            "url": "https://files.pythonhosted.org/packages/cc/2f/44ccb4f2153012950ddee38673683aa4c85f13fd1b4bca01dbda24c7b115/polytopewalk-1.0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "be3893324c87662bad042c455dc34f04eaa02fed7daa85fcaf167d1903731a43",
                "md5": "dbd061d038fecf7394ff7660c487111a",
                "sha256": "e4b23a785f1a5c14229debcc4da3d394c1910fb433e51e4f51c83adefca71177"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "dbd061d038fecf7394ff7660c487111a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 310835,
            "upload_time": "2024-12-10T23:43:16",
            "upload_time_iso_8601": "2024-12-10T23:43:16.666163Z",
            "url": "https://files.pythonhosted.org/packages/be/38/93324c87662bad042c455dc34f04eaa02fed7daa85fcaf167d1903731a43/polytopewalk-1.0.16-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "30b8dcc4245b73704cdb69aba59ed7ffaffc43ed6fbc9d19e66aabda733adf15",
                "md5": "3291257352fc3b33d06cd57e10949071",
                "sha256": "9b249ef7beb4262411e81bbe6f32df7165abd4fa37775a8081723ce8c71b2d07"
            },
            "downloads": -1,
            "filename": "polytopewalk-1.0.16.tar.gz",
            "has_sig": false,
            "md5_digest": "3291257352fc3b33d06cd57e10949071",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 2941323,
            "upload_time": "2024-12-10T23:37:31",
            "upload_time_iso_8601": "2024-12-10T23:37:31.787560Z",
            "url": "https://files.pythonhosted.org/packages/30/b8/dcc4245b73704cdb69aba59ed7ffaffc43ed6fbc9d19e66aabda733adf15/polytopewalk-1.0.16.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-10 23:37:31",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "polytopewalk"
}
        
Elapsed time: 1.29898s