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.1.tar.gz (119.7 kB view details)

Uploaded Source

Built Distributions

polyagamma-2.0.1-cp313-cp313-win_amd64.whl (87.1 kB view details)

Uploaded CPython 3.13 Windows x86-64

polyagamma-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl (250.7 kB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

polyagamma-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (243.5 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (248.4 kB view details)

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

polyagamma-2.0.1-cp313-cp313-macosx_11_0_arm64.whl (54.3 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

polyagamma-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl (85.1 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

polyagamma-2.0.1-cp312-cp312-win_amd64.whl (87.3 kB view details)

Uploaded CPython 3.12 Windows x86-64

polyagamma-2.0.1-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.1-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.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (252.6 kB view details)

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

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

Uploaded CPython 3.12 macOS 11.0+ ARM64

polyagamma-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl (85.4 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

polyagamma-2.0.1-cp311-cp311-win_amd64.whl (86.8 kB view details)

Uploaded CPython 3.11 Windows x86-64

polyagamma-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl (243.4 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

polyagamma-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (235.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

polyagamma-2.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (240.7 kB view details)

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

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

Uploaded CPython 3.11 macOS 11.0+ ARM64

polyagamma-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl (85.0 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

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

Uploaded CPython 3.10 Windows x86-64

polyagamma-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl (234.9 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

polyagamma-2.0.1-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.1-cp310-cp310-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.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

polyagamma-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl (85.0 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for polyagamma-2.0.1.tar.gz
Algorithm Hash digest
SHA256 3bdc39a6a1201e3e84d47bb7d7475883797bdf3ba8e75a70e8113663260210fd
MD5 e8125a58b1d480ea67a543923169ae91
BLAKE2b-256 9d33a9094c61b7acf0408561011f8b67358e054b4a535b9025521782e18038a7

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2168b1347e0a11f97b5745f87b81d95e59ea3ea39a51b0e13fb8faf5be9a9f82
MD5 9649c64d578c70d66ed4e53b2c686cb6
BLAKE2b-256 44045ba10ec3d02c3e85ece0efd020e6acb672e80293dba7164d24e3f497e5ab

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 257b78849c39e9cb5f8413784b120576737b59bd8af8a0ba8d2d46efe11e1028
MD5 411c7f049fc4ea0071c5f0f7dd0f0c00
BLAKE2b-256 aa61196ec1e539adb207e596eab51d5b438eb47039ee7287b25b30ca673cde33

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 82f246f025b7ee176e4627917a705af786160c498e5fb3a0635a74ade3d19712
MD5 dc11643971f02be3097a580ff1105582
BLAKE2b-256 0148b9fc7a630a656e5dc375ad8f1d80a2c9870a520601fae622450ef2cb177c

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-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.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cb7ac7643bf3a4a433238c4982ad46bad36f6fff4452d842122d26a76768333a
MD5 d45d3c72ca253bcad82d57aa789af66c
BLAKE2b-256 a87302abe7ba8c540beb7c50e63fbc77fa2df2b575659c4d7601a92b91679995

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11122f67f3c98474788fa1edc3d11194d9901fa3aeae5ac392f781d0102ac83a
MD5 426e5bf41fec1e43d967cc0dc027aedf
BLAKE2b-256 6f99307a9ec9995bc6d6a8ba910f02cef9a3faa00159674fd798779f7c8d6e6e

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 34dce1aaa5cffa2b462eb78818033130641e1ef397f0a296fa4d2da25f8a8901
MD5 29c7e3d0fe4b149ae731b03ba9cfa571
BLAKE2b-256 9426caacf75ca1dda0c32d118b9643d20b3ebb107c41515d3a141fd3e103a847

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 66350aec577ef778da3553e8f25f914b9f544793a879c11c9e51205e7ed2e73b
MD5 0ddf54117e7ec098fb8fe12e5ace4bc7
BLAKE2b-256 fe1487cc17f2351fe83af38cf2e85d480edec5d7e6ae905809d39b6ab0e12ed0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d67f2d794e2803cbbd716cdce28ef9d3b8510c43f150d9623cf21504146749fd
MD5 3ee53adf5d461454f523e4285583f089
BLAKE2b-256 18bf794f9959722327842542f155cfbfca2160e4a9a3961a2645a0e483b28986

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 975ee0c615c07efabed43788d2ff147ba6e4e1100c7974e48ade4c71e7a8a790
MD5 6d51da9111c68a2f5b9eb3f91f04bbeb
BLAKE2b-256 fc4c2d1df622f9f193e3926f85566b4df6482137b1c0391d698ba364c7c6df2a

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-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.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fddedbbabfb15d2a213d38fc8fc3536c209ab9514b5c02eb0c84d7b2350354ce
MD5 bb1d647ec4e652ca51611c763d2d3595
BLAKE2b-256 8d14ba85bd0e44eb47defebc82ece22b3ab5b1d72586f7a653099a2c223d02a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 21bf5b48763f6313788a0f60703fe867da449eec758ba7a26ff4ecfcaed5c6e2
MD5 e65ec3ef263647bb3f0f8fdc19df85e5
BLAKE2b-256 c661f4f440335834457d2fd54fa1a15c807bbeaa9861860f88af765ec8afcbeb

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 844166d0ab3e721e79670edb674711120eba18623e73a283b02e111295b6fccd
MD5 11185eda05c76e11c6efadba5fb7edbb
BLAKE2b-256 41859b453d90b730edf4bdc17c9471b5bfa2dbd6b99bfaf532f2068f804df741

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 003b06bf26c3cf497cd34b6826a4c9dbf6d410623972790305d603285f60d4fc
MD5 5587fef09c250de4f58d608f50de3004
BLAKE2b-256 b6f4722a55d3c94bab2ac2b7c933961d6a4c34cde2e5f89d11e86c909f6b98c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b6a37ba45f1d285c97f94549b02c820d977038d1044d385fc89df9d6b9332f85
MD5 15bd7d193e84ced8c2bbf48aa5b8292e
BLAKE2b-256 913fbc34e99ef1ba51dd3d910334fcc9b179d48c4f5e818290085ae4a0926920

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5fd1b22086bf898d32fa603a0ce6aa0a2a349ddbe7e03ff5ab2d7389739a2aa6
MD5 24b4c6670fea9be9d80c8e248d14b7d9
BLAKE2b-256 2fbb87bac58ffcceaf067d580a38777ed53c60ae768e3b86b93a9555a596679a

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-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.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7552e141349c5fa3506b4190793d5f4071cceb132556060d9dcde2c4d24d0c6c
MD5 289c177fe964c219b86d44aaa0f666de
BLAKE2b-256 31e91da9a1a11119a27cedcb95860f70e99c79c38909266f3ed1b223bc5585c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 39fa378fa17f5beab99a273f5e56d311fe4c708ae550ba45c1119f728cc9f68e
MD5 598c8a85dad116aa334cd3e60ca6e5f1
BLAKE2b-256 1f00fc32003c4d7af3f4c6b5c2ebf906f4d719a934dbdc6c786b1e910f7a7cf4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0b981171a36fcee351a3b3618aba7abed7d7cc074de48a6084ec30f927ed64e6
MD5 118895b24f77b9524e58899aadecf13f
BLAKE2b-256 eadfb8cac80b095c46c85ee004ea53b167208e9da12e768792e801fa57d43457

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 75868ec4985b797da13fc053ae24851cef20b7ebbc54a06fb0147f85483d2f8e
MD5 03de32cf1f51f379b82d72edfff8ad80
BLAKE2b-256 27d93730cf8930e2fcb25ccf243fbd3b59ddc0b045b21fe2063f1e6e117cac97

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 658b6ebffc481f23b738c0a93c2fdf6ca4d5620b3ac7f2f67958d496838709c3
MD5 bc7462eeec634e269b0901da8cf495a9
BLAKE2b-256 8263e04038adaa7409b562389f1eec58f004ab15271182b33791da758175cfd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2a190668e6d46bd49aaa1df255199519e665fc5d8985665731de5fe018a81ddd
MD5 30503a1f2182be853e6e8dc5b7b8c7c5
BLAKE2b-256 280a4851f4edff69309520bdd0d7638ae0c91bed15ea46950beab70f2ccc22a2

See more details on using hashes here.

File details

Details for the file polyagamma-2.0.1-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.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15dfb8b5f5f108cef10f88c468f0f84f5c27073339d8cb61fac1a10b014e1ea8
MD5 5aae65bcc1c5cdc02f22788b1a15fbef
BLAKE2b-256 a3cb2a6e753d272029187b7cacf85d97140c92b29e1313b668dd68c314326d32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f68ec0d948b31ee6ec4ccd23462685365c5da416673296034f6474f4e1f52ad7
MD5 3f84cfac74113c67f5c2b668b441ebd0
BLAKE2b-256 138d0888c9e471044f4920ab57474c760b5907ba31794eda05d2046088044b38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 87f29cee9694d5b7bbbcae3dcb1a56346095d5e18d87b4ddc92dcadee2f181cd
MD5 554217eeba212e5fd6ad7b4c772d2bc3
BLAKE2b-256 30a414cb74b2e45141c92eda687210f4aded16ab6c99954c8fc328d623fbf861

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