Metadata-Version: 2.1
Name: pyhf
Version: 0.4.0
Summary: (partial) pure python histfactory implementation
Home-page: https://github.com/scikit-hep/pyhf
Author: Lukas Heinrich, Matthew Feickert, Giordon Stark
Author-email: lukas.heinrich@cern.ch, matthew.feickert@cern.ch, gstark@cern.ch
License: Apache
Keywords: physics fitting numpy scipy tensorflow pytorch
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: scipy
Requires-Dist: click (>=6.0)
Requires-Dist: tqdm
Requires-Dist: six
Requires-Dist: jsonschema (>=v3.0.0a2)
Requires-Dist: jsonpatch
Requires-Dist: pyyaml
Provides-Extra: backends
Requires-Dist: iminuit ; extra == 'backends'
Requires-Dist: jaxlib (>0.1.33,~=0.1) ; extra == 'backends'
Requires-Dist: jax (>0.1.51,~=0.1) ; extra == 'backends'
Requires-Dist: tensorflow-probability (~=0.8) ; extra == 'backends'
Requires-Dist: tensorflow (~=2.0) ; extra == 'backends'
Requires-Dist: torch (~=1.2) ; extra == 'backends'
Provides-Extra: complete
Requires-Dist: bumpversion ; extra == 'complete'
Requires-Dist: check-manifest ; extra == 'complete'
Requires-Dist: coverage (>=4.0) ; extra == 'complete'
Requires-Dist: graphviz ; extra == 'complete'
Requires-Dist: iminuit ; extra == 'complete'
Requires-Dist: ipython ; extra == 'complete'
Requires-Dist: ipywidgets ; extra == 'complete'
Requires-Dist: jaxlib (>0.1.33,~=0.1) ; extra == 'complete'
Requires-Dist: jax (>0.1.51,~=0.1) ; extra == 'complete'
Requires-Dist: jsonpatch ; extra == 'complete'
Requires-Dist: jupyter ; extra == 'complete'
Requires-Dist: m2r ; extra == 'complete'
Requires-Dist: matplotlib ; extra == 'complete'
Requires-Dist: nbdime ; extra == 'complete'
Requires-Dist: nbsphinx ; extra == 'complete'
Requires-Dist: nteract-scrapbook (~=0.2) ; extra == 'complete'
Requires-Dist: papermill (~=1.0) ; extra == 'complete'
Requires-Dist: pre-commit ; extra == 'complete'
Requires-Dist: pydocstyle ; extra == 'complete'
Requires-Dist: pyflakes ; extra == 'complete'
Requires-Dist: pytest-benchmark[histogram] ; extra == 'complete'
Requires-Dist: pytest-console-scripts ; extra == 'complete'
Requires-Dist: pytest-cov (>=2.5.1) ; extra == 'complete'
Requires-Dist: pytest-mock ; extra == 'complete'
Requires-Dist: pytest-mpl ; extra == 'complete'
Requires-Dist: pytest (~=3.5) ; extra == 'complete'
Requires-Dist: sphinx ; extra == 'complete'
Requires-Dist: sphinx-click ; extra == 'complete'
Requires-Dist: sphinx-issues ; extra == 'complete'
Requires-Dist: sphinx-rtd-theme ; extra == 'complete'
Requires-Dist: sphinxcontrib-bibtex ; extra == 'complete'
Requires-Dist: tensorflow-probability (~=0.8) ; extra == 'complete'
Requires-Dist: tensorflow (~=2.0) ; extra == 'complete'
Requires-Dist: torch (~=1.2) ; extra == 'complete'
Requires-Dist: twine ; extra == 'complete'
Requires-Dist: uproot ; extra == 'complete'
Requires-Dist: uproot (~=3.3) ; extra == 'complete'
Requires-Dist: black ; (python_version >= "3.6") and extra == 'complete'
Provides-Extra: contrib
Requires-Dist: matplotlib ; extra == 'contrib'
Provides-Extra: develop
Requires-Dist: bumpversion ; extra == 'develop'
Requires-Dist: check-manifest ; extra == 'develop'
Requires-Dist: coverage (>=4.0) ; extra == 'develop'
Requires-Dist: graphviz ; extra == 'develop'
Requires-Dist: iminuit ; extra == 'develop'
Requires-Dist: ipython ; extra == 'develop'
Requires-Dist: ipywidgets ; extra == 'develop'
Requires-Dist: jaxlib (>0.1.33,~=0.1) ; extra == 'develop'
Requires-Dist: jax (>0.1.51,~=0.1) ; extra == 'develop'
Requires-Dist: jsonpatch ; extra == 'develop'
Requires-Dist: jupyter ; extra == 'develop'
Requires-Dist: m2r ; extra == 'develop'
Requires-Dist: matplotlib ; extra == 'develop'
Requires-Dist: nbdime ; extra == 'develop'
Requires-Dist: nbsphinx ; extra == 'develop'
Requires-Dist: nteract-scrapbook (~=0.2) ; extra == 'develop'
Requires-Dist: papermill (~=1.0) ; extra == 'develop'
Requires-Dist: pre-commit ; extra == 'develop'
Requires-Dist: pydocstyle ; extra == 'develop'
Requires-Dist: pyflakes ; extra == 'develop'
Requires-Dist: pytest-benchmark[histogram] ; extra == 'develop'
Requires-Dist: pytest-console-scripts ; extra == 'develop'
Requires-Dist: pytest-cov (>=2.5.1) ; extra == 'develop'
Requires-Dist: pytest-mock ; extra == 'develop'
Requires-Dist: pytest-mpl ; extra == 'develop'
Requires-Dist: pytest (~=3.5) ; extra == 'develop'
Requires-Dist: sphinx ; extra == 'develop'
Requires-Dist: sphinx-click ; extra == 'develop'
Requires-Dist: sphinx-issues ; extra == 'develop'
Requires-Dist: sphinx-rtd-theme ; extra == 'develop'
Requires-Dist: sphinxcontrib-bibtex ; extra == 'develop'
Requires-Dist: tensorflow-probability (~=0.8) ; extra == 'develop'
Requires-Dist: tensorflow (~=2.0) ; extra == 'develop'
Requires-Dist: torch (~=1.2) ; extra == 'develop'
Requires-Dist: twine ; extra == 'develop'
Requires-Dist: uproot ; extra == 'develop'
Requires-Dist: uproot (~=3.3) ; extra == 'develop'
Requires-Dist: black ; (python_version >= "3.6") and extra == 'develop'
Provides-Extra: docs
Requires-Dist: ipywidgets ; extra == 'docs'
Requires-Dist: m2r ; extra == 'docs'
Requires-Dist: nbsphinx ; extra == 'docs'
Requires-Dist: sphinx ; extra == 'docs'
Requires-Dist: sphinx-click ; extra == 'docs'
Requires-Dist: sphinx-issues ; extra == 'docs'
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
Requires-Dist: sphinxcontrib-bibtex ; extra == 'docs'
Provides-Extra: jax
Requires-Dist: jax (>0.1.51,~=0.1) ; extra == 'jax'
Requires-Dist: jaxlib (>0.1.33,~=0.1) ; extra == 'jax'
Provides-Extra: minuit
Requires-Dist: iminuit ; extra == 'minuit'
Provides-Extra: tensorflow
Requires-Dist: tensorflow (~=2.0) ; extra == 'tensorflow'
Requires-Dist: tensorflow-probability (~=0.8) ; extra == 'tensorflow'
Provides-Extra: test
Requires-Dist: check-manifest ; extra == 'test'
Requires-Dist: coverage (>=4.0) ; extra == 'test'
Requires-Dist: graphviz ; extra == 'test'
Requires-Dist: iminuit ; extra == 'test'
Requires-Dist: jaxlib (>0.1.33,~=0.1) ; extra == 'test'
Requires-Dist: jax (>0.1.51,~=0.1) ; extra == 'test'
Requires-Dist: jsonpatch ; extra == 'test'
Requires-Dist: jupyter ; extra == 'test'
Requires-Dist: matplotlib ; extra == 'test'
Requires-Dist: nteract-scrapbook (~=0.2) ; extra == 'test'
Requires-Dist: papermill (~=1.0) ; extra == 'test'
Requires-Dist: pydocstyle ; extra == 'test'
Requires-Dist: pyflakes ; extra == 'test'
Requires-Dist: pytest-benchmark[histogram] ; extra == 'test'
Requires-Dist: pytest-console-scripts ; extra == 'test'
Requires-Dist: pytest-cov (>=2.5.1) ; extra == 'test'
Requires-Dist: pytest-mock ; extra == 'test'
Requires-Dist: pytest-mpl ; extra == 'test'
Requires-Dist: pytest (~=3.5) ; extra == 'test'
Requires-Dist: tensorflow-probability (~=0.8) ; extra == 'test'
Requires-Dist: tensorflow (~=2.0) ; extra == 'test'
Requires-Dist: torch (~=1.2) ; extra == 'test'
Requires-Dist: uproot ; extra == 'test'
Requires-Dist: uproot (~=3.3) ; extra == 'test'
Requires-Dist: black ; (python_version >= "3.6") and extra == 'test'
Provides-Extra: torch
Requires-Dist: torch (~=1.2) ; extra == 'torch'
Provides-Extra: xmlio
Requires-Dist: uproot ; extra == 'xmlio'

<p align="center">
<img src="https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/_static/img/pyhf-logo.png" alt="pyhf logo" width="320"/>
</p>

# pure-python fitting/limit-setting/interval estimation HistFactory-style

[![GitHub Project](https://img.shields.io/badge/GitHub--blue?style=social&logo=GitHub)](https://github.com/scikit-hep/pyhf)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1169739.svg)](https://doi.org/10.5281/zenodo.1169739)

[![GitHub Actions Status: CI](https://github.com/scikit-hep/pyhf/workflows/CI/CD/badge.svg)](https://github.com/scikit-hep/pyhf/actions?query=workflow%3ACI%2FCD+branch%3Amaster)
[![GitHub Actions Status: Publish](https://github.com/scikit-hep/pyhf/workflows/publish%20distributions/badge.svg)](https://github.com/scikit-hep/pyhf/actions?query=workflow%3A%22publish+distributions%22+branch%3Amaster)
[![Docker Automated](https://img.shields.io/docker/automated/pyhf/pyhf.svg)](https://hub.docker.com/r/pyhf/pyhf/)
[![Code Coverage](https://codecov.io/gh/scikit-hep/pyhf/graph/badge.svg?branch=master)](https://codecov.io/gh/scikit-hep/pyhf?branch=master)
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/scikit-hep/pyhf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/scikit-hep/pyhf/latest/files/)
[![CodeFactor](https://www.codefactor.io/repository/github/scikit-hep/pyhf/badge)](https://www.codefactor.io/repository/github/scikit-hep/pyhf)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)

[![Docs](https://img.shields.io/badge/docs-master-blue.svg)](https://scikit-hep.github.io/pyhf)
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/scikit-hep/pyhf/master?filepath=docs%2Fexamples%2Fnotebooks%2Fbinderexample%2FStatisticalAnalysis.ipynb)

[![PyPI version](https://badge.fury.io/py/pyhf.svg)](https://badge.fury.io/py/pyhf)
[![Supported Python versionss](https://img.shields.io/pypi/pyversions/pyhf.svg)](https://pypi.org/project/pyhf/)
[![Docker Stars](https://img.shields.io/docker/stars/pyhf/pyhf.svg)](https://hub.docker.com/r/pyhf/pyhf/)
[![Docker Pulls](https://img.shields.io/docker/pulls/pyhf/pyhf.svg)](https://hub.docker.com/r/pyhf/pyhf/)

The HistFactory p.d.f. template [[CERN-OPEN-2012-016](https://cds.cern.ch/record/1456844)] is per-se independent of its implementation in ROOT and sometimes, it's useful to be able to run statistical analysis outside
of ROOT, RooFit, RooStats framework.

This repo is a pure-python implementation of that statistical model for multi-bin histogram-based analysis and its interval estimation is based on the asymptotic formulas of "Asymptotic formulae for likelihood-based tests of new physics" [[arXiv:1007.1727](https://arxiv.org/abs/1007.1727)]. The aim is also to support modern computational graph libraries such as PyTorch and TensorFlow in order to make use of features such as autodifferentiation and GPU acceleration.

## Hello World

```python
>>> import pyhf
>>> pdf = pyhf.simplemodels.hepdata_like(signal_data=[12.0, 11.0], bkg_data=[50.0, 52.0], bkg_uncerts=[3.0, 7.0])
>>> CLs_obs, CLs_exp = pyhf.infer.hypotest(1.0, [51, 48] + pdf.config.auxdata, pdf, return_expected=True)
>>> print('Observed: {}, Expected: {}'.format(CLs_obs, CLs_exp))
Observed: [0.05290116], Expected: [0.06445521]

```

## What does it support

Implemented variations:
- [x] HistoSys
- [x] OverallSys
- [x] ShapeSys
- [x] NormFactor
- [x] Multiple Channels
- [x] Import from XML + ROOT via [uproot](https://github.com/scikit-hep/uproot)
- [x] ShapeFactor
- [x] StatError
- [x] Lumi Uncertainty

Computational Backends:
- [x] NumPy
- [x] PyTorch
- [x] TensorFlow
- [x] JAX

Available Optimizers

| NumPy                    | Tensorflow                 | PyTorch                    |
| :----------------------- | :------------------------- | :------------------------- |
| SLSQP (`scipy.optimize`) | Newton's Method (autodiff) | Newton's Method (autodiff) |
| MINUIT (`iminuit`)       | .                          | .                          |


## Todo
- [ ] StatConfig
- [ ] Non-asymptotic calculators

results obtained from this package are validated against output computed from HistFactory workspaces

## A one bin example

```python
nobs = 55, b = 50, db = 7, nom_sig = 10.
```

<img src="https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/_static/img/manual_1bin_55_50_7.png" alt="manual" width="500"/>
<img src="https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/_static/img/hfh_1bin_55_50_7.png" alt="manual" width="500"/>


## A two bin example

```python
bin 1: nobs = 100, b = 100, db = 15., nom_sig = 30.
bin 2: nobs = 145, b = 150, db = 20., nom_sig = 45.
```

<img src="https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/_static/img/manual_2_bin_100.0_145.0_100.0_150.0_15.0_20.0_30.0_45.0.png" alt="manual" width="500"/>
<img src="https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/_static/img/hfh_2_bin_100.0_145.0_100.0_150.0_15.0_20.0_30.0_45.0.png" alt="manual" width="500"/>

## Installation

To install `pyhf` from PyPI with the NumPy backend run
```bash
python -m pip install pyhf
```

and to install `pyhf` with all additional backends run
```bash
python -m pip install pyhf[backends]
```
or a subset of the options.

To uninstall run
```bash
python -m pip uninstall pyhf
```

## Authors

Please check the [contribution statistics for a list of contributors](https://github.com/scikit-hep/pyhf/graphs/contributors)


