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 have 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, once can install from source with the following shell commands:

$ git clone https://github.com/zoj613/polyagamma.git
$ cd polyagamma/
$ 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-1.3.4.tar.gz (40.2 kB view details)

Uploaded Source

Built Distributions

polyagamma-1.3.4-pp39-pypy39_pp73-win_amd64.whl (121.2 kB view details)

Uploaded PyPy Windows x86-64

polyagamma-1.3.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (139.4 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (116.6 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

polyagamma-1.3.4-pp38-pypy38_pp73-win_amd64.whl (121.2 kB view details)

Uploaded PyPy Windows x86-64

polyagamma-1.3.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (139.4 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (116.8 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

polyagamma-1.3.4-pp37-pypy37_pp73-win_amd64.whl (121.2 kB view details)

Uploaded PyPy Windows x86-64

polyagamma-1.3.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (139.8 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (116.7 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

polyagamma-1.3.4-cp310-cp310-win_amd64.whl (129.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

polyagamma-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (527.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-cp310-cp310-macosx_10_9_x86_64.whl (145.0 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

polyagamma-1.3.4-cp39-cp39-win_amd64.whl (125.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

polyagamma-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (506.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl (134.9 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

polyagamma-1.3.4-cp38-cp38-win_amd64.whl (126.1 kB view details)

Uploaded CPython 3.8 Windows x86-64

polyagamma-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (524.0 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl (132.4 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

polyagamma-1.3.4-cp37-cp37m-win_amd64.whl (124.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

polyagamma-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (527.0 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

polyagamma-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl (131.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: polyagamma-1.3.4.tar.gz
  • Upload date:
  • Size: 40.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for polyagamma-1.3.4.tar.gz
Algorithm Hash digest
SHA256 169f36b3e882f4b3d56b624ffee701f498fecf60a09d572329f5e3751c8e73c0
MD5 a6f4f241c9c533a722dae1b43247fc5c
BLAKE2b-256 1e65ca4aa0551edff66bcff71c57bbd051da3f51b87773d399b8821fa21ab65f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 c1cb8e4ecb67584347de8c6035df3f512610fb86f3f762ecade5c989d7ff6ae6
MD5 58b5f0e572b50f41071a0dbe9968ed21
BLAKE2b-256 ee33d257958e37849b687621454a5a316e04c4e8c45986a10e49572645636bd2

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 43bf828e989e09fa85219cd19eb0491df75f6d2bc58ac5f8b8b719f73ef3f657
MD5 1ce72575f79d9c0f9acef83711be538f
BLAKE2b-256 04262f7b9a21631eba943fe70494f49fc9dcb17120b9c2c249f9cbb0f715568a

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1154b1121033ea7475772f08adfd7f654a01d35c150c398c0d08be3b84804289
MD5 61ebaeea6da0034cb3e1bbff67742841
BLAKE2b-256 a86f66d4caed3d1213f5049b1da0a3b0e8eca1202d486ec7f5cf3d856cfa4b59

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp38-pypy38_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 ce6ff4a64b64126eb208c203a954db5d5872c7b00232eb001316c2a73a8f9cf3
MD5 06bcc76e433556734e316258b5c37063
BLAKE2b-256 c174bf515634411aeefc2fa31f346d1894d0e5f5b22ec166e2303ccdc2eb7a3e

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9227defa1d3df45214e7a1439c615ca7c57ff5c6179e37c2351b592db377ff3b
MD5 af8aa8de701a1a2425dcf0c1e5114d3e
BLAKE2b-256 1f51aca7ae599c76052cadf3cb5aa1ad20d7b9c231d6284efde8b51b6279b61e

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4fc4e0d2674db9bc81cc80ee9a381dabc2dc67fc6f12fa477da602edf4a8e5cc
MD5 a8278d388825e0bf10c9704e2cf1b6c8
BLAKE2b-256 57b3882e68c037cfca2ed6be3dbf0d639ed8400f2e04d07ce890de67f2a17a95

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 8b9060ab502d923ee892b3a064a9441b231a6a2d854cf46b96a837c94df9024e
MD5 a55acd8fcd21e419749b6451be39be27
BLAKE2b-256 a63190e8b1db129a564043c2c819302236786cf5d6437c5ecb0ab0014c2e2d00

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f0b5ae437c6a3092e8d0ce82f8c830707f48614b9c447cdbf6a0dca9cf5f8865
MD5 afd4972568fb6161393bb898f636648f
BLAKE2b-256 17167d6bf1514253f2c5eee08fd1525d7136599b3f73e9c831c12b412804983b

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6bc96436820aa17c8beac7e2b37cb0ac4110c2b0fe1569eb9c29b7941a1820cb
MD5 91265337e26ab21ec63bd0542034ab11
BLAKE2b-256 618d8ce9734d56515ef8325329f50e5b5c5eb8809dfc812005bdc0799ac40893

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 df43c7ae7dc19cfeb42cc98837ae30da0a33be34030c3931a0188f6610a17e67
MD5 675afddfd004217694703499e6baf080
BLAKE2b-256 fe72cca0b21441c84e6ce11c484b5b58f40d857aed3356c64f2c882e9240de93

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c331b39aa823be843c4eeed85a6ef6fa3d6049279fda02168e9f873aae90a67a
MD5 d4787b1e559881ab025f3c8337946479
BLAKE2b-256 1a9ff872ece70a4350be8c71ca32e66bd0f5adeadbb8461eff40099be78adf22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a89f2a438c290c46178e18394f22923ec3bbeb33ea6ea5ecf4c96e0dd54c3e8e
MD5 4805d76967b48bc989078762b7d74369
BLAKE2b-256 37c939e8c38cd9ff69b932adaaaa0b19f428eeaa237873521e22a6464d80604b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: polyagamma-1.3.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 125.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for polyagamma-1.3.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5d91b2113436ac2a5ff8d86e30896aa7d42c1abcddfc784fcc599f58323517dd
MD5 4ffcdea8dcb32b0e60ee70c03b32603f
BLAKE2b-256 e55ed9e98bbef0928d1f1eb61b40f167b2d2b3542905ee2823e490f04d542c29

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0675b66eb079c15ff7c610c68fb2b45925682fa381f04a3969aa39926dfe4f0d
MD5 4d9d0b375a4218987b7a7a4831bef882
BLAKE2b-256 d055b2ecf8a5b9f7b9a875f0cd1172e7b1ae4d021b89031a94bdb56a9ff34999

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c24257f5a57d4d89e41d7344621e779544dcf738e1c5af1d518be7050ac59e66
MD5 1cf528e0e38339427a961a1df9018c5a
BLAKE2b-256 00f63efea0d2df31d0215dde49708d7efa8dc5b5e7916f287a7b1788c2854044

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: polyagamma-1.3.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 126.1 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for polyagamma-1.3.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e79427670aa1a8fd050963c3f9ed58dd25a6f9e9172193e06756828c06ae15b0
MD5 9efd63bcf865c3085be59ddd6a49aa51
BLAKE2b-256 4f8851a14831d609c8aeac6a78392ec64d6f4fd52f54c7f2c715c83ba0e6e481

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 524232658ad9a085eea85a45d8d20260818832deea81b86a202d17b565bd899d
MD5 214a20ff0269a8b97ba539a70e594e08
BLAKE2b-256 8ae34f69276845301779b9807343bb8e6182e1d0cc96271c702bd6ffd3322a91

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c35f8c289a66e1cc466ac9e797b65ce0c3840a3d08a91869cd31f68527506acf
MD5 489fd99d8f1a50201ab59f7160f6bc3d
BLAKE2b-256 ce9e6a2357afce35aa74c23bcea8b666fcce40482b4bcd8b42949f0311c38271

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 1815471ca05c7ab2ca00865bbd8d0fa1871edbd641c9aab4a2e199bf956fa199
MD5 88a5bac61b191909afd7d6f6c8fd1178
BLAKE2b-256 c678d793c455b0dc840e680e6c0fc4a1e9517c98c692a59c131f2179e4b93578

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b1498909e02a9c7dae915e8173650398665b056edf9673f834136caf6df33699
MD5 e5ee8ef893fcac6ba3ef4296fcfff646
BLAKE2b-256 b472d6667543408ea38ded69169cdba9fd6c0fb796ac6724722c0930e960dabf

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4e1fc572bd114693a07f963e79e9724d28bfd45fb92a6d211ec67ba551b8e881
MD5 ea9a7eee3ebf570454281806220a644b
BLAKE2b-256 fdf00d9db719ec352abc11c41e462529415ad6a1b7725514092929ce7641ad1f

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