Skip to main content

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

Project description

Polya-Gamma

PyPI - Wheel PyPI PyPI - License CI Codecov

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 10 array of PG(1, 2) variates.
o = random_polyagamma(z=2, size=(5, 10))

# 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 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)
...

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 polyagamma

To install the latest pre-release version, use:

$ pip install --pre -U polyagamma

Alternatively, once can install from source by cloning the repo. This requires an installation of poetry and the following shell commands:

$ git clone https://github.com/zoj613/polya-gamma.git
$ cd polya-gamma/
# install dependencies
$ poetry install --no-root
$ make install
# add package to python's path
$ export PYTHONPATH=$PWD:$PYTHONPATH 

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 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 the poetry package and setup the dev environment with poetry install --no-root. All dependencies will be installed.
  3. Start writing your changes, including unittests.
  4. Once finished, run make install to build the project with the new changes.
  5. Once build is successful, run tests to make sure they all pass with make test.
  6. 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.2b2.tar.gz (170.5 kB view details)

Uploaded Source

Built Distributions

polyagamma-1.3.2b2-cp39-cp39-win_amd64.whl (126.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

polyagamma-1.3.2b2-cp39-cp39-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl (523.4 kB view details)

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

polyagamma-1.3.2b2-cp39-cp39-macosx_10_15_x86_64.whl (134.8 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

polyagamma-1.3.2b2-cp38-cp38-win_amd64.whl (126.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

polyagamma-1.3.2b2-cp38-cp38-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl (542.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-1.3.2b2-cp38-cp38-macosx_10_15_x86_64.whl (132.2 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

polyagamma-1.3.2b2-cp37-cp37m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl (493.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-1.3.2b2-cp37-cp37m-macosx_10_15_x86_64.whl (131.1 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

polyagamma-1.3.2b2-cp36-cp36m-win_amd64.whl (124.6 kB view details)

Uploaded CPython 3.6m Windows x86-64

polyagamma-1.3.2b2-cp36-cp36m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl (492.0 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

polyagamma-1.3.2b2-cp36-cp36m-macosx_10_15_x86_64.whl (133.1 kB view details)

Uploaded CPython 3.6m macOS 10.15+ x86-64

File details

Details for the file polyagamma-1.3.2b2.tar.gz.

File metadata

  • Download URL: polyagamma-1.3.2b2.tar.gz
  • Upload date:
  • Size: 170.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2.tar.gz
Algorithm Hash digest
SHA256 8420fcdb34892daf7239364c066029a55dcd103a8b94538e209a932f7a55ae75
MD5 09413de9ff926d4a8be6a440b8d174ee
BLAKE2b-256 1e8ad359e3cce2fc4bbd5bf9c8ecd4018eab9e4cbb29656556c19091e93cf45b

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 126.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ca5eea5d93c8461051da2810eb9bab0e8027df1ccc0b5ca19d281163e59e804f
MD5 e31cf506e61ae4715554eab4d65ee2b6
BLAKE2b-256 2355965f66ee4407017b05c1859bee60775324a08a906425de4973bc05ba74bc

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp39-cp39-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.2b2-cp39-cp39-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7a1eb2e29203fd78def70c854c19185c4c6746d613232721d223a8eb1bf07747
MD5 af5604f6157a13d1b011efa0097e7a43
BLAKE2b-256 0576a1c6cf63cdbe6ec63e088c5fb5907ef2450ffd5f80db5d345cd949723606

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp39-cp39-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 134.8 kB
  • Tags: CPython 3.9, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 be2318b65fc02dc539d443e777b9226d0f7cee494bab224d8bf06b8e9746b7a4
MD5 3568caeb9a70a76b05f064a3ae78b8b8
BLAKE2b-256 f7556dc4bb3253576e29fb9d11f958fb6b96e09084075726e98ae296920fed72

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 126.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 86bf482c14b6cce349eb2df2418f975ceeaeed7f0a5293278e0512939a3501e0
MD5 cba1f7e81d4e9c06661eadd147661648
BLAKE2b-256 b5046a63915deb7f5683b5335d7e51f6db7dc11723c9708b57b3581b8daf6cd1

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp38-cp38-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.2b2-cp38-cp38-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ab76cc92dd3f92f1d498cf9e86ad155589e6148c1fe331a2a93ef7b8b33d1ade
MD5 5319b7ce5eb503d56eab67b1c454a48a
BLAKE2b-256 7646c2124a28ec484eea024dd87779cd04c762b8baa16c223cac7b2d4fcd0667

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp38-cp38-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 132.2 kB
  • Tags: CPython 3.8, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6092210e924e8da9f48e99e310c76406e25ddc4b27577629442b737c8f331ad0
MD5 124896a16a59787bb14db8404c6c0271
BLAKE2b-256 d3ca3a532847f30be2b8660e2a5b6e291fa68a5ff055e90181f04494f491af87

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 124.6 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 565d8d963ee8c803d0fe378689ee6c047c90bf83024b41549b5b8bc0c449e5ac
MD5 a457184978c1a99a2cf81c5c0718e4d9
BLAKE2b-256 59b509797170c8789cc295820a6e936485de2574eed1c24c0b9a405b415558b4

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp37-cp37m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.2b2-cp37-cp37m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 843dba9b430930015f76050aa5c340e71c953b618423d2313bf5b40cfa9cefba
MD5 b5f1f7aeccb5b15810e3748bc9e8a6db
BLAKE2b-256 038d59186867caa34984612d14bc31db3b4e3e49dc0e5dac581e8cbe51683434

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp37-cp37m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 131.1 kB
  • Tags: CPython 3.7m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e77e53542e97319c771e9b94c2688e95cc163e40c595099b846bbca17f1e88c6
MD5 1a9fbffb4b0cd4678792f792067a9663
BLAKE2b-256 14c116f717f493e834d550b0dd7ac736e1e3e4596a76c5b7c5790444939f06a2

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 124.6 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 e7381f9868b8701bdb188d59792ebc435dceced9e53763dbd65954ea3ac8dc3f
MD5 758b3a9442aab79a98188fb14f5296de
BLAKE2b-256 a905bedba499604a916206b6d544404a86a0f45b05a23916aa4442168ba89911

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp36-cp36m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for polyagamma-1.3.2b2-cp36-cp36m-manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 9b95ea48209f1aa5646cb459a7a02b8a27808c061521880d291d35f8bb096be0
MD5 37ff2386d74fd9b1fd4ee9e09247112d
BLAKE2b-256 596339d6bcacd0f9d231bd4bc409814c24b9eed99fe2a90fcb3f67841eea47d5

See more details on using hashes here.

File details

Details for the file polyagamma-1.3.2b2-cp36-cp36m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: polyagamma-1.3.2b2-cp36-cp36m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 133.1 kB
  • Tags: CPython 3.6m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.6

File hashes

Hashes for polyagamma-1.3.2b2-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 769f004072f2b7faa731d2564be1def5038826154b7587052ec4d4c186c4e1ce
MD5 ceaac65e4b3017ce16099652eb4bfc3c
BLAKE2b-256 bf6c346bae1d9d3caf8452913118b07c84ab681b685ce5d9447cefa48e4d1b68

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