cholespy


Namecholespy JSON
Version 2.1.0 PyPI version JSON
download
home_pageNone
SummaryA self-contained sparse Cholesky solver, compatible with CPU and GPU tensor frameworks.
upload_time2024-08-09 08:35:47
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords sparse cholesky solver cuda
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # What is this repo?

This is a minimalistic, self-contained sparse Cholesky solver, supporting
solving both on the CPU and on the GPU, easily integrable in your tensor
pipeline.

When we were working on our "Large Steps in Inverse Rendering of Geometry" paper
[[1]](#references), we found it quite challenging to hook up an existing sparse
linear solver to our pipeline, and we managed to do so by adding dependencies on
large projects (i.e. `cusparse` and `scikit-sparse`), only to use a small part
of its functionality. Therefore, we decided to implement our own library, that
serves one purpose: efficiently solving sparse linear systems on the GPU or CPU,
using a Cholesky factorization.

Under the hood, it relies on CHOLMOD for sparse matrix factorization. For the
solving phase, it uses CHOLMOD for the CPU version, and uses the result of an
analysis step run *once* when building the solver for fast solving on the GPU
[[2]](#references).

It achieves comparable performance as other frameworks, with the dependencies
nicely shipped along.

<br />
<p align="center">

  <a href="https://bnicolet.com/publications/Nicolet2021Large.html">
    <img src="https://raw.githubusercontent.com/rgl-epfl/cholespy/main/tests/benchmark.jpg" alt="Benchmark" width="100%">
  </a>

  <p align="center">
      Benchmark run on a Linux Ryzen 3990X workstation with a TITAN RTX.
  </p>
</p>

<br />

The Python bindings are generated with
[nanobind](https://github.com/wjakob/nanobind), which makes it easily
interoperable with most tensor frameworks (Numpy, PyTorch, JAX...)


# Installing

## With PyPI (recommended)

```bash
pip install cholespy
```

## From source

```bash
git clone --recursive https://github.com/rgl-epfl/cholespy
pip install ./cholespy
```

# Documentation

There is only one class in the module, with two variants: `CholeskySolverF,
CholeskySolverD`. The only difference is that `CholeskySolverF` solves the
system in single precision while `CholeskySolverD` uses double precision. This
is mostly useful for solving on the GPU, as the CPU version relies on CHOLMOD,
which only supports double precision anyway.

The most common tensor frameworks (PyTorch, NumPy, TensorFlow...) are supported
out of the box. You can pass them directly to the module without any need for
manual conversion.

Since both variants have the same signature, we only detail `CholeskySolverF`
below:

**`cholespy.CholeskySolverF(n_rows, ii, jj, x, type)`**

**Parameters:**
- `n_rows` - The number of rows in the (sparse) matrix.
- `ii` - The first array of indices in the sparse matrix representation. If
  `type` is `COO`, then this is the array of row indices. If it is `CSC` (resp.
  `CSR`), then it is the array of column (resp. row) indices, such that row
  (resp. column) indices for column (resp. row) `k` are stored in
  `jj[ii[k]:ii[k+1]]` and the corresponding entries are in `x[ii[k]:ii[k+1]]`.
- `jj` - The second array of indices in the sparse matrix representation. If
  `type` is `COO`, then this is the array of column indices. If it is `CSC`
  (resp. `CSR`), then it is the array of row (resp. column) indices.
- `x` - The array of nonzero entries.
- `type` - The matrix representation type, of type `MatrixType`. Available types
  are `MatrixType.COO`, `MatrixType.CSC` and `MatrixType.CSR`.

**`cholespy.CholeskySolverF.solve(b, x)`**

**Parameters**
- `b` - Right-hand side of the equation to solve. Can be a vector or a matrix.
  If it is a matrix, it must be of shape `(n_rows, n_rhs)`. It must be on the
  same device as the tensors passed to the solver constructor. If using CUDA
  arrays, then the maximum supported value for `n_rhs` is `128`.
- `x` - Placeholder for the solution. It must be on the same device and have the
  same shape as `b`.

`x` and `b` **must** have the same dtype as the solver used, i.e. `float32` for
`CholeskySolverF` or `float64` for `CholeskySolverD`. Since `x` is modified in
place, implicit type conversion is not supported.

# Example usage

```python
from cholespy import CholeskySolverF, MatrixType
import torch

# Identity matrix
n_rows = 20
rows = torch.arange(n_rows, device='cuda')
cols = torch.arange(n_rows, device='cuda')
data = torch.ones(n_rows, device='cuda')

solver = CholeskySolverF(n_rows, rows, cols, data, MatrixType.COO)

b = torch.ones(n_rows, device='cuda')
x = torch.zeros_like(b)

solver.solve(b, x)
# b = [1, ..., 1]
```

# References

[1] Nicolet, B., Jacobson, A., & Jakob, W. (2021). Large steps in inverse rendering of geometry. ACM Transactions on Graphics (TOG), 40(6), 1-13.

[2] Naumov, M. (2011). Parallel solution of sparse triangular linear systems in the preconditioned iterative methods on the GPU. NVIDIA Corp., Westford, MA, USA, Tech. Rep. NVR-2011, 1.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "cholespy",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "sparse, Cholesky, solver, CUDA",
    "author": null,
    "author_email": "Baptiste Nicolet <baptiste.nicolet@epfl.ch>",
    "download_url": "https://files.pythonhosted.org/packages/a9/f9/9379a33e23e14eae7bc011b4aac83875f7201bb7afd29fc12fcfc21cd2a0/cholespy-2.1.0.tar.gz",
    "platform": null,
    "description": "# What is this repo?\n\nThis is a minimalistic, self-contained sparse Cholesky solver, supporting\nsolving both on the CPU and on the GPU, easily integrable in your tensor\npipeline.\n\nWhen we were working on our \"Large Steps in Inverse Rendering of Geometry\" paper\n[[1]](#references), we found it quite challenging to hook up an existing sparse\nlinear solver to our pipeline, and we managed to do so by adding dependencies on\nlarge projects (i.e. `cusparse` and `scikit-sparse`), only to use a small part\nof its functionality. Therefore, we decided to implement our own library, that\nserves one purpose: efficiently solving sparse linear systems on the GPU or CPU,\nusing a Cholesky factorization.\n\nUnder the hood, it relies on CHOLMOD for sparse matrix factorization. For the\nsolving phase, it uses CHOLMOD for the CPU version, and uses the result of an\nanalysis step run *once* when building the solver for fast solving on the GPU\n[[2]](#references).\n\nIt achieves comparable performance as other frameworks, with the dependencies\nnicely shipped along.\n\n<br />\n<p align=\"center\">\n\n  <a href=\"https://bnicolet.com/publications/Nicolet2021Large.html\">\n    <img src=\"https://raw.githubusercontent.com/rgl-epfl/cholespy/main/tests/benchmark.jpg\" alt=\"Benchmark\" width=\"100%\">\n  </a>\n\n  <p align=\"center\">\n      Benchmark run on a Linux Ryzen 3990X workstation with a TITAN RTX.\n  </p>\n</p>\n\n<br />\n\nThe Python bindings are generated with\n[nanobind](https://github.com/wjakob/nanobind), which makes it easily\ninteroperable with most tensor frameworks (Numpy, PyTorch, JAX...)\n\n\n# Installing\n\n## With PyPI (recommended)\n\n```bash\npip install cholespy\n```\n\n## From source\n\n```bash\ngit clone --recursive https://github.com/rgl-epfl/cholespy\npip install ./cholespy\n```\n\n# Documentation\n\nThere is only one class in the module, with two variants: `CholeskySolverF,\nCholeskySolverD`. The only difference is that `CholeskySolverF` solves the\nsystem in single precision while `CholeskySolverD` uses double precision. This\nis mostly useful for solving on the GPU, as the CPU version relies on CHOLMOD,\nwhich only supports double precision anyway.\n\nThe most common tensor frameworks (PyTorch, NumPy, TensorFlow...) are supported\nout of the box. You can pass them directly to the module without any need for\nmanual conversion.\n\nSince both variants have the same signature, we only detail `CholeskySolverF`\nbelow:\n\n**`cholespy.CholeskySolverF(n_rows, ii, jj, x, type)`**\n\n**Parameters:**\n- `n_rows` - The number of rows in the (sparse) matrix.\n- `ii` - The first array of indices in the sparse matrix representation. If\n  `type` is `COO`, then this is the array of row indices. If it is `CSC` (resp.\n  `CSR`), then it is the array of column (resp. row) indices, such that row\n  (resp. column) indices for column (resp. row) `k` are stored in\n  `jj[ii[k]:ii[k+1]]` and the corresponding entries are in `x[ii[k]:ii[k+1]]`.\n- `jj` - The second array of indices in the sparse matrix representation. If\n  `type` is `COO`, then this is the array of column indices. If it is `CSC`\n  (resp. `CSR`), then it is the array of row (resp. column) indices.\n- `x` - The array of nonzero entries.\n- `type` - The matrix representation type, of type `MatrixType`. Available types\n  are `MatrixType.COO`, `MatrixType.CSC` and `MatrixType.CSR`.\n\n**`cholespy.CholeskySolverF.solve(b, x)`**\n\n**Parameters**\n- `b` - Right-hand side of the equation to solve. Can be a vector or a matrix.\n  If it is a matrix, it must be of shape `(n_rows, n_rhs)`. It must be on the\n  same device as the tensors passed to the solver constructor. If using CUDA\n  arrays, then the maximum supported value for `n_rhs` is `128`.\n- `x` - Placeholder for the solution. It must be on the same device and have the\n  same shape as `b`.\n\n`x` and `b` **must** have the same dtype as the solver used, i.e. `float32` for\n`CholeskySolverF` or `float64` for `CholeskySolverD`. Since `x` is modified in\nplace, implicit type conversion is not supported.\n\n# Example usage\n\n```python\nfrom cholespy import CholeskySolverF, MatrixType\nimport torch\n\n# Identity matrix\nn_rows = 20\nrows = torch.arange(n_rows, device='cuda')\ncols = torch.arange(n_rows, device='cuda')\ndata = torch.ones(n_rows, device='cuda')\n\nsolver = CholeskySolverF(n_rows, rows, cols, data, MatrixType.COO)\n\nb = torch.ones(n_rows, device='cuda')\nx = torch.zeros_like(b)\n\nsolver.solve(b, x)\n# b = [1, ..., 1]\n```\n\n# References\n\n[1] Nicolet, B., Jacobson, A., & Jakob, W. (2021). Large steps in inverse rendering of geometry. ACM Transactions on Graphics (TOG), 40(6), 1-13.\n\n[2] Naumov, M. (2011). Parallel solution of sparse triangular linear systems in the preconditioned iterative methods on the GPU. NVIDIA Corp., Westford, MA, USA, Tech. Rep. NVR-2011, 1.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A self-contained sparse Cholesky solver, compatible with CPU and GPU tensor frameworks.",
    "version": "2.1.0",
    "project_urls": {
        "Homepage": "https://github.com/rgl-epfl/cholespy"
    },
    "split_keywords": [
        "sparse",
        " cholesky",
        " solver",
        " cuda"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6404a7623b76c611957076adf21503f196257d8c4953abe49c7e8f34114b616c",
                "md5": "29f69ef2a1d9394ee5b6d3ac60a17b0f",
                "sha256": "d6128f1c1fede81b054cb2ba09cb0b45ba72619cf0c8ec4dab2a1a522b695314"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp310-cp310-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "29f69ef2a1d9394ee5b6d3ac60a17b0f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1166770,
            "upload_time": "2024-08-09T08:35:14",
            "upload_time_iso_8601": "2024-08-09T08:35:14.894271Z",
            "url": "https://files.pythonhosted.org/packages/64/04/a7623b76c611957076adf21503f196257d8c4953abe49c7e8f34114b616c/cholespy-2.1.0-cp310-cp310-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8ade9f0c4d06251a65482b1c04f5988c6e156811d1cffbd59d36faa12222e1f4",
                "md5": "78c6c69985941a8e874859321eb5cd51",
                "sha256": "315a5d3361a89ea6b4154379c015bf45005f47acefd239257ee49e7e0fba5a6d"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "78c6c69985941a8e874859321eb5cd51",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 977470,
            "upload_time": "2024-08-09T08:35:16",
            "upload_time_iso_8601": "2024-08-09T08:35:16.391577Z",
            "url": "https://files.pythonhosted.org/packages/8a/de/9f0c4d06251a65482b1c04f5988c6e156811d1cffbd59d36faa12222e1f4/cholespy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0fe9889fc88147736716febcab23c7ff41fced1fec90d922eaad42b749772689",
                "md5": "1d0a922331c455410604b15649104025",
                "sha256": "9d04c5830c037e3604d16b48f8c2bd793671d2bcee5b1e3da4755b3d5a4078e1"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1d0a922331c455410604b15649104025",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 4427143,
            "upload_time": "2024-08-09T08:35:18",
            "upload_time_iso_8601": "2024-08-09T08:35:18.202865Z",
            "url": "https://files.pythonhosted.org/packages/0f/e9/889fc88147736716febcab23c7ff41fced1fec90d922eaad42b749772689/cholespy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a52673a2550a5feb616bc49a11d7d13e5d38beeaa8708d13d226fd6610f5d2c4",
                "md5": "ac8e2ef28471939d1bf9f4468fa08e28",
                "sha256": "983617a4b5b225a605276253303a524d4c1443f507bea296c10aa2840d6d7f3b"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ac8e2ef28471939d1bf9f4468fa08e28",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 4937199,
            "upload_time": "2024-08-09T08:35:20",
            "upload_time_iso_8601": "2024-08-09T08:35:20.343323Z",
            "url": "https://files.pythonhosted.org/packages/a5/26/73a2550a5feb616bc49a11d7d13e5d38beeaa8708d13d226fd6610f5d2c4/cholespy-2.1.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "483f916b56cf5440736a23695cd8fdd2cd3589e2ce9a472f8b715f90868968ba",
                "md5": "bc85ea99b3371c7cb858add7a868d33b",
                "sha256": "ca3e921e0525c01e990761a5372f4a434c319c9ceb0bf53ddbf5d744236a4604"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp311-cp311-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bc85ea99b3371c7cb858add7a868d33b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1166570,
            "upload_time": "2024-08-09T08:35:22",
            "upload_time_iso_8601": "2024-08-09T08:35:22.565267Z",
            "url": "https://files.pythonhosted.org/packages/48/3f/916b56cf5440736a23695cd8fdd2cd3589e2ce9a472f8b715f90868968ba/cholespy-2.1.0-cp311-cp311-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e3a69d3c92111bbb333bb81a28205095ade1f746a25772ab8e02ecdbf2665865",
                "md5": "2d037125c2d812bc4a1a2cdb4da29b8b",
                "sha256": "1a762eb52259ad5a38eb22bf72a0e311afcffcaf599da1169ef04e42d9b28b4e"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2d037125c2d812bc4a1a2cdb4da29b8b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 977304,
            "upload_time": "2024-08-09T08:35:23",
            "upload_time_iso_8601": "2024-08-09T08:35:23.816305Z",
            "url": "https://files.pythonhosted.org/packages/e3/a6/9d3c92111bbb333bb81a28205095ade1f746a25772ab8e02ecdbf2665865/cholespy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f3907c4c5b68fbbb4683c75971a52c2630cb8058460d49c6dad8a15104274b7d",
                "md5": "b923bc653d53397eed0ef2ebee9c37f5",
                "sha256": "4e197b4db52ce68e4290db7269160ac29fa0967ed6e2f455751251f378783f6d"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b923bc653d53397eed0ef2ebee9c37f5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 4426883,
            "upload_time": "2024-08-09T08:35:25",
            "upload_time_iso_8601": "2024-08-09T08:35:25.442884Z",
            "url": "https://files.pythonhosted.org/packages/f3/90/7c4c5b68fbbb4683c75971a52c2630cb8058460d49c6dad8a15104274b7d/cholespy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1f886cb8517872f40a532c7e948433db5084d801ba7580e87f6c3642ce351b71",
                "md5": "c1d1ae461fa58f0ed2a4bc32d7af29e5",
                "sha256": "2544f97928e4d8f2aaee51f253c7d55fb3f202bcf95b463d989838731a49c5d3"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c1d1ae461fa58f0ed2a4bc32d7af29e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 4937004,
            "upload_time": "2024-08-09T08:35:27",
            "upload_time_iso_8601": "2024-08-09T08:35:27.451493Z",
            "url": "https://files.pythonhosted.org/packages/1f/88/6cb8517872f40a532c7e948433db5084d801ba7580e87f6c3642ce351b71/cholespy-2.1.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f693b7029ff7f05f3d353d0f8ab590012bb45b4678636e3d23ddf676aeb94a98",
                "md5": "9649b3ba133d3ae9e74647933ea574e4",
                "sha256": "d8eed87977dddd1ee8bbfb4a34772ad34d173536ae77bf1532964659b78a4dbe"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp312-abi3-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9649b3ba133d3ae9e74647933ea574e4",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1166237,
            "upload_time": "2024-08-09T08:35:29",
            "upload_time_iso_8601": "2024-08-09T08:35:29.444052Z",
            "url": "https://files.pythonhosted.org/packages/f6/93/b7029ff7f05f3d353d0f8ab590012bb45b4678636e3d23ddf676aeb94a98/cholespy-2.1.0-cp312-abi3-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "458096ae0f967d79ae05f14781b26cb389c80b7b3b8646172c17362e097fa44e",
                "md5": "11a351a2cb0b72b7eb71b4df9b92701b",
                "sha256": "8a592dbd0cf46b1afb96187d65bb50a83b7b8c85e7f453379ec912cb1f86f5d1"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp312-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "11a351a2cb0b72b7eb71b4df9b92701b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 976762,
            "upload_time": "2024-08-09T08:35:31",
            "upload_time_iso_8601": "2024-08-09T08:35:31.013421Z",
            "url": "https://files.pythonhosted.org/packages/45/80/96ae0f967d79ae05f14781b26cb389c80b7b3b8646172c17362e097fa44e/cholespy-2.1.0-cp312-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f7f4957d9c22278281674ecdada12a1788cfa760f4548a655dd95eb181444b81",
                "md5": "28dfb3c53c5ff5e775b0686765c317e0",
                "sha256": "5b3394896e7bd27df73e95b321d80983cf02b9e7d7bc5b1113b22505383728bc"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "28dfb3c53c5ff5e775b0686765c317e0",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 4426177,
            "upload_time": "2024-08-09T08:35:32",
            "upload_time_iso_8601": "2024-08-09T08:35:32.216300Z",
            "url": "https://files.pythonhosted.org/packages/f7/f4/957d9c22278281674ecdada12a1788cfa760f4548a655dd95eb181444b81/cholespy-2.1.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "db1e748e3a3725188bc28161ebd96695c2f383260f4696d6edad3b92349aa3dd",
                "md5": "694b235483744a7cc9f84dc4806a2feb",
                "sha256": "d851e3d249506caf7d1e8af7942143c3eb0eb1721a26e558900df35415a1ef93"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp312-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "694b235483744a7cc9f84dc4806a2feb",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 4936495,
            "upload_time": "2024-08-09T08:35:33",
            "upload_time_iso_8601": "2024-08-09T08:35:33.937106Z",
            "url": "https://files.pythonhosted.org/packages/db/1e/748e3a3725188bc28161ebd96695c2f383260f4696d6edad3b92349aa3dd/cholespy-2.1.0-cp312-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "026fedb4147340830e9f44f5c1106f5a9150693e9fd48c9eaf9067e5bf6f7790",
                "md5": "5ac726cebd1e367a927341c73d451a7e",
                "sha256": "ad8f23e6a0d381eb1bb5561ba336ab4830f4a51ac1245253103512b3773f767c"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp38-cp38-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5ac726cebd1e367a927341c73d451a7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1166837,
            "upload_time": "2024-08-09T08:35:35",
            "upload_time_iso_8601": "2024-08-09T08:35:35.542152Z",
            "url": "https://files.pythonhosted.org/packages/02/6f/edb4147340830e9f44f5c1106f5a9150693e9fd48c9eaf9067e5bf6f7790/cholespy-2.1.0-cp38-cp38-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "85387ed718d2e42edcf8a59dbc6f07052feea9d81fec1f11f1fa8231c4682f65",
                "md5": "838e725c8ccff388694d1c78812a25dd",
                "sha256": "3f069c30a64f20e73ff07e67f798ac6c6e56efb34b80ad30f1ed87272393340f"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "838e725c8ccff388694d1c78812a25dd",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4427253,
            "upload_time": "2024-08-09T08:35:37",
            "upload_time_iso_8601": "2024-08-09T08:35:37.156917Z",
            "url": "https://files.pythonhosted.org/packages/85/38/7ed718d2e42edcf8a59dbc6f07052feea9d81fec1f11f1fa8231c4682f65/cholespy-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "565e09c8d9493609fb952637686a9d7ecb079f62144d30337b844d4f039443cc",
                "md5": "09994f1cd27d9688d81a2576084170a0",
                "sha256": "dab5f76bb0f23d378a510920120e8e14834d690a5a25d14a30f6b4511736b7cb"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "09994f1cd27d9688d81a2576084170a0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4937333,
            "upload_time": "2024-08-09T08:35:38",
            "upload_time_iso_8601": "2024-08-09T08:35:38.967616Z",
            "url": "https://files.pythonhosted.org/packages/56/5e/09c8d9493609fb952637686a9d7ecb079f62144d30337b844d4f039443cc/cholespy-2.1.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "583841aeb9298a13b3fa9978976541c38cf3603f0a107c16832b631b5e31a02a",
                "md5": "49c620c6b71e37b8b46609a7bd6b9682",
                "sha256": "0a9a268af93f804083f2450d2f7ec28a9299db82332ca6d1948077bd4811a223"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp39-cp39-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "49c620c6b71e37b8b46609a7bd6b9682",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1166978,
            "upload_time": "2024-08-09T08:35:40",
            "upload_time_iso_8601": "2024-08-09T08:35:40.259801Z",
            "url": "https://files.pythonhosted.org/packages/58/38/41aeb9298a13b3fa9978976541c38cf3603f0a107c16832b631b5e31a02a/cholespy-2.1.0-cp39-cp39-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e3c3edf4387ed4f749ed432152b7be8490ad2524582b93de714348bdc9055d3",
                "md5": "37df1656a5a2424cce6eb9a0bd80965b",
                "sha256": "ca91a83766d4e206365c2732a66d7f072f10c22b6a74f92c121d3a3fb4ea1062"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "37df1656a5a2424cce6eb9a0bd80965b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 977574,
            "upload_time": "2024-08-09T08:35:41",
            "upload_time_iso_8601": "2024-08-09T08:35:41.988596Z",
            "url": "https://files.pythonhosted.org/packages/0e/3c/3edf4387ed4f749ed432152b7be8490ad2524582b93de714348bdc9055d3/cholespy-2.1.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7f870c199eb7582a89bd720d6e788ef771cf1028e33dfb7872c1d9d0d30b1100",
                "md5": "fd0c64542e6e9141566209fa1cf09ae4",
                "sha256": "e26a87cf2f9d4e4b5eb405db0ccb455740a46ef77c63a29e3b0d25a82e98825c"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fd0c64542e6e9141566209fa1cf09ae4",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 4427423,
            "upload_time": "2024-08-09T08:35:44",
            "upload_time_iso_8601": "2024-08-09T08:35:44.055732Z",
            "url": "https://files.pythonhosted.org/packages/7f/87/0c199eb7582a89bd720d6e788ef771cf1028e33dfb7872c1d9d0d30b1100/cholespy-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "07126cdcdb1923ba9230fded44508692ddf1ae91ab2244b78d5c270b3e73d49a",
                "md5": "d3093ba2c0107987e9a6d4108f895393",
                "sha256": "1664da55c499e65d90ed075f10ce604936783d8e73f1bc2c8a47be3b6e2ecd06"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d3093ba2c0107987e9a6d4108f895393",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 4937572,
            "upload_time": "2024-08-09T08:35:45",
            "upload_time_iso_8601": "2024-08-09T08:35:45.323906Z",
            "url": "https://files.pythonhosted.org/packages/07/12/6cdcdb1923ba9230fded44508692ddf1ae91ab2244b78d5c270b3e73d49a/cholespy-2.1.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a9f99379a33e23e14eae7bc011b4aac83875f7201bb7afd29fc12fcfc21cd2a0",
                "md5": "f46208be00f7f22efdf5628ba2343372",
                "sha256": "13d069270fcdbb364c1db8ebee877b7d5be0b4bac00296879ec5cef1317473fe"
            },
            "downloads": -1,
            "filename": "cholespy-2.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "f46208be00f7f22efdf5628ba2343372",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 58987237,
            "upload_time": "2024-08-09T08:35:47",
            "upload_time_iso_8601": "2024-08-09T08:35:47.493593Z",
            "url": "https://files.pythonhosted.org/packages/a9/f9/9379a33e23e14eae7bc011b4aac83875f7201bb7afd29fc12fcfc21cd2a0/cholespy-2.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-09 08:35:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "rgl-epfl",
    "github_project": "cholespy",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "cholespy"
}
        
Elapsed time: 0.42812s