pyhtnorm


Namepyhtnorm JSON
Version 2.0.1 PyPI version JSON
download
home_page
SummaryFast Simulation of Hyperplane-Truncated Multivatiate Normal Distributions
upload_time2023-05-23 23:44:28
maintainer
docs_urlNone
author
requires_python>=3.8
licenseBSD 3-Clause License
keywords statistical sampling multivariate gaussian distribution hyperplane truncated multivariate normal structured precision multivariate normal sampling distribution posterior sampling
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # htnorm

This repo provides a C implementation of a fast and exact sampling algorithm for a 
multivariate normal distribution (MVN) truncated on a hyperplane as described [here][1]

This repo implements the following from the paper:

- Efficient sampling from a MVN truncated on a hyperplane: 

    ![hptrunc](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D_%7B%5Cmathcal%7BS%7D%7D%28%5Cmathbf%7B%5Cmu%7D%2C%20%5Cmathbf%7B%5CSigma%7D%29%3B%20%5Chspace%7B2mm%7D%20%5Cmathcal%7BS%7D%20%3D%20%5C%7B%5Cmathbf%7Bx%7D%20%3A%20%5Cmathbf%7BG%7D%5Cmathbf%7Bx%7D%20%3D%20%5Cmathbf%7Br%7D%5C%7D%2C%20%5Cmathbf%7BG%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bk_2%20%5Ctimes%20k%7D%2C%20rank%28%5Cmathbf%7BG%7D%29%20%3D%20k_2%20%3C%20k)

- Efficient sampling from a MVN with a stuctured precision matrix that is a sum of an invertible matrix and a low rank matrix: 

    ![struc](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D%5C%5B%5Cmathbf%7B%5Cmu%7D%2C%20%28%5Cmathbf%7BA%7D%20+%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5C%5D%3B%20%5Chspace%7B2mm%7D%20%5Cmathbf%7B%5CPhi%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20p%7D%2C%20%5Cmathbf%7B%5COmega%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20n%7D%2C%20%5Cmathbf%7BA%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bp%20%5Ctimes%20p%7D)

- Efficient sampling from a MVN with a structured precision and mean:

    ![strucmean](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D%5CBig%5C%5B%28%5Cmathbf%7BA%7D%20+%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7Bt%7D%2C%20%28%5Cmathbf%7BA%7D%20+%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5CBig%5C%5D%3B%20%5Chspace%7B2mm%7D%20%5Cmathbf%7B%5COmega%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20n%7D%2C%20%5Cmathbf%7BA%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bp%20%5Ctimes%20p%7D)

The algorithms implemented have the following practical applications:
- Topic models when unknown parameters can be interpreted as fractions.
- Admixture models
- discrete graphical models
- Sampling from the posterior distribution of an Intrinsic Conditional Autoregressive prior [icar][8]
- Sampling from the posterior conditional distributions of various bayesian regression problems.


## Dependencies

- A C compiler that implements the C99 standard or later
- An installation of `LAPACK`.

## Usage

Building a shared library of `htnorm` can be done with the following:
```bash
# optionally set path to LAPACK shared library
$ export LIBS_DIR="some/path/to/lib/"
$ make lib
```
Afterwards the shared library will be found in a `lib/` directory of the project root,
and the library can be linked dynamically via `-lhtnorm`.

The puplic interface exposes the samplers through the function declarations
```C
 int htn_hyperplane_truncated_mvn(rng_t* rng, const ht_config_t* conf, double* out);
 int htn_structured_precision_mvn(rng_t* rng, const sp_config_t* conf, double* out);
```

The details of the parameters are documented in ther header files ["htnorm.h"][4].

Random number generation is done using [PCG64][2] or [Xoroshiro128plus][3] bitgenerators. 
The interface allows using a custom bitgenerator, and the details are documented in the header file 
["rng.h"][5].

## Example
```C
#include "htnorm.h"

int main (void)
{
    ...
    // instantiate a random number generator
    rng_t* rng = rng_new_pcg64_seeded(12345);
    ht_config_t config;
    init_ht_config(&config, ...);
    double* out = ...; // array to store the samples
    int res = htn_hyperplane_truncated_mvn(rng, &config, out);
    // res contains a number that indicates whether sampling failed or not.
    ...
    // finally free the RNG pointer at some point
    rng_free(rng);
    ...
    return 0;
}
```

## Python Interface
[![PyPI - Wheel][10]](https://pypi.org/project/pyhtnorm/#files)
[![PyPI][11]](https://pypi.org/project/pyhtnorm/)
[![CI][12]](https://github.com/zoj613/htnorm/actions/workflows/build-and-test.yml)
[![Codecov][13]](https://codecov.io/gh/zoj613/htnorm/)
[![PyPI - License][14]](https://github.com/zoj613/htnorm/blob/main/LICENSE)


### Dependencies
- NumPy >= 1.19.0

A high level python interface to the library is also provided. Linux and MacOS users can 
install it using wheels via pip (thus not needing to worry about availability of C libraries).
Windows OS is currently not supported.
```bash
pip install -U pyhtnorm
```
Wheels are not provided for MacOS. To install via pip, one can run the following commands:
```bash
pip install -U pyhtnorm
```
Alternatively, one can install it from source using the following shell commands:

```bash
$ git clone https://github.com/zoj613/htnorm.git
$ cd htnorm/
$ export PYHT_LIBS_DIR=<some directory with blas and lapack shared library files> # this is optional
$ pip install .
```

Below is an example of how to use htnorm in python to sample from a multivariate
gaussian truncated on the hyperplane ![sumzero](https://latex.codecogs.com/svg.latex?%5Cmathbf%7B1%7D%5ET%5Cmathbf%7Bx%7D%20%3D%200) (i.e. making sure the sampled values sum to zero). The python
interface is such that the code can be easily integrated into other existing libraries.
Since `v1.0.0`, it supports passing a `numpy.random.Generator` instance as a parameter to aid reproducibility.

```python
from pyhtnorm import hyperplane_truncated_mvnorm, structured_precision_mvnorm
import numpy as np

rng = np.random.default_rng()

# generate example input
k1, k2 = 1000, 1
temp = rng.random((k1, k1))
cov = temp @ temp.T
G = np.ones((k2, k1))
r = np.zeros(k2)
mean = rng.random(k1)

# passing `random_state` is optional. If the argument is not used, a fresh
# random generator state is instantiated internally using system entropy.
o = hyperplane_truncated_mvnorm(mean, cov, G, r, random_state=rng)
print(o.sum())  # verify if sampled values sum to zero
# alternatively one can pass an array to store the results in
hyperplane_truncated_mvnorm(mean, cov, G, r, out=o)
```

For more information about the function's arguments, refer to its docstring.

A pure numpy implementation is demonstrated in this [example script][9].


## R Interface

One can also use the package in R. To install, use one the following commands:
```R
devtools::install_github("zoj613/htnorm")
pak::pkg_install("zoj613/htnorm")
```

Below is an R translation of the above python example:

```R
library(htnorm)

# make dummy data
mean <- rnorm(1000)
cov <- matrix(rnorm(1000 * 1000), ncol=1000)
cov <- cov %*% t(cov)
G <- matrix(rep(1, 1000), ncol=1000)
r <- c(0)

# initialize the Generator instance
rng <- HTNGenerator(seed=12345, gen="pcg64")

samples <- rng$hyperplane_truncated_mvnorm(mean, cov, G, r)
#verify if sampled values sum to zero
sum(samples)

# optionally pass a vector to store the results in
out <- rep(0, 1000)
rng$hyperplane_truncated_mvnorm(mean, cov, G, r, out = out)
sum(out)  #verify

out <- rep(0, 1000)
eig <- eigen(cov)
phi <- eig$vectors
omega <- diag(eig$values)
a <- diag(runif(length(mean)))
rng$structured_precision_mvnorm(mean, a, phi, omega, a_type = "diagonal", out = out)
```

## Licensing

`htnorm` is free software made available under the BSD-3 License. For details
see the [LICENSE][6] file.


## References
- Cong, Yulai; Chen, Bo; Zhou, Mingyuan. Fast Simulation of Hyperplane-Truncated 
   Multivariate Normal Distributions. Bayesian Anal. 12 (2017), no. 4, 1017--1037. 
   doi:10.1214/17-BA1052.
- Bhattacharya, A., Chakraborty, A., and Mallick, B. K. (2016). 
  “Fast sampling with Gaussian scale mixture priors in high-dimensional regression.” 
  Biometrika, 103(4):985. 


[1]: https://projecteuclid.org/euclid.ba/1488337478
[2]: https://www.pcg-random.org/
[3]: https://en.wikipedia.org/wiki/Xoroshiro128%2B
[4]: ./include/htnorm.h 
[5]: ./include/htnorm_rng.h
[6]: ./LICENSE
[7]: https://python-poetry.org/docs/pyproject/
[8]: https://www.sciencedirect.com/science/article/abs/pii/S2211675317301574 
[9]: ./examples/numpy_implementation.py
[10]: https://img.shields.io/pypi/wheel/pyhtnorm?style=flat-square
[11]: https://img.shields.io/pypi/v/pyhtnorm?style=flat-square
[12]: https://img.shields.io/github/workflow/status/zoj613/htnorm/CI/main?style=flat-square
[13]: https://img.shields.io/codecov/c/github/zoj613/htnorm?style=flat-square
[14]: https://img.shields.io/pypi/l/pyhtnorm?style=flat-square

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "pyhtnorm",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "statistical sampling,multivariate gaussian distribution,hyperplane truncated multivariate normal,structured precision multivariate normal,sampling distribution,posterior sampling",
    "author": "",
    "author_email": "Zolisa Bleki <zolisa.bleki@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/d5/e0/16e3cc7b20399c75c79a64bc60b0be45f8426c33cf2c8754a8622e4a1183/pyhtnorm-2.0.1.tar.gz",
    "platform": null,
    "description": "# htnorm\n\nThis repo provides a C implementation of a fast and exact sampling algorithm for a \nmultivariate normal distribution (MVN) truncated on a hyperplane as described [here][1]\n\nThis repo implements the following from the paper:\n\n- Efficient sampling from a MVN truncated on a hyperplane: \n\n    ![hptrunc](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D_%7B%5Cmathcal%7BS%7D%7D%28%5Cmathbf%7B%5Cmu%7D%2C%20%5Cmathbf%7B%5CSigma%7D%29%3B%20%5Chspace%7B2mm%7D%20%5Cmathcal%7BS%7D%20%3D%20%5C%7B%5Cmathbf%7Bx%7D%20%3A%20%5Cmathbf%7BG%7D%5Cmathbf%7Bx%7D%20%3D%20%5Cmathbf%7Br%7D%5C%7D%2C%20%5Cmathbf%7BG%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bk_2%20%5Ctimes%20k%7D%2C%20rank%28%5Cmathbf%7BG%7D%29%20%3D%20k_2%20%3C%20k)\n\n- Efficient sampling from a MVN with a stuctured precision matrix that is a sum of an invertible matrix and a low rank matrix: \n\n    ![struc](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D%5C%5B%5Cmathbf%7B%5Cmu%7D%2C%20%28%5Cmathbf%7BA%7D%20&plus;%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5C%5D%3B%20%5Chspace%7B2mm%7D%20%5Cmathbf%7B%5CPhi%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20p%7D%2C%20%5Cmathbf%7B%5COmega%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20n%7D%2C%20%5Cmathbf%7BA%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bp%20%5Ctimes%20p%7D)\n\n- Efficient sampling from a MVN with a structured precision and mean:\n\n    ![strucmean](https://latex.codecogs.com/svg.latex?%5Cmathbf%7Bx%7D%20%5Csim%20%5Cmathcal%7BN%7D%5CBig%5C%5B%28%5Cmathbf%7BA%7D%20&plus;%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7Bt%7D%2C%20%28%5Cmathbf%7BA%7D%20&plus;%20%5Cmathbf%7B%5CPhi%7D%5ET%5Cmathbf%7B%5COmega%7D%5Cmathbf%7B%5CPhi%7D%29%5E%7B-1%7D%5CBig%5C%5D%3B%20%5Chspace%7B2mm%7D%20%5Cmathbf%7B%5COmega%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bn%20%5Ctimes%20n%7D%2C%20%5Cmathbf%7BA%7D%20%5Cin%20%5Cmathcal%7BR%7D%5E%7Bp%20%5Ctimes%20p%7D)\n\nThe algorithms implemented have the following practical applications:\n- Topic models when unknown parameters can be interpreted as fractions.\n- Admixture models\n- discrete graphical models\n- Sampling from the posterior distribution of an Intrinsic Conditional Autoregressive prior [icar][8]\n- Sampling from the posterior conditional distributions of various bayesian regression problems.\n\n\n## Dependencies\n\n- A C compiler that implements the C99 standard or later\n- An installation of `LAPACK`.\n\n## Usage\n\nBuilding a shared library of `htnorm` can be done with the following:\n```bash\n# optionally set path to LAPACK shared library\n$ export LIBS_DIR=\"some/path/to/lib/\"\n$ make lib\n```\nAfterwards the shared library will be found in a `lib/` directory of the project root,\nand the library can be linked dynamically via `-lhtnorm`.\n\nThe puplic interface exposes the samplers through the function declarations\n```C\n int htn_hyperplane_truncated_mvn(rng_t* rng, const ht_config_t* conf, double* out);\n int htn_structured_precision_mvn(rng_t* rng, const sp_config_t* conf, double* out);\n```\n\nThe details of the parameters are documented in ther header files [\"htnorm.h\"][4].\n\nRandom number generation is done using [PCG64][2] or [Xoroshiro128plus][3] bitgenerators. \nThe interface allows using a custom bitgenerator, and the details are documented in the header file \n[\"rng.h\"][5].\n\n## Example\n```C\n#include \"htnorm.h\"\n\nint main (void)\n{\n    ...\n    // instantiate a random number generator\n    rng_t* rng = rng_new_pcg64_seeded(12345);\n    ht_config_t config;\n    init_ht_config(&config, ...);\n    double* out = ...; // array to store the samples\n    int res = htn_hyperplane_truncated_mvn(rng, &config, out);\n    // res contains a number that indicates whether sampling failed or not.\n    ...\n    // finally free the RNG pointer at some point\n    rng_free(rng);\n    ...\n    return 0;\n}\n```\n\n## Python Interface\n[![PyPI - Wheel][10]](https://pypi.org/project/pyhtnorm/#files)\n[![PyPI][11]](https://pypi.org/project/pyhtnorm/)\n[![CI][12]](https://github.com/zoj613/htnorm/actions/workflows/build-and-test.yml)\n[![Codecov][13]](https://codecov.io/gh/zoj613/htnorm/)\n[![PyPI - License][14]](https://github.com/zoj613/htnorm/blob/main/LICENSE)\n\n\n### Dependencies\n- NumPy >= 1.19.0\n\nA high level python interface to the library is also provided. Linux and MacOS users can \ninstall it using wheels via pip (thus not needing to worry about availability of C libraries).\nWindows OS is currently not supported.\n```bash\npip install -U pyhtnorm\n```\nWheels are not provided for MacOS. To install via pip, one can run the following commands:\n```bash\npip install -U pyhtnorm\n```\nAlternatively, one can install it from source using the following shell commands:\n\n```bash\n$ git clone https://github.com/zoj613/htnorm.git\n$ cd htnorm/\n$ export PYHT_LIBS_DIR=<some directory with blas and lapack shared library files> # this is optional\n$ pip install .\n```\n\nBelow is an example of how to use htnorm in python to sample from a multivariate\ngaussian truncated on the hyperplane ![sumzero](https://latex.codecogs.com/svg.latex?%5Cmathbf%7B1%7D%5ET%5Cmathbf%7Bx%7D%20%3D%200) (i.e. making sure the sampled values sum to zero). The python\ninterface is such that the code can be easily integrated into other existing libraries.\nSince `v1.0.0`, it supports passing a `numpy.random.Generator` instance as a parameter to aid reproducibility.\n\n```python\nfrom pyhtnorm import hyperplane_truncated_mvnorm, structured_precision_mvnorm\nimport numpy as np\n\nrng = np.random.default_rng()\n\n# generate example input\nk1, k2 = 1000, 1\ntemp = rng.random((k1, k1))\ncov = temp @ temp.T\nG = np.ones((k2, k1))\nr = np.zeros(k2)\nmean = rng.random(k1)\n\n# passing `random_state` is optional. If the argument is not used, a fresh\n# random generator state is instantiated internally using system entropy.\no = hyperplane_truncated_mvnorm(mean, cov, G, r, random_state=rng)\nprint(o.sum())  # verify if sampled values sum to zero\n# alternatively one can pass an array to store the results in\nhyperplane_truncated_mvnorm(mean, cov, G, r, out=o)\n```\n\nFor more information about the function's arguments, refer to its docstring.\n\nA pure numpy implementation is demonstrated in this [example script][9].\n\n\n## R Interface\n\nOne can also use the package in R. To install, use one the following commands:\n```R\ndevtools::install_github(\"zoj613/htnorm\")\npak::pkg_install(\"zoj613/htnorm\")\n```\n\nBelow is an R translation of the above python example:\n\n```R\nlibrary(htnorm)\n\n# make dummy data\nmean <- rnorm(1000)\ncov <- matrix(rnorm(1000 * 1000), ncol=1000)\ncov <- cov %*% t(cov)\nG <- matrix(rep(1, 1000), ncol=1000)\nr <- c(0)\n\n# initialize the Generator instance\nrng <- HTNGenerator(seed=12345, gen=\"pcg64\")\n\nsamples <- rng$hyperplane_truncated_mvnorm(mean, cov, G, r)\n#verify if sampled values sum to zero\nsum(samples)\n\n# optionally pass a vector to store the results in\nout <- rep(0, 1000)\nrng$hyperplane_truncated_mvnorm(mean, cov, G, r, out = out)\nsum(out)  #verify\n\nout <- rep(0, 1000)\neig <- eigen(cov)\nphi <- eig$vectors\nomega <- diag(eig$values)\na <- diag(runif(length(mean)))\nrng$structured_precision_mvnorm(mean, a, phi, omega, a_type = \"diagonal\", out = out)\n```\n\n## Licensing\n\n`htnorm` is free software made available under the BSD-3 License. For details\nsee the [LICENSE][6] file.\n\n\n## References\n- Cong, Yulai; Chen, Bo; Zhou, Mingyuan. Fast Simulation of Hyperplane-Truncated \n   Multivariate Normal Distributions. Bayesian Anal. 12 (2017), no. 4, 1017--1037. \n   doi:10.1214/17-BA1052.\n- Bhattacharya, A., Chakraborty, A., and Mallick, B. K. (2016). \n  \u201cFast sampling with Gaussian scale mixture priors in high-dimensional regression.\u201d \n  Biometrika, 103(4):985. \n\n\n[1]: https://projecteuclid.org/euclid.ba/1488337478\n[2]: https://www.pcg-random.org/\n[3]: https://en.wikipedia.org/wiki/Xoroshiro128%2B\n[4]: ./include/htnorm.h \n[5]: ./include/htnorm_rng.h\n[6]: ./LICENSE\n[7]: https://python-poetry.org/docs/pyproject/\n[8]: https://www.sciencedirect.com/science/article/abs/pii/S2211675317301574 \n[9]: ./examples/numpy_implementation.py\n[10]: https://img.shields.io/pypi/wheel/pyhtnorm?style=flat-square\n[11]: https://img.shields.io/pypi/v/pyhtnorm?style=flat-square\n[12]: https://img.shields.io/github/workflow/status/zoj613/htnorm/CI/main?style=flat-square\n[13]: https://img.shields.io/codecov/c/github/zoj613/htnorm?style=flat-square\n[14]: https://img.shields.io/pypi/l/pyhtnorm?style=flat-square\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License",
    "summary": "Fast Simulation of Hyperplane-Truncated Multivatiate Normal Distributions",
    "version": "2.0.1",
    "project_urls": {
        "source": "https://github.com/zoj613/htnorm",
        "tracker": "https://github.com/zoj613/htnorm/issues"
    },
    "split_keywords": [
        "statistical sampling",
        "multivariate gaussian distribution",
        "hyperplane truncated multivariate normal",
        "structured precision multivariate normal",
        "sampling distribution",
        "posterior sampling"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "db5013f5bdd0238398c145a09d8aa41d6650957b19c40def1e0d4a571057344f",
                "md5": "1d06417283bb6d88c4d2df977fd64f2e",
                "sha256": "f589a4aeae468eb17a5793b1b9fc6cd118b688cd8bc5af44cdc211a8d86830ff"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1d06417283bb6d88c4d2df977fd64f2e",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 15250741,
            "upload_time": "2023-05-23T23:43:45",
            "upload_time_iso_8601": "2023-05-23T23:43:45.898537Z",
            "url": "https://files.pythonhosted.org/packages/db/50/13f5bdd0238398c145a09d8aa41d6650957b19c40def1e0d4a571057344f/pyhtnorm-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f393043d97b4815d47848b7fdce47889f69185065997e502dd0e7e3a1ccbf4fe",
                "md5": "238ad1422f535e9d2fa679b9ee656d5a",
                "sha256": "e7047acc40d85d68009260c9e3cf860973d2e13af4e45d5116eff54f4abf7793"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "238ad1422f535e9d2fa679b9ee656d5a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 13487514,
            "upload_time": "2023-05-23T23:43:57",
            "upload_time_iso_8601": "2023-05-23T23:43:57.069714Z",
            "url": "https://files.pythonhosted.org/packages/f3/93/043d97b4815d47848b7fdce47889f69185065997e502dd0e7e3a1ccbf4fe/pyhtnorm-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "70bd45ff993aae27f2278f89b6777db4dde6ec97dfa12364ca9ff744caca2dd6",
                "md5": "51c2b224ffc8cdea1b3b5885f19ad1db",
                "sha256": "21e5db826231b8d8c378d58618513729b1fd514d4fdab504fdf4ff0e07a32b5a"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "51c2b224ffc8cdea1b3b5885f19ad1db",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 15249189,
            "upload_time": "2023-05-23T23:44:01",
            "upload_time_iso_8601": "2023-05-23T23:44:01.084218Z",
            "url": "https://files.pythonhosted.org/packages/70/bd/45ff993aae27f2278f89b6777db4dde6ec97dfa12364ca9ff744caca2dd6/pyhtnorm-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3a30c8604109e155287fee015a1495595344127c1841458d0a4ae71855ecec14",
                "md5": "ec13247c6cf0b10d1dc2c9ecc5117eb5",
                "sha256": "a384c615d09ae0e733757cffba09d2a3972ce5afdf30891ff4f1a52bef81a73b"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ec13247c6cf0b10d1dc2c9ecc5117eb5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 13504521,
            "upload_time": "2023-05-23T23:44:05",
            "upload_time_iso_8601": "2023-05-23T23:44:05.356527Z",
            "url": "https://files.pythonhosted.org/packages/3a/30/c8604109e155287fee015a1495595344127c1841458d0a4ae71855ecec14/pyhtnorm-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0636dbe4c61584053f912a36808b52088ec5a44855f18c5f795d5262f830fd68",
                "md5": "3f912a3f92f83f6f30ebcf01ba1ca3f0",
                "sha256": "0eed634d5aefd5296305de0160702c51c2c1c84bd3ed36b40d0f5b8c13bed76f"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3f912a3f92f83f6f30ebcf01ba1ca3f0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 15248359,
            "upload_time": "2023-05-23T23:44:09",
            "upload_time_iso_8601": "2023-05-23T23:44:09.782196Z",
            "url": "https://files.pythonhosted.org/packages/06/36/dbe4c61584053f912a36808b52088ec5a44855f18c5f795d5262f830fd68/pyhtnorm-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a060086bd7d03137e0904922c9ee9516161a59358987d54d62593c4997e83ca6",
                "md5": "124211c4bae400b47564d2e29c1cbbcc",
                "sha256": "9b24a6569ab2e25ddbe8cd651fd8e7b1f986855934c9660e7417a84ce58ae0c0"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "124211c4bae400b47564d2e29c1cbbcc",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 13507331,
            "upload_time": "2023-05-23T23:44:14",
            "upload_time_iso_8601": "2023-05-23T23:44:14.242112Z",
            "url": "https://files.pythonhosted.org/packages/a0/60/086bd7d03137e0904922c9ee9516161a59358987d54d62593c4997e83ca6/pyhtnorm-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b7219eeb11e4b4e1b46882284253deb61cd17df28609af2b6abf76dd86b7846a",
                "md5": "670811d1132e53704650336c16c235b9",
                "sha256": "c2562ea8114cf5bd81c8f50f010f1d4f1298def05b6efd65803bdd6e6c4c5aa0"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "670811d1132e53704650336c16c235b9",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 15251115,
            "upload_time": "2023-05-23T23:44:21",
            "upload_time_iso_8601": "2023-05-23T23:44:21.217946Z",
            "url": "https://files.pythonhosted.org/packages/b7/21/9eeb11e4b4e1b46882284253deb61cd17df28609af2b6abf76dd86b7846a/pyhtnorm-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "78488e84f98beb9edefe017d2e71294126b5855d491882c584e5504f337286b4",
                "md5": "d4983ac0fe5af28ae26f223e14de25f1",
                "sha256": "e96846678eec54f2de46740439fe33687058e67de5e9c260ad1f9349738a7c67"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d4983ac0fe5af28ae26f223e14de25f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 13494205,
            "upload_time": "2023-05-23T23:44:25",
            "upload_time_iso_8601": "2023-05-23T23:44:25.403380Z",
            "url": "https://files.pythonhosted.org/packages/78/48/8e84f98beb9edefe017d2e71294126b5855d491882c584e5504f337286b4/pyhtnorm-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d5e016e3cc7b20399c75c79a64bc60b0be45f8426c33cf2c8754a8622e4a1183",
                "md5": "94a9641674659ff99e591167fd91fedf",
                "sha256": "c1353b3fb0acbf2df4d188ce041b43a75db3c45eccb25e79e33d9a94679d2608"
            },
            "downloads": -1,
            "filename": "pyhtnorm-2.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "94a9641674659ff99e591167fd91fedf",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 38642,
            "upload_time": "2023-05-23T23:44:28",
            "upload_time_iso_8601": "2023-05-23T23:44:28.656439Z",
            "url": "https://files.pythonhosted.org/packages/d5/e0/16e3cc7b20399c75c79a64bc60b0be45f8426c33cf2c8754a8622e4a1183/pyhtnorm-2.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-05-23 23:44:28",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "zoj613",
    "github_project": "htnorm",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pyhtnorm"
}
        
Elapsed time: 0.18424s