polyagamma


Namepolyagamma JSON
Version 2.0.1 PyPI version JSON
download
home_pageNone
SummaryEfficiently generate samples from the Polya-Gamma distribution using a NumPy/SciPy compatible interface.
upload_time2024-11-09 08:00:57
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseBSD 3-Clause License
keywords polya-gamma distribution polya-gamma random sampling
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Polya-Gamma
[![PyPI - Wheel][4]](https://pypi.org/project/polyagamma/#files)
[![CI][7]](https://github.com/zoj613/polyagamma/actions/workflows/build-and-test.yml)
[![Codecov][8]](https://codecov.io/gh/zoj613/polyagamma/)
[![PyPI - License][6]](https://github.com/zoj613/polyagamma/blob/main/LICENSE)
[![PyPI][5]](https://pypi.org/project/polyagamma/#history)
[![Conda][11]](https://anaconda.org/conda-forge/polyagamma)


Efficiently generate samples from the Polya-Gamma distribution using a NumPy/SciPy compatible interface.

## Why?

If you are reading this, you probably already used the [pypolyagamma][9] package before. It is
a great package that I have also used in the past, however I encountered several issues:
- Generating an array of samples is awkward because it requires using a list comprehension
  if parameter values are scalars or have pre-allocated arrays of a known size to pass for both
  the parameters and the output array. Moreover, broadcasting of input is not supported and thus
  requiring the user to write another layer to support it.
- It requires extra effort to be used in multiprocessing because pickling of the
  sampler is not supported.
- There is no parameter validation supported meaning it is easy to get the wrong samples if
  you do not check the inputs manually.
- The sampling API is very different from the ones used by popular packages like numpy/scipy,
  making it harder to just "plug-n-play" in existing code bases.
- It does not allow passing in an instance of a `np.random.RandomState` or `np.random.Generator`
  for seeding, requiring extra effort when changing the seed if used in a larger code base.
- The C++ code wrapped by the package is GPLv3 licensed, making it difficult to
  use the source code in a project that prefers licenses like MIT/Apache/BSD.

The above issues are the reason why this package exists. And the aim of `polyagamma` is to "fix" them.


## Features
- Input parameters can be scalars, arrays or both; allowing for easy generation
of multi-dimensional samples without specifying the size.
- Input validation is done internally with clear error messages upon failure.
- It is flexible and allows the user to sample using one of 4 available algorithms.
- Implements functions to compute the CDF and density of the distribution as well
  as their logarithms.
- Random number generation is thread safe.
- The functional API resembles that of common numpy/scipy functions, therefore making it easy to plugin to
existing libraries.
- `polyagamma` is optimized for performance and tests show that it is faster
  than other implementations.
- Pre-built wheels are provided for easy installation on Linux, MacOS and Windows.


## Examples

### Python

```python
import array
import numpy as np
from polyagamma import random_polyagamma

# generate a PG(1, 0) sample
o = random_polyagamma()

# Get a 5 by 1 array of PG(1, 2) variates.
o = random_polyagamma(z=2, size=5)

# We can pass sequences as input. Numpy's broadcasting rules apply here.
# Get a 10 by 2 array where column 1 is PG(2, -10) and column 2 is PG(1, 10)
o = random_polyagamma([2, 1], [-10, 10], size=(10, 2))
z = [[1.5, 2, -0.75, 4, 5],
     [9.5, -8, 7, 6, -0.9]]
o = random_polyagamma(1, z)

# We can pass an output array using the `out` parameter. It does not have to be
# a numpy array. it can be any object that implements the array or buffer protocols.
# As long as its type is 64bit float, contiguous in memory and aligned (e.g. Python's array object).
numpy_out = np.empty(5)
array_out = array.array('d', [0] * 5)
random_polyagamma(out=numpy_out)
print(numpy_out)
random_polyagamma(out=array_out)
print(array_out)

# one can choose a sampling method from {devroye, alternate, gamma, saddle}.
# If not given, the default behaviour is a hybrid sampler that picks the most
# efficient method based on the input values.
o = random_polyagamma(method="saddle")

# one can also use an existing instance of `numpy.random.Generator` as a parameter.
# This is useful to reproduce samples generated via a given seed.
rng = np.random.default_rng(12345)
o = random_polyagamma(random_state=rng)

# If one is using a `numpy.random.RandomState` instance instead of the `Generator`
# class, the object's underlying bitgenerator can be passed as the value of random_state
bit_gen = np.random.RandomState(12345)._bit_generator
o = random_polyagamma(random_state=bit_gen)

# When passing a large input array for the shape parameter `h`, parameter value
# validation checks can be disabled if the values are guaranteed to be positive
# to avoid some overhead, which may boost performance.
large_h = np.ones(1000000)
o = random_polyagamma(large_h, disable_checks=True)
```
Functions to compute the density and CDF are available. Broadcasting of input is supported.
```python
from polyagamma import polyagamma_pdf, polyagamma_cdf

>>> polyagamma_pdf(0.1)
# 3.613955566329298
>>> polyagamma_cdf([1, 2], h=2, z=1)
# array([0.95637847, 0.99963397])
>>> polyagamma_pdf([2, 0.1], h=[[1, 2], [3, 4]], return_log=True)
# array([[   -8.03172733,  -489.17101125]
#        [   -3.82023942, -1987.09156971]])
>>> polyagamma_cdf(4, z=[-100, 0, 2], return_log=True)
# array([ 3.72007598e-44, -3.40628215e-09, -1.25463528e-12])
```

### Cython
The package also provides low-level functions that can be imported in cython modules. They are:
- `random_polyagamma`
- `random_polyagamma_fill`
- `random_polyagamma_fill2`

Refer to the [pgm_random.h](./include/pgm_random.h) header file for more info about the
function signatures. Below is an example of how these functions can be used.

```cython
from cpython.pycapsule cimport PyCapsule_GetPointer
from polyagamma cimport random_polyagamma_fill, DEVROYE
from numpy.random cimport bitgen_t
import numpy as np

# assuming there exists an instance of the Generator class called `rng`.
bitgenerator = rng._bit_generator
# get pointer to the underlying bitgenerator struct
cdef bitgen_t* bitgen = <bitgen_t*>PyCapsule_GetPointer(bitgenerator.capsule, "BitGenerator")
# set distribution parameters
cdef double h = 1, z = 0
# get a memory view of the array to store samples in
cdef double[:] out = np.empty(300)
with bitgenerator.lock, nogil:
    random_polyagamma_fill(bitgen, h, z, DEVROYE, <size_t>out.shape[0], &out[0])
print(out.base)
...
```

### PyMC
As of `pymc>=4.0.0b1`, this distribution can be accessed as a PyMC distribution object. See the
pymc documentation for more details.

### C
For an example of how to use `polyagamma` in a C program, see [here][1].


## Dependencies
- Numpy >= 1.19.0


## Installation
To get the latest version of the package, one can install it by downloading the wheel/source distribution
from the [releases][3] page, or using `pip` with the following shell command:
```shell
$ pip install --pre -U polyagamma
```
or using `conda` with the following command:
```shell
$ conda install -c conda-forge polyagamma
```
Alternatively, one can install from source with the following shell commands:
```shell
$ git clone https://github.com/zoj613/polyagamma.git
$ cd polyagamma/
$ pip install cython==0.29.*
$ cythonize polyagamma/*.pyx
$ pip install .
```


## Benchmarks

Below are runtime plots of 20000 samples generated for various values of `h`
and `z`, using each method. We restrict `h` to integer values to accomodate the
`devroye` method, which cannot be used for non-integer `h`. The version of the
package used to generate them is `v1.3.1`.

|![](./scripts/img/perf_methods_0.0.svg) | ![](./scripts/img/perf_methods_2.5.svg)|
| --- | --- |

|![](./scripts/img/perf_methods_5.0.svg) | ![](./scripts/img/perf_methods_10.0.svg)|
| --- | --- |

Generally:
- The `gamma` method is slowest and should be avoided in cases where speed is paramount.
- For `h >= 8`, the `saddle` method is the fastest for any value of `z`.
- For `0 <= z <= 1` and integer `h <= 4`, the `devroye` method should be preferred.
- For `z > 1` and `1 < h < 8`, the `alternate` method is the most efficient.
- For `h > 50` (or any value large enough), the normal approximation to the distribution is
fastest (not reported in the above plot but it is around 10 times faster than the `saddle`
method and also equally accurate).

Therefore, we devise a "hybrid/default" sampler that picks a sampler based on the above guidelines.

We also benchmark the hybrid sampler runtime with the sampler found in the `pypolyagamma`
package (version `1.2.3`). The version of NumPy we use is `1.19.0`. We compare our
sampler to the `pgdrawv` functions provided by the package. Below are runtime plots of 20000
samples for each value of `h` and `z`. Values of `h` range from 0.1 to 50, while `z` is set
to 0, 2.5, 5, and 10.

|![](./scripts/img/perf_samplers_0.0.svg) | ![](./scripts/img/perf_samplers_2.5.svg)|
| --- | --- |

|![](./scripts/img/perf_samplers_5.0.svg) | ![](./scripts/img/perf_samplers_10.0.svg)|
| --- | --- |

It can be seen that when generating many samples at once for any given combination of
parameters, `polyagamma` outperforms the `pypolyagamma` package by a large margin.
The exception is when the scale parameter is very small (e.g `h < 1`). It is also worth
noting that the `pypolygamma` package is on average faster than ours at generating exactly 1
sample value from the distribution. This is mainly due to the overhead introduced by creating
the bitgenerator + acquiring/releasing the thread lock + doing parameter validation checks at
every call to the function. This overhead can somewhat be mitigated by passing in a random
generator instance at every call to the `polyagamma` function. To eliminate this overhead,
it is best to use the Cython functions directly. Below is a timing example to demonstrate
the benefit of passing a generator explicitly:
```shell
In [3]: rng = np.random.SFC64(1)

In [4]: %timeit random_polyagamma()
90 µs ± 1.65 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [5]: %timeit random_polyagamma(random_state=rng)
1.69 µs ± 6.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
```

To generate the above plots locally, run
```shell
$ pip install -r scripts/requirements.txt
$ python scripts/benchmark.py --size=<some size> --z=<z value>
```
Note that the runtimes may differ  than the ones reported here, depending on the machine this script
is ran on.


## Distribution Plots
Below is a visualization of the Cumulative distribution and density functions for
various values of the parameters.
|![](./scripts/img/pdf.svg) | ![](./scripts/img/cdf.svg)|
| --- | --- |

We can compare these plots to the Kernel density estimate and empirical CDF plots
generated from 20000 random samples using each of the available methods.
|![](./scripts/img/kde.svg) | ![](./scripts/img/ecdf.svg)|
| --- | --- |


## Contributing
All contributions, bug reports, bug fixes, documentation improvements, enhancements, and ideas are welcome.

To submit a PR, follow the steps below:
1) Fork the repo.
2) Install and setup the dev environment with `pip install -r requirements-dev.txt` or `make dev`.
3) Start writing your changes, including unittests.
4) Run tests to make sure they all pass with `make test`.
5) Once finished, you can submit a PR for review.


## References
- Luc Devroye. "On exact simulation algorithms for some distributions related to Jacobi theta functions." Statistics & Probability Letters, Volume 79, Issue 21, (2009): 2251-2259.
- Polson, Nicholas G., James G. Scott, and Jesse Windle. "Bayesian inference for logistic models using Pólya–Gamma latent variables." Journal of the American statistical Association 108.504 (2013): 1339-1349.
- J. Windle, N. G. Polson, and J. G. Scott. "Improved Polya-gamma sampling". Technical Report, University of Texas at Austin, 2013b.
- Windle, Jesse, Nicholas G. Polson, and James G. Scott. "Sampling Polya-Gamma random variates: alternate and approximate techniques." arXiv preprint arXiv:1405.0506 (2014)
- Windle, J. (2013). Forecasting high-dimensional, time-varying variance-covariance matrices with high-frequency data and sampling Pólya-Gamma random variates for posterior distributions derived from logistic likelihoods.(PhD thesis). Retrieved from http://hdl.handle.net/2152/21842 .


[1]: ./examples/c_polyagamma.c
[3]: https://github.com/zoj613/polyagamma/releases
[4]: https://img.shields.io/pypi/wheel/polyagamma?style=flat-square
[5]: https://img.shields.io/github/v/release/zoj613/polyagamma?include_prereleases&label=pypi&style=flat-square
[6]: https://img.shields.io/pypi/l/polyagamma?style=flat-square
[7]: https://img.shields.io/github/actions/workflow/status/zoj613/polyagamma/build-and-test.yml?branch=main&style=flat-square
[8]: https://img.shields.io/codecov/c/github/zoj613/polyagamma?style=flat-square
[9]: https://github.com/slinderman/pypolyagamma
[10]: https://github.com/python-poetry/poetry
[11]: https://img.shields.io/conda/vn/conda-forge/polyagamma?style=flat-square

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "polyagamma",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "polya-gamma distribution, polya-gamma random sampling",
    "author": null,
    "author_email": "Zolisa Bleki <zolisa.bleki@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/9d/33/a9094c61b7acf0408561011f8b67358e054b4a535b9025521782e18038a7/polyagamma-2.0.1.tar.gz",
    "platform": null,
    "description": "# Polya-Gamma\n[![PyPI - Wheel][4]](https://pypi.org/project/polyagamma/#files)\n[![CI][7]](https://github.com/zoj613/polyagamma/actions/workflows/build-and-test.yml)\n[![Codecov][8]](https://codecov.io/gh/zoj613/polyagamma/)\n[![PyPI - License][6]](https://github.com/zoj613/polyagamma/blob/main/LICENSE)\n[![PyPI][5]](https://pypi.org/project/polyagamma/#history)\n[![Conda][11]](https://anaconda.org/conda-forge/polyagamma)\n\n\nEfficiently generate samples from the Polya-Gamma distribution using a NumPy/SciPy compatible interface.\n\n## Why?\n\nIf you are reading this, you probably already used the [pypolyagamma][9] package before. It is\na great package that I have also used in the past, however I encountered several issues:\n- Generating an array of samples is awkward because it requires using a list comprehension\n  if parameter values are scalars or have pre-allocated arrays of a known size to pass for both\n  the parameters and the output array. Moreover, broadcasting of input is not supported and thus\n  requiring the user to write another layer to support it.\n- It requires extra effort to be used in multiprocessing because pickling of the\n  sampler is not supported.\n- There is no parameter validation supported meaning it is easy to get the wrong samples if\n  you do not check the inputs manually.\n- The sampling API is very different from the ones used by popular packages like numpy/scipy,\n  making it harder to just \"plug-n-play\" in existing code bases.\n- It does not allow passing in an instance of a `np.random.RandomState` or `np.random.Generator`\n  for seeding, requiring extra effort when changing the seed if used in a larger code base.\n- The C++ code wrapped by the package is GPLv3 licensed, making it difficult to\n  use the source code in a project that prefers licenses like MIT/Apache/BSD.\n\nThe above issues are the reason why this package exists. And the aim of `polyagamma` is to \"fix\" them.\n\n\n## Features\n- Input parameters can be scalars, arrays or both; allowing for easy generation\nof multi-dimensional samples without specifying the size.\n- Input validation is done internally with clear error messages upon failure.\n- It is flexible and allows the user to sample using one of 4 available algorithms.\n- Implements functions to compute the CDF and density of the distribution as well\n  as their logarithms.\n- Random number generation is thread safe.\n- The functional API resembles that of common numpy/scipy functions, therefore making it easy to plugin to\nexisting libraries.\n- `polyagamma` is optimized for performance and tests show that it is faster\n  than other implementations.\n- Pre-built wheels are provided for easy installation on Linux, MacOS and Windows.\n\n\n## Examples\n\n### Python\n\n```python\nimport array\nimport numpy as np\nfrom polyagamma import random_polyagamma\n\n# generate a PG(1, 0) sample\no = random_polyagamma()\n\n# Get a 5 by 1 array of PG(1, 2) variates.\no = random_polyagamma(z=2, size=5)\n\n# We can pass sequences as input. Numpy's broadcasting rules apply here.\n# Get a 10 by 2 array where column 1 is PG(2, -10) and column 2 is PG(1, 10)\no = random_polyagamma([2, 1], [-10, 10], size=(10, 2))\nz = [[1.5, 2, -0.75, 4, 5],\n     [9.5, -8, 7, 6, -0.9]]\no = random_polyagamma(1, z)\n\n# We can pass an output array using the `out` parameter. It does not have to be\n# a numpy array. it can be any object that implements the array or buffer protocols.\n# As long as its type is 64bit float, contiguous in memory and aligned (e.g. Python's array object).\nnumpy_out = np.empty(5)\narray_out = array.array('d', [0] * 5)\nrandom_polyagamma(out=numpy_out)\nprint(numpy_out)\nrandom_polyagamma(out=array_out)\nprint(array_out)\n\n# one can choose a sampling method from {devroye, alternate, gamma, saddle}.\n# If not given, the default behaviour is a hybrid sampler that picks the most\n# efficient method based on the input values.\no = random_polyagamma(method=\"saddle\")\n\n# one can also use an existing instance of `numpy.random.Generator` as a parameter.\n# This is useful to reproduce samples generated via a given seed.\nrng = np.random.default_rng(12345)\no = random_polyagamma(random_state=rng)\n\n# If one is using a `numpy.random.RandomState` instance instead of the `Generator`\n# class, the object's underlying bitgenerator can be passed as the value of random_state\nbit_gen = np.random.RandomState(12345)._bit_generator\no = random_polyagamma(random_state=bit_gen)\n\n# When passing a large input array for the shape parameter `h`, parameter value\n# validation checks can be disabled if the values are guaranteed to be positive\n# to avoid some overhead, which may boost performance.\nlarge_h = np.ones(1000000)\no = random_polyagamma(large_h, disable_checks=True)\n```\nFunctions to compute the density and CDF are available. Broadcasting of input is supported.\n```python\nfrom polyagamma import polyagamma_pdf, polyagamma_cdf\n\n>>> polyagamma_pdf(0.1)\n# 3.613955566329298\n>>> polyagamma_cdf([1, 2], h=2, z=1)\n# array([0.95637847, 0.99963397])\n>>> polyagamma_pdf([2, 0.1], h=[[1, 2], [3, 4]], return_log=True)\n# array([[   -8.03172733,  -489.17101125]\n#        [   -3.82023942, -1987.09156971]])\n>>> polyagamma_cdf(4, z=[-100, 0, 2], return_log=True)\n# array([ 3.72007598e-44, -3.40628215e-09, -1.25463528e-12])\n```\n\n### Cython\nThe package also provides low-level functions that can be imported in cython modules. They are:\n- `random_polyagamma`\n- `random_polyagamma_fill`\n- `random_polyagamma_fill2`\n\nRefer to the [pgm_random.h](./include/pgm_random.h) header file for more info about the\nfunction signatures. Below is an example of how these functions can be used.\n\n```cython\nfrom cpython.pycapsule cimport PyCapsule_GetPointer\nfrom polyagamma cimport random_polyagamma_fill, DEVROYE\nfrom numpy.random cimport bitgen_t\nimport numpy as np\n\n# assuming there exists an instance of the Generator class called `rng`.\nbitgenerator = rng._bit_generator\n# get pointer to the underlying bitgenerator struct\ncdef bitgen_t* bitgen = <bitgen_t*>PyCapsule_GetPointer(bitgenerator.capsule, \"BitGenerator\")\n# set distribution parameters\ncdef double h = 1, z = 0\n# get a memory view of the array to store samples in\ncdef double[:] out = np.empty(300)\nwith bitgenerator.lock, nogil:\n    random_polyagamma_fill(bitgen, h, z, DEVROYE, <size_t>out.shape[0], &out[0])\nprint(out.base)\n...\n```\n\n### PyMC\nAs of `pymc>=4.0.0b1`, this distribution can be accessed as a PyMC distribution object. See the\npymc documentation for more details.\n\n### C\nFor an example of how to use `polyagamma` in a C program, see [here][1].\n\n\n## Dependencies\n- Numpy >= 1.19.0\n\n\n## Installation\nTo get the latest version of the package, one can install it by downloading the wheel/source distribution\nfrom the [releases][3] page, or using `pip` with the following shell command:\n```shell\n$ pip install --pre -U polyagamma\n```\nor using `conda` with the following command:\n```shell\n$ conda install -c conda-forge polyagamma\n```\nAlternatively, one can install from source with the following shell commands:\n```shell\n$ git clone https://github.com/zoj613/polyagamma.git\n$ cd polyagamma/\n$ pip install cython==0.29.*\n$ cythonize polyagamma/*.pyx\n$ pip install .\n```\n\n\n## Benchmarks\n\nBelow are runtime plots of 20000 samples generated for various values of `h`\nand `z`, using each method. We restrict `h` to integer values to accomodate the\n`devroye` method, which cannot be used for non-integer `h`. The version of the\npackage used to generate them is `v1.3.1`.\n\n|![](./scripts/img/perf_methods_0.0.svg) | ![](./scripts/img/perf_methods_2.5.svg)|\n| --- | --- |\n\n|![](./scripts/img/perf_methods_5.0.svg) | ![](./scripts/img/perf_methods_10.0.svg)|\n| --- | --- |\n\nGenerally:\n- The `gamma` method is slowest and should be avoided in cases where speed is paramount.\n- For `h >= 8`, the `saddle` method is the fastest for any value of `z`.\n- For `0 <= z <= 1` and integer `h <= 4`, the `devroye` method should be preferred.\n- For `z > 1` and `1 < h < 8`, the `alternate` method is the most efficient.\n- For `h > 50` (or any value large enough), the normal approximation to the distribution is\nfastest (not reported in the above plot but it is around 10 times faster than the `saddle`\nmethod and also equally accurate).\n\nTherefore, we devise a \"hybrid/default\" sampler that picks a sampler based on the above guidelines.\n\nWe also benchmark the hybrid sampler runtime with the sampler found in the `pypolyagamma`\npackage (version `1.2.3`). The version of NumPy we use is `1.19.0`. We compare our\nsampler to the `pgdrawv` functions provided by the package. Below are runtime plots of 20000\nsamples for each value of `h` and `z`. Values of `h` range from 0.1 to 50, while `z` is set\nto 0, 2.5, 5, and 10.\n\n|![](./scripts/img/perf_samplers_0.0.svg) | ![](./scripts/img/perf_samplers_2.5.svg)|\n| --- | --- |\n\n|![](./scripts/img/perf_samplers_5.0.svg) | ![](./scripts/img/perf_samplers_10.0.svg)|\n| --- | --- |\n\nIt can be seen that when generating many samples at once for any given combination of\nparameters, `polyagamma` outperforms the `pypolyagamma` package by a large margin.\nThe exception is when the scale parameter is very small (e.g `h < 1`). It is also worth\nnoting that the `pypolygamma` package is on average faster than ours at generating exactly 1\nsample value from the distribution. This is mainly due to the overhead introduced by creating\nthe bitgenerator + acquiring/releasing the thread lock + doing parameter validation checks at\nevery call to the function. This overhead can somewhat be mitigated by passing in a random\ngenerator instance at every call to the `polyagamma` function. To eliminate this overhead,\nit is best to use the Cython functions directly. Below is a timing example to demonstrate\nthe benefit of passing a generator explicitly:\n```shell\nIn [3]: rng = np.random.SFC64(1)\n\nIn [4]: %timeit random_polyagamma()\n90 \u00b5s \u00b1 1.65 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 10000 loops each)\n\nIn [5]: %timeit random_polyagamma(random_state=rng)\n1.69 \u00b5s \u00b1 6.96 ns per loop (mean \u00b1 std. dev. of 7 runs, 1000000 loops each)\n```\n\nTo generate the above plots locally, run\n```shell\n$ pip install -r scripts/requirements.txt\n$ python scripts/benchmark.py --size=<some size> --z=<z value>\n```\nNote that the runtimes may differ  than the ones reported here, depending on the machine this script\nis ran on.\n\n\n## Distribution Plots\nBelow is a visualization of the Cumulative distribution and density functions for\nvarious values of the parameters.\n|![](./scripts/img/pdf.svg) | ![](./scripts/img/cdf.svg)|\n| --- | --- |\n\nWe can compare these plots to the Kernel density estimate and empirical CDF plots\ngenerated from 20000 random samples using each of the available methods.\n|![](./scripts/img/kde.svg) | ![](./scripts/img/ecdf.svg)|\n| --- | --- |\n\n\n## Contributing\nAll contributions, bug reports, bug fixes, documentation improvements, enhancements, and ideas are welcome.\n\nTo submit a PR, follow the steps below:\n1) Fork the repo.\n2) Install and setup the dev environment with `pip install -r requirements-dev.txt` or `make dev`.\n3) Start writing your changes, including unittests.\n4) Run tests to make sure they all pass with `make test`.\n5) Once finished, you can submit a PR for review.\n\n\n## References\n- Luc Devroye. \"On exact simulation algorithms for some distributions related to Jacobi theta functions.\" Statistics & Probability Letters, Volume 79, Issue 21, (2009): 2251-2259.\n- Polson, Nicholas G., James G. Scott, and Jesse Windle. \"Bayesian inference for logistic models using P\u00f3lya\u2013Gamma latent variables.\" Journal of the American statistical Association 108.504 (2013): 1339-1349.\n- J. Windle, N. G. Polson, and J. G. Scott. \"Improved Polya-gamma sampling\". Technical Report, University of Texas at Austin, 2013b.\n- Windle, Jesse, Nicholas G. Polson, and James G. Scott. \"Sampling Polya-Gamma random variates: alternate and approximate techniques.\" arXiv preprint arXiv:1405.0506 (2014)\n- Windle, J. (2013). Forecasting high-dimensional, time-varying variance-covariance matrices with high-frequency data and sampling Po\u0301lya-Gamma random variates for posterior distributions derived from logistic likelihoods.(PhD thesis). Retrieved from http://hdl.handle.net/2152/21842 .\n\n\n[1]: ./examples/c_polyagamma.c\n[3]: https://github.com/zoj613/polyagamma/releases\n[4]: https://img.shields.io/pypi/wheel/polyagamma?style=flat-square\n[5]: https://img.shields.io/github/v/release/zoj613/polyagamma?include_prereleases&label=pypi&style=flat-square\n[6]: https://img.shields.io/pypi/l/polyagamma?style=flat-square\n[7]: https://img.shields.io/github/actions/workflow/status/zoj613/polyagamma/build-and-test.yml?branch=main&style=flat-square\n[8]: https://img.shields.io/codecov/c/github/zoj613/polyagamma?style=flat-square\n[9]: https://github.com/slinderman/pypolyagamma\n[10]: https://github.com/python-poetry/poetry\n[11]: https://img.shields.io/conda/vn/conda-forge/polyagamma?style=flat-square\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License",
    "summary": "Efficiently generate samples from the Polya-Gamma distribution using a NumPy/SciPy compatible interface.",
    "version": "2.0.1",
    "project_urls": {
        "source": "https://github.com/zoj613/polyagamma",
        "tracker": "https://github.com/zoj613/polyagamma/issues"
    },
    "split_keywords": [
        "polya-gamma distribution",
        " polya-gamma random sampling"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "30a414cb74b2e45141c92eda687210f4aded16ab6c99954c8fc328d623fbf861",
                "md5": "554217eeba212e5fd6ad7b4c772d2bc3",
                "sha256": "87f29cee9694d5b7bbbcae3dcb1a56346095d5e18d87b4ddc92dcadee2f181cd"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "554217eeba212e5fd6ad7b4c772d2bc3",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 84962,
            "upload_time": "2024-11-09T08:00:15",
            "upload_time_iso_8601": "2024-11-09T08:00:15.182688Z",
            "url": "https://files.pythonhosted.org/packages/30/a4/14cb74b2e45141c92eda687210f4aded16ab6c99954c8fc328d623fbf861/polyagamma-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "138d0888c9e471044f4920ab57474c760b5907ba31794eda05d2046088044b38",
                "md5": "3f84cfac74113c67f5c2b668b441ebd0",
                "sha256": "f68ec0d948b31ee6ec4ccd23462685365c5da416673296034f6474f4e1f52ad7"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "3f84cfac74113c67f5c2b668b441ebd0",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 54384,
            "upload_time": "2024-11-09T08:00:17",
            "upload_time_iso_8601": "2024-11-09T08:00:17.138507Z",
            "url": "https://files.pythonhosted.org/packages/13/8d/0888c9e471044f4920ab57474c760b5907ba31794eda05d2046088044b38/polyagamma-2.0.1-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "280a4851f4edff69309520bdd0d7638ae0c91bed15ea46950beab70f2ccc22a2",
                "md5": "30503a1f2182be853e6e8dc5b7b8c7c5",
                "sha256": "2a190668e6d46bd49aaa1df255199519e665fc5d8985665731de5fe018a81ddd"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "30503a1f2182be853e6e8dc5b7b8c7c5",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 226238,
            "upload_time": "2024-11-09T08:00:19",
            "upload_time_iso_8601": "2024-11-09T08:00:19.330788Z",
            "url": "https://files.pythonhosted.org/packages/28/0a/4851f4edff69309520bdd0d7638ae0c91bed15ea46950beab70f2ccc22a2/polyagamma-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a3cb2a6e753d272029187b7cacf85d97140c92b29e1313b668dd68c314326d32",
                "md5": "5aae65bcc1c5cdc02f22788b1a15fbef",
                "sha256": "15dfb8b5f5f108cef10f88c468f0f84f5c27073339d8cb61fac1a10b014e1ea8"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5aae65bcc1c5cdc02f22788b1a15fbef",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 231738,
            "upload_time": "2024-11-09T08:00:21",
            "upload_time_iso_8601": "2024-11-09T08:00:21.322093Z",
            "url": "https://files.pythonhosted.org/packages/a3/cb/2a6e753d272029187b7cacf85d97140c92b29e1313b668dd68c314326d32/polyagamma-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8263e04038adaa7409b562389f1eec58f004ab15271182b33791da758175cfd3",
                "md5": "bc7462eeec634e269b0901da8cf495a9",
                "sha256": "658b6ebffc481f23b738c0a93c2fdf6ca4d5620b3ac7f2f67958d496838709c3"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bc7462eeec634e269b0901da8cf495a9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 234894,
            "upload_time": "2024-11-09T08:00:23",
            "upload_time_iso_8601": "2024-11-09T08:00:23.251187Z",
            "url": "https://files.pythonhosted.org/packages/82/63/e04038adaa7409b562389f1eec58f004ab15271182b33791da758175cfd3/polyagamma-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "27d93730cf8930e2fcb25ccf243fbd3b59ddc0b045b21fe2063f1e6e117cac97",
                "md5": "03de32cf1f51f379b82d72edfff8ad80",
                "sha256": "75868ec4985b797da13fc053ae24851cef20b7ebbc54a06fb0147f85483d2f8e"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "03de32cf1f51f379b82d72edfff8ad80",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 86744,
            "upload_time": "2024-11-09T08:00:25",
            "upload_time_iso_8601": "2024-11-09T08:00:25.148720Z",
            "url": "https://files.pythonhosted.org/packages/27/d9/3730cf8930e2fcb25ccf243fbd3b59ddc0b045b21fe2063f1e6e117cac97/polyagamma-2.0.1-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eadfb8cac80b095c46c85ee004ea53b167208e9da12e768792e801fa57d43457",
                "md5": "118895b24f77b9524e58899aadecf13f",
                "sha256": "0b981171a36fcee351a3b3618aba7abed7d7cc074de48a6084ec30f927ed64e6"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "118895b24f77b9524e58899aadecf13f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 84995,
            "upload_time": "2024-11-09T08:00:26",
            "upload_time_iso_8601": "2024-11-09T08:00:26.896700Z",
            "url": "https://files.pythonhosted.org/packages/ea/df/b8cac80b095c46c85ee004ea53b167208e9da12e768792e801fa57d43457/polyagamma-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1f00fc32003c4d7af3f4c6b5c2ebf906f4d719a934dbdc6c786b1e910f7a7cf4",
                "md5": "598c8a85dad116aa334cd3e60ca6e5f1",
                "sha256": "39fa378fa17f5beab99a273f5e56d311fe4c708ae550ba45c1119f728cc9f68e"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "598c8a85dad116aa334cd3e60ca6e5f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 54306,
            "upload_time": "2024-11-09T08:00:28",
            "upload_time_iso_8601": "2024-11-09T08:00:28.638637Z",
            "url": "https://files.pythonhosted.org/packages/1f/00/fc32003c4d7af3f4c6b5c2ebf906f4d719a934dbdc6c786b1e910f7a7cf4/polyagamma-2.0.1-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2fbb87bac58ffcceaf067d580a38777ed53c60ae768e3b86b93a9555a596679a",
                "md5": "24b4c6670fea9be9d80c8e248d14b7d9",
                "sha256": "5fd1b22086bf898d32fa603a0ce6aa0a2a349ddbe7e03ff5ab2d7389739a2aa6"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "24b4c6670fea9be9d80c8e248d14b7d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 235576,
            "upload_time": "2024-11-09T08:00:30",
            "upload_time_iso_8601": "2024-11-09T08:00:30.480156Z",
            "url": "https://files.pythonhosted.org/packages/2f/bb/87bac58ffcceaf067d580a38777ed53c60ae768e3b86b93a9555a596679a/polyagamma-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "31e91da9a1a11119a27cedcb95860f70e99c79c38909266f3ed1b223bc5585c0",
                "md5": "289c177fe964c219b86d44aaa0f666de",
                "sha256": "7552e141349c5fa3506b4190793d5f4071cceb132556060d9dcde2c4d24d0c6c"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "289c177fe964c219b86d44aaa0f666de",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 240661,
            "upload_time": "2024-11-09T08:00:31",
            "upload_time_iso_8601": "2024-11-09T08:00:31.773365Z",
            "url": "https://files.pythonhosted.org/packages/31/e9/1da9a1a11119a27cedcb95860f70e99c79c38909266f3ed1b223bc5585c0/polyagamma-2.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "913fbc34e99ef1ba51dd3d910334fcc9b179d48c4f5e818290085ae4a0926920",
                "md5": "15bd7d193e84ced8c2bbf48aa5b8292e",
                "sha256": "b6a37ba45f1d285c97f94549b02c820d977038d1044d385fc89df9d6b9332f85"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "15bd7d193e84ced8c2bbf48aa5b8292e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 243449,
            "upload_time": "2024-11-09T08:00:32",
            "upload_time_iso_8601": "2024-11-09T08:00:32.927839Z",
            "url": "https://files.pythonhosted.org/packages/91/3f/bc34e99ef1ba51dd3d910334fcc9b179d48c4f5e818290085ae4a0926920/polyagamma-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b6f4722a55d3c94bab2ac2b7c933961d6a4c34cde2e5f89d11e86c909f6b98c5",
                "md5": "5587fef09c250de4f58d608f50de3004",
                "sha256": "003b06bf26c3cf497cd34b6826a4c9dbf6d410623972790305d603285f60d4fc"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "5587fef09c250de4f58d608f50de3004",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 86768,
            "upload_time": "2024-11-09T08:00:34",
            "upload_time_iso_8601": "2024-11-09T08:00:34.806488Z",
            "url": "https://files.pythonhosted.org/packages/b6/f4/722a55d3c94bab2ac2b7c933961d6a4c34cde2e5f89d11e86c909f6b98c5/polyagamma-2.0.1-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "41859b453d90b730edf4bdc17c9471b5bfa2dbd6b99bfaf532f2068f804df741",
                "md5": "11185eda05c76e11c6efadba5fb7edbb",
                "sha256": "844166d0ab3e721e79670edb674711120eba18623e73a283b02e111295b6fccd"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "11185eda05c76e11c6efadba5fb7edbb",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 85387,
            "upload_time": "2024-11-09T08:00:36",
            "upload_time_iso_8601": "2024-11-09T08:00:36.585259Z",
            "url": "https://files.pythonhosted.org/packages/41/85/9b453d90b730edf4bdc17c9471b5bfa2dbd6b99bfaf532f2068f804df741/polyagamma-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c661f4f440335834457d2fd54fa1a15c807bbeaa9861860f88af765ec8afcbeb",
                "md5": "e65ec3ef263647bb3f0f8fdc19df85e5",
                "sha256": "21bf5b48763f6313788a0f60703fe867da449eec758ba7a26ff4ecfcaed5c6e2"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e65ec3ef263647bb3f0f8fdc19df85e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 54496,
            "upload_time": "2024-11-09T08:00:38",
            "upload_time_iso_8601": "2024-11-09T08:00:38.912592Z",
            "url": "https://files.pythonhosted.org/packages/c6/61/f4f440335834457d2fd54fa1a15c807bbeaa9861860f88af765ec8afcbeb/polyagamma-2.0.1-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fc4c2d1df622f9f193e3926f85566b4df6482137b1c0391d698ba364c7c6df2a",
                "md5": "6d51da9111c68a2f5b9eb3f91f04bbeb",
                "sha256": "975ee0c615c07efabed43788d2ff147ba6e4e1100c7974e48ade4c71e7a8a790"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "6d51da9111c68a2f5b9eb3f91f04bbeb",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 246396,
            "upload_time": "2024-11-09T08:00:40",
            "upload_time_iso_8601": "2024-11-09T08:00:40.722723Z",
            "url": "https://files.pythonhosted.org/packages/fc/4c/2d1df622f9f193e3926f85566b4df6482137b1c0391d698ba364c7c6df2a/polyagamma-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8d14ba85bd0e44eb47defebc82ece22b3ab5b1d72586f7a653099a2c223d02a5",
                "md5": "bb1d647ec4e652ca51611c763d2d3595",
                "sha256": "fddedbbabfb15d2a213d38fc8fc3536c209ab9514b5c02eb0c84d7b2350354ce"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bb1d647ec4e652ca51611c763d2d3595",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 252610,
            "upload_time": "2024-11-09T08:00:43",
            "upload_time_iso_8601": "2024-11-09T08:00:43.072853Z",
            "url": "https://files.pythonhosted.org/packages/8d/14/ba85bd0e44eb47defebc82ece22b3ab5b1d72586f7a653099a2c223d02a5/polyagamma-2.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "18bf794f9959722327842542f155cfbfca2160e4a9a3961a2645a0e483b28986",
                "md5": "3ee53adf5d461454f523e4285583f089",
                "sha256": "d67f2d794e2803cbbd716cdce28ef9d3b8510c43f150d9623cf21504146749fd"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3ee53adf5d461454f523e4285583f089",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 254409,
            "upload_time": "2024-11-09T08:00:44",
            "upload_time_iso_8601": "2024-11-09T08:00:44.456924Z",
            "url": "https://files.pythonhosted.org/packages/18/bf/794f9959722327842542f155cfbfca2160e4a9a3961a2645a0e483b28986/polyagamma-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fe1487cc17f2351fe83af38cf2e85d480edec5d7e6ae905809d39b6ab0e12ed0",
                "md5": "0ddf54117e7ec098fb8fe12e5ace4bc7",
                "sha256": "66350aec577ef778da3553e8f25f914b9f544793a879c11c9e51205e7ed2e73b"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0ddf54117e7ec098fb8fe12e5ace4bc7",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 87273,
            "upload_time": "2024-11-09T08:00:45",
            "upload_time_iso_8601": "2024-11-09T08:00:45.616885Z",
            "url": "https://files.pythonhosted.org/packages/fe/14/87cc17f2351fe83af38cf2e85d480edec5d7e6ae905809d39b6ab0e12ed0/polyagamma-2.0.1-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9426caacf75ca1dda0c32d118b9643d20b3ebb107c41515d3a141fd3e103a847",
                "md5": "29c7e3d0fe4b149ae731b03ba9cfa571",
                "sha256": "34dce1aaa5cffa2b462eb78818033130641e1ef397f0a296fa4d2da25f8a8901"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "29c7e3d0fe4b149ae731b03ba9cfa571",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 85116,
            "upload_time": "2024-11-09T08:00:47",
            "upload_time_iso_8601": "2024-11-09T08:00:47.375196Z",
            "url": "https://files.pythonhosted.org/packages/94/26/caacf75ca1dda0c32d118b9643d20b3ebb107c41515d3a141fd3e103a847/polyagamma-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6f99307a9ec9995bc6d6a8ba910f02cef9a3faa00159674fd798779f7c8d6e6e",
                "md5": "426e5bf41fec1e43d967cc0dc027aedf",
                "sha256": "11122f67f3c98474788fa1edc3d11194d9901fa3aeae5ac392f781d0102ac83a"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "426e5bf41fec1e43d967cc0dc027aedf",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 54285,
            "upload_time": "2024-11-09T08:00:49",
            "upload_time_iso_8601": "2024-11-09T08:00:49.042631Z",
            "url": "https://files.pythonhosted.org/packages/6f/99/307a9ec9995bc6d6a8ba910f02cef9a3faa00159674fd798779f7c8d6e6e/polyagamma-2.0.1-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0148b9fc7a630a656e5dc375ad8f1d80a2c9870a520601fae622450ef2cb177c",
                "md5": "dc11643971f02be3097a580ff1105582",
                "sha256": "82f246f025b7ee176e4627917a705af786160c498e5fb3a0635a74ade3d19712"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "dc11643971f02be3097a580ff1105582",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 243500,
            "upload_time": "2024-11-09T08:00:50",
            "upload_time_iso_8601": "2024-11-09T08:00:50.959705Z",
            "url": "https://files.pythonhosted.org/packages/01/48/b9fc7a630a656e5dc375ad8f1d80a2c9870a520601fae622450ef2cb177c/polyagamma-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a87302abe7ba8c540beb7c50e63fbc77fa2df2b575659c4d7601a92b91679995",
                "md5": "d45d3c72ca253bcad82d57aa789af66c",
                "sha256": "cb7ac7643bf3a4a433238c4982ad46bad36f6fff4452d842122d26a76768333a"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d45d3c72ca253bcad82d57aa789af66c",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 248446,
            "upload_time": "2024-11-09T08:00:52",
            "upload_time_iso_8601": "2024-11-09T08:00:52.213935Z",
            "url": "https://files.pythonhosted.org/packages/a8/73/02abe7ba8c540beb7c50e63fbc77fa2df2b575659c4d7601a92b91679995/polyagamma-2.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aa61196ec1e539adb207e596eab51d5b438eb47039ee7287b25b30ca673cde33",
                "md5": "411c7f049fc4ea0071c5f0f7dd0f0c00",
                "sha256": "257b78849c39e9cb5f8413784b120576737b59bd8af8a0ba8d2d46efe11e1028"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "411c7f049fc4ea0071c5f0f7dd0f0c00",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 250654,
            "upload_time": "2024-11-09T08:00:54",
            "upload_time_iso_8601": "2024-11-09T08:00:54.319970Z",
            "url": "https://files.pythonhosted.org/packages/aa/61/196ec1e539adb207e596eab51d5b438eb47039ee7287b25b30ca673cde33/polyagamma-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "44045ba10ec3d02c3e85ece0efd020e6acb672e80293dba7164d24e3f497e5ab",
                "md5": "9649c64d578c70d66ed4e53b2c686cb6",
                "sha256": "2168b1347e0a11f97b5745f87b81d95e59ea3ea39a51b0e13fb8faf5be9a9f82"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9649c64d578c70d66ed4e53b2c686cb6",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 87130,
            "upload_time": "2024-11-09T08:00:55",
            "upload_time_iso_8601": "2024-11-09T08:00:55.509718Z",
            "url": "https://files.pythonhosted.org/packages/44/04/5ba10ec3d02c3e85ece0efd020e6acb672e80293dba7164d24e3f497e5ab/polyagamma-2.0.1-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9d33a9094c61b7acf0408561011f8b67358e054b4a535b9025521782e18038a7",
                "md5": "e8125a58b1d480ea67a543923169ae91",
                "sha256": "3bdc39a6a1201e3e84d47bb7d7475883797bdf3ba8e75a70e8113663260210fd"
            },
            "downloads": -1,
            "filename": "polyagamma-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "e8125a58b1d480ea67a543923169ae91",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 119687,
            "upload_time": "2024-11-09T08:00:57",
            "upload_time_iso_8601": "2024-11-09T08:00:57.282944Z",
            "url": "https://files.pythonhosted.org/packages/9d/33/a9094c61b7acf0408561011f8b67358e054b4a535b9025521782e18038a7/polyagamma-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-09 08:00:57",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "zoj613",
    "github_project": "polyagamma",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "polyagamma"
}
        
Elapsed time: 4.08456s