Skip to main content

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

Project description

Polya-Gamma

PyPI - Wheel CI Codecov PyPI - License PyPI Conda

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 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

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.

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 header file for more info about the function signatures. Below is an example of how these functions can be used.

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.

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 page, or using pip with the following shell command:

$ pip install --pre -U polyagamma

or using conda with the following command:

$ conda install -c conda-forge polyagamma

Alternatively, one can install from source with the following shell commands:

$ 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.

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.

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:

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

$ 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.

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.

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 .

Project details


Download files

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

Source Distribution

polyagamma-2.0.0.tar.gz (119.7 kB view details)

Uploaded Source

Built Distributions

polyagamma-2.0.0-pp39-pypy39_pp73-win_amd64.whl (82.9 kB view details)

Uploaded PyPy Windows x86-64

polyagamma-2.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (92.1 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-2.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl (82.8 kB view details)

Uploaded PyPy macOS 10.15+ x86-64

polyagamma-2.0.0-cp312-cp312-win_amd64.whl (87.2 kB view details)

Uploaded CPython 3.12 Windows x86-64

polyagamma-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl (254.4 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

polyagamma-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (246.4 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (252.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-2.0.0-cp312-cp312-macosx_11_0_arm64.whl (54.5 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

polyagamma-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl (85.8 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

polyagamma-2.0.0-cp311-cp311-win_amd64.whl (86.7 kB view details)

Uploaded CPython 3.11 Windows x86-64

polyagamma-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl (243.5 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

polyagamma-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (235.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (240.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-2.0.0-cp311-cp311-macosx_11_0_arm64.whl (54.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

polyagamma-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl (84.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

polyagamma-2.0.0-cp310-cp310-win_amd64.whl (86.7 kB view details)

Uploaded CPython 3.10 Windows x86-64

polyagamma-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl (234.8 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

polyagamma-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (226.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (231.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-2.0.0-cp310-cp310-macosx_11_0_arm64.whl (54.4 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

polyagamma-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl (84.9 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

polyagamma-2.0.0-cp39-cp39-win_amd64.whl (86.7 kB view details)

Uploaded CPython 3.9 Windows x86-64

polyagamma-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl (234.2 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

polyagamma-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (225.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (231.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-2.0.0-cp39-cp39-macosx_11_0_arm64.whl (54.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

polyagamma-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl (84.9 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

File details

Details for the file polyagamma-2.0.0.tar.gz.

File metadata

  • Download URL: polyagamma-2.0.0.tar.gz
  • Upload date:
  • Size: 119.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.9

File hashes

Hashes for polyagamma-2.0.0.tar.gz
Algorithm Hash digest
SHA256 c16ded27967a8c01992b9fb9449c6d2fb3d44362207b821b143c3875fb70bb8e
MD5 940e13cf75dfb15a1af49356129fde06
BLAKE2b-256 e68bab4fac350f8c5facdc3d9aa6b4ddb24b1e26bd50cde85c4c5735a6b192d4

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-pp39-pypy39_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 7d17bf1eb017aefb102e0f4ac8ccc408156b6ba02677dffc5b8a165a10eeb3d1
MD5 dfe1e05767a93924e7c0951a8ea5fa09
BLAKE2b-256 177b313123e15cb0677e7d90132f76bfcc60b4a7078545f8d24688503d662bc6

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3bc6ef38d2f2637d52f2b479249cc89e4b21ece36e96ef4824f2e07fd163f7cb
MD5 9c194d1c56ed73e558833f284ac1c483
BLAKE2b-256 89449e5aff6006995138257dac10318bab616cb683ad9939fb7fd73d3f577615

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 84df2be9bd4121083e284218f389fb213d16c33c45b35fac751e873e499ab1cb
MD5 29712578c062bbb0ba2f4bd0d6311b09
BLAKE2b-256 629f62efe3a43713b96c5d3991008368f1a2f16bc7c97db8fdd02cf652a58b1b

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1d0b88d55ce3f9eda10592ff2fd97a2a0e05927337eeef9f25c303ffc69c278e
MD5 f29a29f02cd7fe2fa99ffdba14e2138e
BLAKE2b-256 929f1ee1c0b34b0abaa4515232eede15d3145aa7ad8b0a9d860f916c58bdf843

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7f79d9fc168fca1a86a6020ac6cb55a9c17eb9af730d5ef387ac79cfb46edcb2
MD5 067623458d526764d21201cc5c9bbbf2
BLAKE2b-256 47a109cb4937f1e85efa007c3581d6143179a79826c6ddecf0bda01862839ef8

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 525df7fc552b0faf7ca5adbc95559b66c137abfc791292b58a34bfd1405a35ad
MD5 d608ab8931f9b05f1d8889e279eba217
BLAKE2b-256 08eb58ac081b1be26af2df2f4dfd7531e48b58f33dedb0c3af401d81a3076501

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 afab0f191992b46e82f1b3d93fa0cd4b6c1b6c59274bb51ae165c6c3ddfa236f
MD5 c64bc697fc22128e17b57282711673e0
BLAKE2b-256 5a80cb5104eab1dc91a9105ed009d589e12c2fe983f219acbb5da6f53e5955b9

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 625eb90773e2e829160508712802e1138fc626d31ce7036ac0f5d041d4d92217
MD5 c1bff9830aad2f95a7d2d9bab8c428ba
BLAKE2b-256 d112ea6fd3d5a28b2f995d63c484f1c9e2ef5af9f177d11220d04df3f023e208

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 53b699bb9b567fda244527b07dfcccaf368f50a4b3f67b0407bd08297236024d
MD5 8a85ce71ff07f4eeff5d8a5cae394127
BLAKE2b-256 f67c504a70de34d2540eb54a72226a678098c0e5f73737c201823c904d77acd7

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d89864b1758c4e75d0cb681808038d9a32e2ef7c4324ddf5cf27fb00f5814c63
MD5 ae0f5a4fc923b81b7ea1f58127330e8b
BLAKE2b-256 29e0ff861106c7834c85a8ff3f823477008178bf4574536de1b1511e75cf78a5

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d11fb9e084b76ec89d2118c11b4873a2099e98326882ce8872ef9d3beb4f48ed
MD5 be9fbe9f817c08983d28eaa70098f780
BLAKE2b-256 8d8cc421c52591db2a2c8a74b02e859bb7cf901af99312dc62b0c0bd80e943ed

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e90bbbd5564015629c44aae3f34c41559061eb348306af5f50efc9f5a6bd0944
MD5 cf939d840af9dc57307ebfc1fb14b50f
BLAKE2b-256 a6b802547ba4fac4d6e2bd1a69814c8ab8d4d7c6857856479942be405cc5a219

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fd305d029fef1f109461f446ac28cae68a95ab26480a6b3a33f4af87e88bb60f
MD5 50b2b3e3586da1930e8d34e4505d5081
BLAKE2b-256 805ce4492563c5cc96d2801106a625d04fe011a2e2d6031d0a7635322af3ac53

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 758670d727963c829bf1fbc05b8c461adc46ffac6707c23869a7e92f7c1c47eb
MD5 c5920c60ceec2ce5ac3ee4c3927439bd
BLAKE2b-256 00de48c81f49a8a12cdd2ef1b59f98fdc0bfcf3f3fd0fd28dc67ebf0cb678b22

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1e4c59773bd7525510498b452d55267da7cdb9a1a9326a54faea384bf3464c75
MD5 cc6cfd7bdcaaf487e711afd4defecb7d
BLAKE2b-256 31e2408788cac317481c7745fb4fa6b1f96f4048e4e91580fe52dc52351b0708

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e104ce9087ca15715b33a2e0624190224ce9799140acc93dbf83f694f8e55782
MD5 4e3c507b9dc04d03176d92ea3198b9a2
BLAKE2b-256 d116f8e8521c5a1d1d6650b1acca808b24e139ad56b8545b9231f7033e387549

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9224435bbebb27d9a307b512d552ab617b01c0d8aa5e39c552cb7d506d395332
MD5 5b17f964f74dd6542ef7914fb0492c0d
BLAKE2b-256 a678ca1ede8c663b0783baccc9012c77305e3377a9e8fc6f6affeabecda987aa

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 047b0e237363fee0a474303b35f46c8ac26202d7a0350e4720c6abce4c7d081e
MD5 d3b939852d1431d93e51584ecba7b573
BLAKE2b-256 a10a0919a29a6080d26772e0b3795fd4079dd21067b83672cef2a53c8ecea091

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 661f68b23ede1788dc2a655dbc6fc324d56878472f47ce4293bb23eb0109ca46
MD5 8502f3c164ed9d5183ec30a28c9d87f1
BLAKE2b-256 4ccbc1e7962d660171ea1d8c88599cc9604e25dcdcbbf35b4bfe3fdcb0434679

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 667055e048384c7f2aac7d416af46e79ee8646fea52492e2f7ddeeeab9cc5646
MD5 072f8eae0bd1d06856433f73a7fc0ada
BLAKE2b-256 b2c29fb2f088bca6a49c3ca8792d146ddb8e15fb7fbec987c0e521e23e4fb4ba

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c1d0373f8b8b60fdbf154a37bcc5c88987025d22c1fa1a2cd95ad0617e1ad93b
MD5 753214902c223236e9f4ab926f155897
BLAKE2b-256 9b1ba3d1693fc366ea81fffb08d1a2015c4f4c8bb6b138bde2f49730b688ec36

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: polyagamma-2.0.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 86.7 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.9

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 84ee3bc895f8af39bfab76ee0acdbe6ba05b606d457e6d7199e351fbfccdb81e
MD5 a46d464bfce22567bc02039ecfea7958
BLAKE2b-256 5f2c60f4e5c690dfa143c4273e772c07072e1438613b81e494c6262aa3a4b129

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6e9f4e2a97891465a722324a9f12a701945612a9330e11e4dc398056b7f3944f
MD5 ba41568cb2e8c6483824670befe91dce
BLAKE2b-256 3bff8b3c12e49c77c8fcc91e6e383f89d0a0abf747cab97880969f4ae2bdfdd6

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2dd4fb6e391e438d2e07c64ca9c69cf0ab517a20b19187166301aa24157c95a9
MD5 c8560023dd7329a82eda05cabc336b2e
BLAKE2b-256 4dd349f413a8d94912da8b566119a816cb4b8ef104e0fd9187e954c03c751bcf

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6e04408d0983699f06af85a7adc8cdbd5759424d4f188710f0995bc0a7f877ec
MD5 defd83ece3ea996a057fc382a4ae47d8
BLAKE2b-256 2b55f2b70034f0dfa55251f6e0ee3110095948be732692cb88626f6913a3d7f9

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88129d7c2375af63d57a9c11d2a959fd2ddaec4c3c31a7103aede93089bc4ed7
MD5 0a8d6ee8871f7230a84cb8816da4898b
BLAKE2b-256 dbea4f189ecf4b6af5a72accb3f196ba4d3a3dbbb14de1a1c3907ae29a642165

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6252aa4fdeff3e14cc7f4854c1ca4c021219812d86a1107a449d4c823e2c5300
MD5 24e22332652036b068fa964f5e4fdd98
BLAKE2b-256 2f8dddaebedafd684b63f68d2c8766c6d89b6fd296b2855c676d3b0016fcbdf5

See more details on using hashes here.

Supported by

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