From 83f5a18c57097cc1ac625e55c548932529f63466 Mon Sep 17 00:00:00 2001 From: Matthew Feickert Date: Fri, 9 Sep 2022 18:09:24 +0200 Subject: [PATCH] formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use fstrings for rtol warning Use level arg over hardcoded 0.05 add in lru_cache import fix: Pin codemetapy to v0.3.5 for `--no-extras` functionality (#1995) * Pin codemetapy to v0.3.5 in the 'current release' test workflow to keep the `--no-extras` CLI API option. - c.f. https://github.com/proycon/codemetapy/issues/24 * Update lower bounds for scipy and click in codemeta.json and add lower bounds for importlib-resources and typing-extensions. Rename and add to public API Add in hypotest_kwargs Add FIXME notice for later. FIX BEFORE MERGE Update public API repr ci: Install release candidates for 'current release' test workflow (#1996) * Use release candidates that are on PyPI for verifiying that the public API passes tests. This verifies that the release candidates that users are being asked to test reflect the release API. * Use the latest version of pytest. refactor: Use urllib.parse.urlsplit over urlparse (#1997) * Use urllib.parse.urlsplit over urllib.parse.urlparse to avoid having to deal with urlparse's 'params' argument which incurs a performance cost. - c.f. https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlsplit - c.f. https://youtu.be/ABJvdsIANds Indent docstrings correctly Use uncorrelated_background API for docstring example Use rtol in docstring example to avoid warning drop lru_cache fix kwargs for autoscan Bump version: 0.7.0rc3 → 0.7.0rc4 docs: Add Binder Python runtime environment specification (#1998) * Add binder/runtime.txt to specify the version of Python that is used for the Binder environment. Use Python 3.10 as this is the latest version that all pyhf backends will work with. - c.f. https://mybinder.readthedocs.io/en/latest/howto/languages.html#python fix: Update codemeta lower bounds for jsonschema, importlib-resources (#2000) * Update jsonschema lower bound to v4.15.0 and importlib-resources lower bound to v1.4.0 to match their versions in setup.cfg. - Amends PR #1979 docs: Add milestone for 2000 project GitHub items (#2001) * Add milestone to README for 2000 project GitHub issues and pull requests. fix: Use codemetapy v2.2.2+ API (#2002) * Update codemetapy to v2.2.2+ in 'current release' workflow to have access to the `--no-extras` CLI API in v2.0+ and reproducible runs. - c.f. https://github.com/proycon/codemetapy/issues/24 - c.f. https://github.com/proycon/codemetapy/issues/26 - Amends PR #1995 * Use the codemetapy v2.0 API which requires `--inputtype python` to be added. * Update codemeta.json to follow codemetapy v2.0+ general spec. fix: Add filterwarnings ignore for protobuf DeprecationWarning (#2005) * Add a ignore to filterwarnings to avoid a protobuf DeprecationWarning > DeprecationWarning: Call to deprecated create function FileDescriptor(). > Note: Create unlinked descriptors is going to go away. Please use get/find > descriptors from generated code or query the descriptor_pool. from TensorFlow's use of protobuf. fix: Specify encoding as utf-8 to enforce PEP 597 (#2007) * Explicitly specify the encoding as utf-8 while opening a file to enforce PEP 597. This is future-proofing work to some degree as Python 3.15+ will make utf-8 the default. - c.f. https://peps.python.org/pep-0597/ * Add the flake8-encodings pre-commit hook to enforce PEP 597. docs: Add FAQ on reasons for need to downgrade dependencies (#1529) * Add FAQ explaining how reasons why users might have to manually downgrade dependencies. - c.f. PR #1979 for context docs: Seperate docstrings semantically Apply sourcery suggestion for simplification Rename to cached for clarity Add test for auto through upperlimit API Use None instead of auto to simplify API Avoid function level globals Use np.asarray to avoid copy Use lower and upper to match scipy terms Split warning for readability Add test for rtol warning Remove tmpdir fixture as not needed for these tests given no writing of output Add check for return_results More verbose fix: Correct concatenate lists instead of adding float to all list elements Test bounds expansion test: Update test_plot_results_no_axis baseline image (#2009) * matplotlib v3.6.0 results in a slightly different baseline image than matplotlib v3.5.x, so regenerate the baseline image using matplotlib v3.6.0 with `pytest --mpl-generate-path=tests/contrib/baseline tests/contrib/test_viz.py`. * Mark the test_plot_results_no_axis test as xfail for Python 3.7 as matplotlib v3.6.0 is Python 3.8+ and so the image is guaranteed to be different as Python 3.7 runtimes will install matplotlib v3.5.x. Add upperlimit_fixed_scan to API docs Add return_results test move to test_upperlimit_with_kwargs Move the pop out before evaluation to make everything very clean and clear Note what scan Rename to auto_scan docs: fix link Provide better coverage and use np.allclose docs: Add Beojan Stanislaus to contributor list change auto_scan to toms748_scan rename fixed_scan to linear_grid_scan Make intervals module and change API to upper_limit Rename to pyhf.infer.intervals.upper_limits get upper_limits.upper_limit working Also bring along old API limit to just upper_limit by default Rearrange feat: Add internal API to warn of deprecation and future removal * Add internal API pyhf.exceptions._deprecated_api_warning to alert users to API deprecation by raising a subclass of DeprecationWarning and future removal. * Add test for pyhf.exceptions._deprecated_api_warning to ensure it gets picked up as DeprecationWarning. Note deprecated API Seperate into condifence intervals section fix: Use function scope to avoid altering hypotest_args fixture Make test name explicit Use deprecated Sphinx note Add versionadded directives feat: Add internal API to warn of deprecation and future removal (#2012) * Add internal API pyhf.exceptions._deprecated_api_warning to alert users to API deprecation by raising a subclass of DeprecationWarning and future removal. * Add test for pyhf.exceptions._deprecated_api_warning to ensure it gets picked up as DeprecationWarning. Update lower bound on scipy as toms748 added in scipy v1.2.0 fixup from autoscan test changes --- .github/workflows/release_tests.yml | 11 +- .pre-commit-config.yaml | 1 + .zenodo.json | 6 +- CITATION.cff | 8 +- README.rst | 11 +- binder/runtime.txt | 1 + codemeta.json | 178 ++++++++-------- docs/api.rst | 13 +- docs/contributors.rst | 1 + docs/development.rst | 2 +- docs/examples/notebooks/ImpactPlot.ipynb | 8 +- docs/examples/notebooks/ShapeFactor.ipynb | 6 +- .../binderexample/StatisticalAnalysis.ipynb | 6 +- docs/examples/notebooks/multiBinPois.ipynb | 8 +- .../multichannel-coupled-histo.ipynb | 4 +- docs/examples/notebooks/pullplot.ipynb | 5 +- docs/faq.rst | 40 ++++ docs/generate_jupyterlite_iframe.py | 2 +- docs/jupyterlite.rst | 2 +- docs/likelihood.rst | 3 +- pyproject.toml | 1 + setup.cfg | 2 +- src/pyhf/cli/infer.py | 18 +- src/pyhf/cli/patchset.py | 16 +- src/pyhf/cli/rootio.py | 8 +- src/pyhf/cli/spec.py | 24 +-- src/pyhf/contrib/utils.py | 4 +- src/pyhf/data/citation.bib | 6 +- src/pyhf/exceptions/__init__.py | 13 ++ src/pyhf/infer/intervals/__init__.py | 30 +++ .../upper_limits.py} | 194 ++++++++++-------- src/pyhf/schema/loader.py | 2 +- src/pyhf/utils.py | 2 +- src/pyhf/writexml.py | 2 +- tbump.toml | 4 +- tests/conftest.py | 2 +- tests/constraints.txt | 2 +- .../baseline/test_plot_results_no_axis.png | Bin 55816 -> 55805 bytes tests/contrib/test_contrib_utils.py | 20 +- tests/contrib/test_viz.py | 33 ++- tests/test_export.py | 30 ++- tests/test_infer.py | 127 +++++++++--- tests/test_modifiers.py | 14 +- tests/test_patchset.py | 37 +++- tests/test_pdf.py | 25 ++- tests/test_public_api_repr.py | 10 +- tests/test_regression.py | 18 ++ tests/test_schema.py | 20 +- tests/test_scripts.py | 14 +- tests/test_validation.py | 28 ++- tests/test_workspace.py | 3 +- validation/makedata.py | 3 +- validation/manualonoff_roofit/onoff.py | 3 +- .../makedata.py | 3 +- .../makedata.py | 3 +- .../multichannel_histfactory/makedata.py | 3 +- validation/run_toys.py | 5 +- validation/standard_hypo_test_demo.py | 2 +- validation/xmlimport_input2/makedata.py | 3 +- 59 files changed, 708 insertions(+), 342 deletions(-) create mode 100644 binder/runtime.txt create mode 100644 src/pyhf/infer/intervals/__init__.py rename src/pyhf/infer/{intervals.py => intervals/upper_limits.py} (57%) diff --git a/.github/workflows/release_tests.yml b/.github/workflows/release_tests.yml index df1f6d66e7..c161badf75 100644 --- a/.github/workflows/release_tests.yml +++ b/.github/workflows/release_tests.yml @@ -34,16 +34,17 @@ jobs: - name: Install from PyPI run: | python -m pip install --upgrade pip setuptools wheel - python -m pip install pyhf[backends,xmlio] - python -m pip install 'pytest~=7.0' pytest-cov + python -m pip install --pre pyhf[backends,xmlio] + python -m pip install pytest pytest-cov python -m pip list - name: Canary test public API run: | pytest tests/test_public_api.py + # FIXME: c.f. https://github.com/proycon/codemetapy/issues/24 - name: Verify requirements in codemeta.json run: | - python -m pip install jq "codemetapy>=0.3.4" - codemetapy --no-extras pyhf > codemeta_generated.json - diff <(jq -S .softwareRequirements codemeta_generated.json) <(jq -S .softwareRequirements codemeta.json) + python -m pip install jq "codemetapy>=2.2.2" + codemetapy --inputtype python --no-extras pyhf > codemeta_generated.json + diff <(jq -S .softwareRequirements codemeta.json) <(jq -S .softwareRequirements codemeta_generated.json) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2d44a93509..e706b3c0c5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -58,6 +58,7 @@ repos: hooks: - id: flake8 args: ["--count", "--statistics"] + additional_dependencies: [flake8-encodings==0.5.0.post1] - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.971 diff --git a/.zenodo.json b/.zenodo.json index b8cb610161..958ae48464 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,8 +1,8 @@ { "description": "pure-Python HistFactory implementation with tensors and autodiff", "license": "Apache-2.0", - "title": "scikit-hep/pyhf: v0.7.0rc3", - "version": "v0.7.0rc3", + "title": "scikit-hep/pyhf: v0.7.0rc4", + "version": "v0.7.0rc4", "upload_type": "software", "creators": [ { @@ -36,7 +36,7 @@ "related_identifiers": [ { "scheme": "url", - "identifier": "https://github.com/scikit-hep/pyhf/tree/v0.7.0rc3", + "identifier": "https://github.com/scikit-hep/pyhf/tree/v0.7.0rc4", "relation": "isSupplementTo" } ] diff --git a/CITATION.cff b/CITATION.cff index c37eac3dab..bebde0a1be 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -14,11 +14,11 @@ authors: given-names: "Giordon" orcid: "https://orcid.org/0000-0001-6616-3433" affiliation: "SCIPP, University of California, Santa Cruz" -title: "pyhf: v0.7.0rc3" -version: 0.7.0rc3 +title: "pyhf: v0.7.0rc4" +version: 0.7.0rc4 doi: 10.5281/zenodo.1169739 -repository-code: "https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc3" -url: "https://pyhf.readthedocs.io/en/v0.7.0rc3/" +repository-code: "https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc4" +url: "https://pyhf.readthedocs.io/en/v0.7.0rc4/" keywords: - python - physics diff --git a/README.rst b/README.rst index bbddfa4192..e0a793aa5b 100644 --- a/README.rst +++ b/README.rst @@ -309,11 +309,11 @@ the preferred BibTeX entry for citation of ``pyhf`` includes both the @software{pyhf, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark}, - title = "{pyhf: v0.7.0rc3}", - version = {0.7.0rc3}, + title = "{pyhf: v0.7.0rc4}", + version = {0.7.0rc4}, doi = {10.5281/zenodo.1169739}, url = {https://doi.org/10.5281/zenodo.1169739}, - note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc3} + note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc4} } @article{pyhf_joss, @@ -340,6 +340,7 @@ contributors `__. Milestones ---------- +- 2022-09-12: 2000 GitHub issues and pull requests. (See PR `#2000 `__) - 2021-12-09: 1000 commits to the project. (See PR `#1710 `__) - 2020-07-28: 1000 GitHub issues and pull requests. (See PR `#1000 `__) @@ -360,7 +361,7 @@ and grant `OAC-1450377 Physics" + ], + "audience": { + "@id": "/audience/science-research", + "@type": "Audience", + "audienceType": "Science/Research" + }, "author": [ { - "@id": "https://orcid.org/0000-0002-4048-7584", + "@id": "/person/lukas-heinrich", "@type": "Person", - "givenName": "Lukas", + "email": "lukas.heinrich@cern.ch", "familyName": "Heinrich", - "email": "lukas.heinrich@cern.ch" + "givenName": "Lukas", + "identifier": "https://orcid.org/0000-0002-4048-7584", + "position": 1 }, { - "@id": "https://orcid.org/0000-0003-4124-7862", + "@id": "/person/matthew-feickert", "@type": "Person", - "givenName": "Matthew", + "email": "matthew.feickert@cern.ch", "familyName": "Feickert", - "email": "matthew.feickert@cern.ch" + "givenName": "Matthew", + "identifier": "https://orcid.org/0000-0003-4124-7862", + "position": 2 }, { - "@id": "https://orcid.org/0000-0001-6616-3433", + "@id": "/person/giordon-stark", "@type": "Person", - "givenName": "Giordon", + "email": "gstark@cern.ch", "familyName": "Stark", - "email": "gstark@cern.ch" + "givenName": "Giordon", + "identifier": "https://orcid.org/0000-0001-6616-3433", + "position": 3 } ], + "codeRepository": "https://github.com/scikit-hep/pyhf", + "description": "pure-Python HistFactory implementation with tensors and autodiff", + "developmentStatus": "4 - Beta", + "identifier": "pyhf", + "issueTracker": "https://github.com/scikit-hep/pyhf/issues", + "keywords": "physics fitting numpy scipy tensorflow pytorch jax", + "license": "http://spdx.org/licenses/Apache-2.0", + "name": "pyhf", + "releaseNotes": "https://pyhf.readthedocs.io/en/stable/release-notes.html", + "runtimePlatform": [ + "Python 3", + "Python 3 Only", + "Python 3.10", + "Python 3.7", + "Python 3.8", + "Python 3.9", + "Python Implementation CPython" + ], + "softwareHelp": { + "@id": "https://pyhf.readthedocs.io/" + }, "softwareRequirements": [ { + "@id": "/dependency/click-ge-8.0.0", "@type": "SoftwareApplication", - "identifier": "scipy", - "name": "scipy", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, + "identifier": "click", + "name": "click", "runtimePlatform": "Python 3", - "version": ">=1.4.1" + "version": ">=8.0.0" }, { + "@id": "/dependency/importlib-resources-ge-1.4.0", "@type": "SoftwareApplication", - "identifier": "click", - "name": "click", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, + "identifier": "importlib-resources", + "name": "importlib-resources", "runtimePlatform": "Python 3", - "version": ">=7.0" + "version": ">=1.4.0" }, { + "@id": "/dependency/jsonpatch-ge-1.15", "@type": "SoftwareApplication", - "identifier": "tqdm", - "name": "tqdm", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, + "identifier": "jsonpatch", + "name": "jsonpatch", "runtimePlatform": "Python 3", - "version": ">=4.56.0" + "version": ">=1.15" }, { + "@id": "/dependency/jsonschema-ge-4.15.0", "@type": "SoftwareApplication", "identifier": "jsonschema", "name": "jsonschema", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, "runtimePlatform": "Python 3", - "version": ">=3.0.0" + "version": ">=4.15.0" }, { + "@id": "/dependency/pyyaml-ge-5.1", "@type": "SoftwareApplication", - "identifier": "jsonpatch", - "name": "jsonpatch", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, + "identifier": "pyyaml", + "name": "pyyaml", "runtimePlatform": "Python 3", - "version": ">=1.15" + "version": ">=5.1" }, { + "@id": "/dependency/scipy-ge-1.1.0", "@type": "SoftwareApplication", - "identifier": "pyyaml", - "name": "pyyaml", - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" - }, + "identifier": "scipy", + "name": "scipy", "runtimePlatform": "Python 3", - "version": ">=5.1" - } - ], - "audience": [ + "version": ">=1.1.0" + }, { - "@type": "Audience", - "audienceType": "Science/Research" + "@id": "/dependency/tqdm-ge-4.56.0", + "@type": "SoftwareApplication", + "identifier": "tqdm", + "name": "tqdm", + "runtimePlatform": "Python 3", + "version": ">=4.56.0" + }, + { + "@id": "/dependency/typing-extensions-ge-3.7.4.3", + "@type": "SoftwareApplication", + "identifier": "typing-extensions", + "name": "typing-extensions", + "runtimePlatform": "Python 3", + "version": ">=3.7.4.3" } ], - "provider": { - "@id": "https://pypi.org", - "@type": "Organization", - "name": "The Python Package Index", - "url": "https://pypi.org" + "targetProduct": { + "@id": "/commandlineapplication/pyhf", + "@type": "CommandLineApplication", + "description": "The pyhf command line interface.", + "executableName": "pyhf", + "name": "pyhf", + "runtimePlatform": "Python 3" }, - "runtimePlatform": "Python 3", "url": "https://github.com/scikit-hep/pyhf", - "keywords": "physics fitting numpy scipy tensorflow pytorch jax", - "developmentStatus": "4 - Beta", - "applicationCategory": "Scientific/Engineering, Scientific/Engineering :: Physics", - "programmingLanguage": "Python 3, Python 3.7, Python 3.8, Python 3.9, Python 3.10, Python Implementation CPython" + "version": "0.7.0rc4" } diff --git a/docs/api.rst b/docs/api.rst index 8b678b6e91..57e09b70d2 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -157,10 +157,19 @@ Fits and Tests mle.fit mle.fixed_poi_fit hypotest - intervals.upperlimit - intervals.upperlimit_auto utils.all_pois_floating +Confidence Intervals +~~~~~~~~~~~~~~~~~~~~ + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + intervals.upper_limits.upper_limit + intervals.upper_limits.toms748_scan + intervals.upper_limits.linear_grid_scan + intervals.upperlimit Schema ------ diff --git a/docs/contributors.rst b/docs/contributors.rst index 9ee54b8578..a0da954d61 100644 --- a/docs/contributors.rst +++ b/docs/contributors.rst @@ -29,3 +29,4 @@ Contributors include: - Aryan Roy - Jerry Ling - Nathan Simpson +- Beojan Stanislaus diff --git a/docs/development.rst b/docs/development.rst index 00ecb9dd0e..d3b54dbf6b 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -52,7 +52,7 @@ available by the ``datadir`` fixture. Therefore, one can do: .. code-block:: python def test_patchset(datadir): - data_file = open(datadir.join("test.txt")) + data_file = open(datadir.join("test.txt"), encoding="utf-8") ... which will load the copy of ``text.txt`` in the temporary directory. This also diff --git a/docs/examples/notebooks/ImpactPlot.ipynb b/docs/examples/notebooks/ImpactPlot.ipynb index 0d10ddcd4c..aa045c124f 100644 --- a/docs/examples/notebooks/ImpactPlot.ipynb +++ b/docs/examples/notebooks/ImpactPlot.ipynb @@ -76,9 +76,13 @@ "outputs": [], "source": [ "def make_model(channel_list):\n", - " spec = json.load(open(\"1Lbb-probability-models/RegionA/BkgOnly.json\"))\n", + " spec = json.load(\n", + " open(\"1Lbb-probability-models/RegionA/BkgOnly.json\", encoding=\"utf-8\")\n", + " )\n", " patchset = pyhf.PatchSet(\n", - " json.load(open(\"1Lbb-probability-models/RegionA/patchset.json\"))\n", + " json.load(\n", + " open(\"1Lbb-probability-models/RegionA/patchset.json\", encoding=\"utf-8\")\n", + " )\n", " )\n", " patch = patchset[\"sbottom_750_745_60\"]\n", " spec = jsonpatch.apply_patch(spec, patch)\n", diff --git a/docs/examples/notebooks/ShapeFactor.ipynb b/docs/examples/notebooks/ShapeFactor.ipynb index 7527fb9855..32274c94ab 100644 --- a/docs/examples/notebooks/ShapeFactor.ipynb +++ b/docs/examples/notebooks/ShapeFactor.ipynb @@ -176,7 +176,11 @@ } ], "source": [ - "obs_limit, exp_limits, (poi_tests, tests) = pyhf.infer.intervals.upperlimit(\n", + "(\n", + " obs_limit,\n", + " exp_limits,\n", + " (poi_tests, tests),\n", + ") = pyhf.infer.intervals.upper_limits.upper_limit(\n", " data, pdf, np.linspace(0, 5, 61), level=0.05, return_results=True\n", ")" ] diff --git a/docs/examples/notebooks/binderexample/StatisticalAnalysis.ipynb b/docs/examples/notebooks/binderexample/StatisticalAnalysis.ipynb index d777b43cde..42c3b4656d 100644 --- a/docs/examples/notebooks/binderexample/StatisticalAnalysis.ipynb +++ b/docs/examples/notebooks/binderexample/StatisticalAnalysis.ipynb @@ -2295,7 +2295,11 @@ "outputs": [], "source": [ "mu_tests = np.linspace(0, 1, 16)\n", - "obs_limit, exp_limits, (poi_tests, tests) = pyhf.infer.intervals.upperlimit(\n", + "(\n", + " obs_limit,\n", + " exp_limits,\n", + " (poi_tests, tests),\n", + ") = pyhf.infer.intervals.upper_limits.upper_limit(\n", " data, pdf, mu_tests, level=0.05, return_results=True\n", ")" ] diff --git a/docs/examples/notebooks/multiBinPois.ipynb b/docs/examples/notebooks/multiBinPois.ipynb index 5b58b28f7f..ec2a0c6b59 100644 --- a/docs/examples/notebooks/multiBinPois.ipynb +++ b/docs/examples/notebooks/multiBinPois.ipynb @@ -85,7 +85,7 @@ } ], "source": [ - "source = json.load(open(validation_datadir + '/1bin_example1.json'))\n", + "source = json.load(open(validation_datadir + \"/1bin_example1.json\", encoding=\"utf-8\"))\n", "model = uncorrelated_background(\n", " source['bindata']['sig'], source['bindata']['bkg'], source['bindata']['bkgerr']\n", ")\n", @@ -94,7 +94,11 @@ "init_pars = model.config.suggested_init()\n", "par_bounds = model.config.suggested_bounds()\n", "\n", - "obs_limit, exp_limits, (poi_tests, tests) = pyhf.infer.intervals.upperlimit(\n", + "(\n", + " obs_limit,\n", + " exp_limits,\n", + " (poi_tests, tests),\n", + ") = pyhf.infer.intervals.upper_limits.upper_limit(\n", " data, model, np.linspace(0, 5, 61), level=0.05, return_results=True\n", ")" ] diff --git a/docs/examples/notebooks/multichannel-coupled-histo.ipynb b/docs/examples/notebooks/multichannel-coupled-histo.ipynb index 60665951cf..3c565fd93f 100644 --- a/docs/examples/notebooks/multichannel-coupled-histo.ipynb +++ b/docs/examples/notebooks/multichannel-coupled-histo.ipynb @@ -165,7 +165,9 @@ } ], "source": [ - "with open(validation_datadir + \"/2bin_2channel_coupledhisto.json\") as spec:\n", + "with open(\n", + " validation_datadir + \"/2bin_2channel_coupledhisto.json\", encoding=\"utf-8\"\n", + ") as spec:\n", " source = json.load(spec)\n", "\n", "data, pdf = prep_data(source[\"channels\"])\n", diff --git a/docs/examples/notebooks/pullplot.ipynb b/docs/examples/notebooks/pullplot.ipynb index ca76f61fd0..a259ba2cc9 100644 --- a/docs/examples/notebooks/pullplot.ipynb +++ b/docs/examples/notebooks/pullplot.ipynb @@ -72,7 +72,10 @@ "outputs": [], "source": [ "def make_model(channel_list):\n", - " spec = json.load(open(\"1Lbb-probability-models/RegionA/BkgOnly.json\"))\n", + " with open(\n", + " \"1Lbb-probability-models/RegionA/BkgOnly.json\", encoding=\"utf-8\"\n", + " ) as spec_file:\n", + " spec = json.load(spec_file)\n", " spec[\"channels\"] = [c for c in spec[\"channels\"] if c[\"name\"] in channel_list]\n", " spec[\"measurements\"][0][\"config\"][\"poi\"] = \"lumi\"\n", "\n", diff --git a/docs/faq.rst b/docs/faq.rst index 9644a7c006..d821139463 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -30,6 +30,46 @@ Use the :code:`--backend` option for :code:`pyhf cls` to specify a tensor backen The default backend is NumPy. For more information see :code:`pyhf cls --help`. +I installed an old ``pyhf`` release from PyPI, why am I getting an error from a dependency? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For old releases of ``pyhf`` that are not actively supported anymore you might +need to manually constrain the **upper bound** of a dependency. + +We work hard to make sure that ``pyhf`` is well maintained so that it installs +correctly "out of the box" and have tested all of ``pyhf``'s core dependencies +to determine hard lower bounds for compatible dependency releases. +However, as ``pyhf`` is |Henry Python library blog|_ we can only define lower +bounds for its core dependencies, as defining upper bounds would make decisions +for users on what versions of libraries they can use in Python applications they +build with ``pyhf`` --- |Hynek SemVer blog|_. +If ``pyhf`` were to define upper bounds we could create situations in which +``pyhf`` and other libraries defined in an environment file (i.e., +``requirements.txt``) could have directly conflicting dependencies that would +result in ``pip`` failing to be able to install ``pyhf``. + +To give an explicit example, |jsonschema GitHub Discussion 995|_ resulted in a +``KeyError`` if used with ``pyhf`` ``v0.6.3`` or older. +This problem was fixed (c.f. Pull Request :pr:`1979`) in the next release with +``pyhf`` ``v0.7.0``, but the intermediate solution for users was to install an +older version of ``jsonschema`` that was still compatible with the ``pyhf`` +release they were using: + + .. code-block:: + + # requirements.txt + pyhf==0.6.3 + jsonschema<4.15.0 + +.. |Henry Python library blog| replace:: a Python library +.. _`Henry Python library blog`: https://iscinumpy.dev/post/app-vs-library/ + +.. |Hynek SemVer blog| replace:: that would be bad +.. _`Hynek SemVer blog`: https://hynek.me/articles/semver-will-not-save-you/ + +.. |jsonschema GitHub Discussion 995| replace:: breaking changes in ``jsonschema`` ``v4.15.0``'s behavior +.. _`jsonschema GitHub Discussion 995`: https://github.com/orgs/python-jsonschema/discussions/995 + Does ``pyhf`` support Python 2? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ No. diff --git a/docs/generate_jupyterlite_iframe.py b/docs/generate_jupyterlite_iframe.py index 453a80c3ee..8528a14c34 100644 --- a/docs/generate_jupyterlite_iframe.py +++ b/docs/generate_jupyterlite_iframe.py @@ -4,7 +4,7 @@ def main(): code = """\ import piplite -await piplite.install(["pyhf==0.7.0rc3", "requests"]) +await piplite.install(["pyhf==0.7.0rc4", "requests"]) %matplotlib inline import pyhf\ """ diff --git a/docs/jupyterlite.rst b/docs/jupyterlite.rst index f3aef3dcca..77389b88d2 100644 --- a/docs/jupyterlite.rst +++ b/docs/jupyterlite.rst @@ -21,7 +21,7 @@ Try out now with JupyterLite_ .. raw:: html diff --git a/docs/likelihood.rst b/docs/likelihood.rst index b724a7da35..a3e687a6e2 100644 --- a/docs/likelihood.rst +++ b/docs/likelihood.rst @@ -28,7 +28,8 @@ check that it conforms to the provided workspace specification as follows: import json, requests, jsonschema - workspace = json.load(open("/path/to/analysis_workspace.json")) + with open("/path/to/analysis_workspace.json", encoding="utf-8") as ws_file: + workspace = json.load(ws_file) # if no exception is raised, it found and parsed the schema schema = requests.get("https://scikit-hep.org/pyhf/schemas/1.0.0/workspace.json").json() # If no exception is raised by validate(), the instance is valid. diff --git a/pyproject.toml b/pyproject.toml index 3fdaf65392..4214261f18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,6 +89,7 @@ filterwarnings = [ 'ignore:Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with:UserWarning', #FIXME: tests/test_optim.py::test_minimize[no_grad-scipy-pytorch-no_stitch] 'ignore:divide by zero encountered in (true_)?divide:RuntimeWarning', #FIXME: pytest tests/test_tensor.py::test_pdf_calculations[numpy] 'ignore:[A-Z]+ is deprecated and will be removed in Pillow 10:DeprecationWarning', # keras + 'ignore:Call to deprecated create function:DeprecationWarning', # protobuf via tensorflow ] [tool.nbqa.mutate] diff --git a/setup.cfg b/setup.cfg index e43033e997..3484d02c58 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,7 +35,7 @@ package_dir = include_package_data = True python_requires = >=3.7 install_requires = - scipy>=1.1.0 # requires numpy, which is required by pyhf and tensorflow + scipy>=1.2.0 # requires numpy, which is required by pyhf and tensorflow click>=8.0.0 # for console scripts tqdm>=4.56.0 # for readxml jsonschema>=4.15.0 # for utils diff --git a/src/pyhf/cli/infer.py b/src/pyhf/cli/infer.py index 5081d2d156..05894be405 100644 --- a/src/pyhf/cli/infer.py +++ b/src/pyhf/cli/infer.py @@ -99,10 +99,13 @@ def fit( ) set_backend(tensorlib, new_optimizer(**optconf)) - with click.open_file(workspace, "r") as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) - patches = [json.loads(click.open_file(pfile, "r").read()) for pfile in patch] + patches = [ + json.loads(click.open_file(pfile, "r", encoding="utf-8").read()) + for pfile in patch + ] model = ws.model( measurement_name=measurement, @@ -125,7 +128,7 @@ def fit( if output_file is None: click.echo(json.dumps(result, indent=4, sort_keys=True)) else: - with open(output_file, "w+") as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(result, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -190,12 +193,15 @@ def cls( "CLs_obs": 0.3599845631401915 } """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) - patches = [json.loads(click.open_file(pfile, 'r').read()) for pfile in patch] + patches = [ + json.loads(click.open_file(pfile, "r", encoding="utf-8").read()) + for pfile in patch + ] model = ws.model( measurement_name=measurement, patches=patches, @@ -241,6 +247,6 @@ def cls( if output_file is None: click.echo(json.dumps(result, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(result, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") diff --git a/src/pyhf/cli/patchset.py b/src/pyhf/cli/patchset.py index 50f5855cb8..75bdb56887 100644 --- a/src/pyhf/cli/patchset.py +++ b/src/pyhf/cli/patchset.py @@ -39,7 +39,7 @@ def extract(patchset, name, output_file, with_metadata): Returns: jsonpatch (:obj:`list`): A list of jsonpatch operations to apply to a workspace. """ - with click.open_file(patchset, 'r') as fstream: + with click.open_file(patchset, "r", encoding="utf-8") as fstream: patchset_spec = json.load(fstream) patchset = PatchSet(patchset_spec) @@ -52,7 +52,7 @@ def extract(patchset, name, output_file, with_metadata): result = patch.patch if output_file: - with open(output_file, 'w+') as out_file: + with open(output_file, "w", encoding="utf-8") as out_file: json.dump(result, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") else: @@ -79,19 +79,19 @@ def apply(background_only, patchset, name, output_file): Returns: workspace (:class:`~pyhf.workspace.Workspace`): The patched background-only workspace. """ - with click.open_file(background_only, 'r') as specstream: + with click.open_file(background_only, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) - with click.open_file(patchset, 'r') as fstream: + with click.open_file(patchset, "r", encoding="utf-8") as fstream: patchset_spec = json.load(fstream) patchset = PatchSet(patchset_spec) patched_ws = patchset.apply(ws, name) if output_file: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(patched_ws, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") else: @@ -111,12 +111,12 @@ def verify(background_only, patchset): Returns: None """ - with click.open_file(background_only, 'r') as specstream: + with click.open_file(background_only, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) - with click.open_file(patchset, 'r') as fstream: + with click.open_file(patchset, "r", encoding="utf-8") as fstream: patchset_spec = json.load(fstream) patchset = PatchSet(patchset_spec) @@ -134,7 +134,7 @@ def inspect(patchset): Returns: None """ - with click.open_file(patchset, 'r') as fstream: + with click.open_file(patchset, "r", encoding="utf-8") as fstream: patchset_spec = json.load(fstream) patchset = PatchSet(patchset_spec) diff --git a/src/pyhf/cli/rootio.py b/src/pyhf/cli/rootio.py index 06411773f8..d1312c2641 100644 --- a/src/pyhf/cli/rootio.py +++ b/src/pyhf/cli/rootio.py @@ -65,7 +65,7 @@ def xml2json( if output_file is None: click.echo(json.dumps(spec, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(spec, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -92,15 +92,15 @@ def json2xml(workspace, output_dir, specroot, dataroot, resultprefix, patch): from pyhf import writexml os.makedirs(output_dir, exist_ok=True) - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) for pfile in patch: - patch = json.loads(click.open_file(pfile, 'r').read()) + patch = json.loads(click.open_file(pfile, "r", encoding="utf-8").read()) spec = jsonpatch.JsonPatch(patch).apply(spec) os.makedirs(Path(output_dir).joinpath(specroot), exist_ok=True) os.makedirs(Path(output_dir).joinpath(dataroot), exist_ok=True) with click.open_file( - Path(output_dir).joinpath(f'{resultprefix}.xml'), 'w' + Path(output_dir).joinpath(f"{resultprefix}.xml"), "w", encoding="utf-8" ) as outstream: outstream.write( writexml.writexml( diff --git a/src/pyhf/cli/spec.py b/src/pyhf/cli/spec.py index 47beac9e73..ad335851b8 100644 --- a/src/pyhf/cli/spec.py +++ b/src/pyhf/cli/spec.py @@ -60,7 +60,7 @@ def inspect(workspace, output_file, measurement): (*) Measurement mu (none) """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) @@ -158,7 +158,7 @@ def inspect(workspace, output_file, measurement): click.echo() if output_file: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(result, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -189,7 +189,7 @@ def prune( See :func:`pyhf.workspace.Workspace.prune` for more information. """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) @@ -204,7 +204,7 @@ def prune( if output_file is None: click.echo(json.dumps(pruned_ws, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(pruned_ws, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -253,7 +253,7 @@ def rename(workspace, output_file, channel, sample, modifier, measurement): See :func:`pyhf.workspace.Workspace.rename` for more information. """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) ws = Workspace(spec) @@ -267,7 +267,7 @@ def rename(workspace, output_file, channel, sample, modifier, measurement): if output_file is None: click.echo(json.dumps(renamed_ws, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(renamed_ws, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -298,10 +298,10 @@ def combine(workspace_one, workspace_two, join, output_file, merge_channels): See :func:`pyhf.workspace.Workspace.combine` for more information. """ - with click.open_file(workspace_one, 'r') as specstream: + with click.open_file(workspace_one, "r", encoding="utf-8") as specstream: spec_one = json.load(specstream) - with click.open_file(workspace_two, 'r') as specstream: + with click.open_file(workspace_two, "r", encoding="utf-8") as specstream: spec_two = json.load(specstream) ws_one = Workspace(spec_one) @@ -313,7 +313,7 @@ def combine(workspace_one, workspace_two, join, output_file, merge_channels): if output_file is None: click.echo(json.dumps(combined_ws, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(combined_ws, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file:s}") @@ -347,7 +347,7 @@ def digest(workspace, algorithm, output_json): $ curl -sL https://raw.githubusercontent.com/scikit-hep/pyhf/master/docs/examples/json/2-bin_1-channel.json | pyhf digest sha256:dad8822af55205d60152cbe4303929042dbd9d4839012e055e7c6b6459d68d73 """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) workspace = Workspace(spec) @@ -393,7 +393,7 @@ def sort(workspace, output_file): """ - with click.open_file(workspace, 'r') as specstream: + with click.open_file(workspace, "r", encoding="utf-8") as specstream: spec = json.load(specstream) workspace = Workspace(spec) @@ -402,6 +402,6 @@ def sort(workspace, output_file): if output_file is None: click.echo(json.dumps(sorted_ws, indent=4, sort_keys=True)) else: - with open(output_file, 'w+') as out_file: + with open(output_file, "w+", encoding="utf-8") as out_file: json.dump(sorted_ws, out_file, indent=4, sort_keys=True) log.debug(f"Written to {output_file}") diff --git a/src/pyhf/contrib/utils.py b/src/pyhf/contrib/utils.py index cca215ece3..da6daedd32 100644 --- a/src/pyhf/contrib/utils.py +++ b/src/pyhf/contrib/utils.py @@ -6,7 +6,7 @@ from io import BytesIO from pathlib import Path from shutil import rmtree -from urllib.parse import urlparse +from urllib.parse import urlsplit from pyhf import exceptions @@ -50,7 +50,7 @@ def download(archive_url, output_directory, force=False, compress=False): """ if not force: valid_hosts = ["www.hepdata.net", "doi.org"] - netloc = urlparse(archive_url).netloc + netloc = urlsplit(archive_url).netloc if netloc not in valid_hosts: raise exceptions.InvalidArchiveHost( f"{netloc} is not an approved archive host: {', '.join(str(host) for host in valid_hosts)}\n" diff --git a/src/pyhf/data/citation.bib b/src/pyhf/data/citation.bib index cb5c5f2749..e1cfb34843 100644 --- a/src/pyhf/data/citation.bib +++ b/src/pyhf/data/citation.bib @@ -1,10 +1,10 @@ @software{pyhf, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark}, - title = "{pyhf: v0.7.0rc3}", - version = {0.7.0rc3}, + title = "{pyhf: v0.7.0rc4}", + version = {0.7.0rc4}, doi = {10.5281/zenodo.1169739}, url = {https://doi.org/10.5281/zenodo.1169739}, - note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc3} + note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc4} } @article{pyhf_joss, diff --git a/src/pyhf/exceptions/__init__.py b/src/pyhf/exceptions/__init__.py index 1cbbb4b83c..6d7e55f12f 100644 --- a/src/pyhf/exceptions/__init__.py +++ b/src/pyhf/exceptions/__init__.py @@ -1,4 +1,5 @@ import sys +from warnings import warn __all__ = [ "FailedMinimization", @@ -175,3 +176,15 @@ def __init__(self, result): result, 'message', "Unknown failure. See fit result for more details." ) super().__init__(message) + + +# Deprecated APIs +def _deprecated_api_warning( + deprecated_api, new_api, deprecated_release, remove_release +): + warn( + f"{deprecated_api} is deprecated in favor of {new_api} as of pyhf v{deprecated_release} and will be removed in pyhf v{remove_release}." + + f" Please use {new_api}.", + DeprecationWarning, + stacklevel=3, # Raise to user level + ) diff --git a/src/pyhf/infer/intervals/__init__.py b/src/pyhf/infer/intervals/__init__.py new file mode 100644 index 0000000000..0f2f928cdd --- /dev/null +++ b/src/pyhf/infer/intervals/__init__.py @@ -0,0 +1,30 @@ +"""Interval estimation""" +import pyhf.infer.intervals.upper_limits + +__all__ = ["upper_limits.upper_limit"] + + +def __dir__(): + return __all__ + + +def upperlimit( + data, model, scan=None, level=0.05, return_results=False, **hypotest_kwargs +): + """ + .. deprecated:: 0.7.0 + Use :func:`~pyhf.infer.intervals.upper_limits.upper_limit` instead. + .. warning:: :func:`~pyhf.infer.intervals.upperlimit` will be removed in + ``pyhf`` ``v0.9.0``. + """ + from pyhf.exceptions import _deprecated_api_warning + + _deprecated_api_warning( + "pyhf.infer.intervals.upperlimit", + "pyhf.infer.intervals.upper_limits.upper_limit", + "0.7.0", + "0.9.0", + ) + return pyhf.infer.intervals.upper_limits.upper_limit( + data, model, scan, level, return_results, **hypotest_kwargs + ) diff --git a/src/pyhf/infer/intervals.py b/src/pyhf/infer/intervals/upper_limits.py similarity index 57% rename from src/pyhf/infer/intervals.py rename to src/pyhf/infer/intervals/upper_limits.py index 4ffba62eb8..12220909a8 100644 --- a/src/pyhf/infer/intervals.py +++ b/src/pyhf/infer/intervals/upper_limits.py @@ -1,13 +1,11 @@ """Interval estimation""" -from warnings import warn - import numpy as np from scipy.optimize import toms748 from pyhf import get_backend from pyhf.infer import hypotest -__all__ = ["upperlimit"] +__all__ = ["upper_limit", "linear_grid_scan", "toms748_scan"] def __dir__(): @@ -19,17 +17,16 @@ def _interp(x, xp, fp): return tb.astensor(np.interp(x, xp.tolist(), fp.tolist())) -def upperlimit_auto( +def toms748_scan( data, model, - low, - high, + bounds_low, + bounds_up, level=0.05, atol=2e-12, - rtol=None, - calctype='asymptotics', - test_stat='qtilde', - from_upperlimit_fn=False, + rtol=1e-4, + from_upper_limit_fn=False, + **hypotest_kwargs, ): """ Calculate an upper limit interval ``(0, poi_up)`` for a single @@ -40,79 +37,74 @@ def upperlimit_auto( >>> import numpy as np >>> import pyhf >>> pyhf.set_backend("numpy") - >>> model = pyhf.simplemodels.hepdata_like( - ... signal_data=[12.0, 11.0], bkg_data=[50.0, 52.0], bkg_uncerts=[3.0, 7.0] + >>> model = pyhf.simplemodels.uncorrelated_background( + ... signal=[12.0, 11.0], bkg=[50.0, 52.0], bkg_uncertainty=[3.0, 7.0] ... ) >>> observations = [51, 48] >>> data = pyhf.tensorlib.astensor(observations + model.config.auxdata) - >>> obs_limit, exp_limits = pyhf.infer.intervals.upperlimit_auto( - ... data, model, 0., 5. + >>> obs_limit, exp_limits = pyhf.infer.intervals.upper_limits.toms748_scan( + ... data, model, 0., 5., rtol=0.01 ... ) >>> obs_limit array(1.01156939) >>> exp_limits - [array(0.55988001), array(0.75702336), array(1.06234693), array(1.50116923), array(2.05078596)] + [array(0.5600747), array(0.75702605), array(1.06234693), array(1.50116923), array(2.05078912)] Args: data (:obj:`tensor`): The observed data. model (~pyhf.pdf.Model): The statistical model adhering to the schema ``model.json``. - low (:obj:`float`): Lower boundary of search region - high (:obj:`float`): Higher boundary of search region + bounds_low (:obj:`float`): Lower boundary of search interval. + bounds_up (:obj:`float`): Upper boundary of search interval. level (:obj:`float`): The threshold value to evaluate the interpolated results at. - Defaults to 0.05. - atol (:obj:`float`): Absolute tolerance. Defaults to 1e-12. The iteration will end when the - result is within absolute *or* relative tolerance of the true limit. - rtol (:obj:`float`): Relative tolerance. For optimal performance this argument should be set - to the highest acceptable relative tolerance, though it will default - to 1e-15 if not set. - calctype (:obj:`str`): Calculator to use for hypothesis tests. Choose 'asymptotics' (default) - or 'toybased'. - test_stat (:obj:`str`): Test statistic to use. Choose 'qtilde' (default), 'q', or 'q0'. + Defaults to ``0.05``. + atol (:obj:`float`): Absolute tolerance. + Defaults to ``1e-12``. + The iteration will end when the result is within absolute + *or* relative tolerance of the true limit. + rtol (:obj:`float`): Relative tolerance. + For optimal performance this argument should be set + to the highest acceptable relative tolerance. + hypotest_kwargs (:obj:`string`): Kwargs for the calls to + :class:`~pyhf.infer.hypotest` to configure the fits. Returns: Tuple of Tensors: - Tensor: The observed upper limit on the POI. - Tensor: The expected upper limits on the POI. - """ - if rtol is None: - warn( - "upperlimit_auto: rtol not provided, defaulting to 1e-15. " - "For optimal performance rtol should be set to the highest acceptable relative tolerance." - ) - rtol = 1e-15 + .. versionadded:: 0.7.0 + """ cache = {} - def f_all(mu): - if mu in cache: - return cache[mu] - cache[mu] = hypotest( - mu, - data, - model, - test_stat=test_stat, - calctype=calctype, - return_expected_set=True, - ) - return cache[mu] - - def f(mu, limit=0): + def f_cached(poi): + if poi not in cache: + cache[poi] = hypotest( + poi, + data, + model, + return_expected_set=True, + **hypotest_kwargs, + ) + return cache[poi] + + def f(poi, level, limit=0): # Use integers for limit so we don't need a string comparison - if limit == 0: - # Obs - return f_all(mu)[0] - level - # Exp - # (These are in the order -2, -1, 0, 1, 2 sigma) - return f_all(mu)[1][limit - 1] - level + # limit == 0: Observed + # else: expected + return ( + f_cached(poi)[0] - level + if limit == 0 + else f_cached(poi)[1][limit - 1] - level + ) def best_bracket(limit): # return best bracket - ks = np.array(list(cache.keys())) - vals = np.array( + ks = np.asarray(list(cache.keys())) + vals = np.asarray( [ - v[0] - level if limit == 0 else v[1][limit - 1] - level - for v in cache.values() + value[0] - level if limit == 0 else value[1][limit - 1] - level + for value in cache.values() ] ) pos = vals >= 0 @@ -121,33 +113,40 @@ def best_bracket(limit): upper = ks[neg][np.argmax(vals[neg])] return (lower, upper) - # extend low and high if they don't bracket CLs level - low_res = f_all(low) - while np.any(np.array(low_res[0] + low_res[1]) < 0.05): - low /= 2 - low_res = f_all(low) - high_res = f_all(high) - while np.any(np.array(high_res[0] + high_res[1]) > 0.05): - high *= 2 - high_res = f_all(high) + # extend bounds_low and bounds_up if they don't bracket CLs level + lower_results = f_cached(bounds_low) + # {lower,upper}_results[0] is an array and {lower,upper}_results[1] is a + # list of arrays so need to turn {lower,upper}_results[0] into list to + # concatenate them + while np.any(np.asarray([lower_results[0]] + lower_results[1]) < level): + bounds_low /= 2 + lower_results = f_cached(bounds_low) + upper_results = f_cached(bounds_up) + while np.any(np.asarray([upper_results[0]] + upper_results[1]) > level): + bounds_up *= 2 + upper_results = f_cached(bounds_up) tb, _ = get_backend() - obs = tb.astensor(toms748(f, low, high, args=(0), k=2, xtol=atol, rtol=rtol)) + obs = tb.astensor( + toms748(f, bounds_low, bounds_up, args=(level, 0), k=2, xtol=atol, rtol=rtol) + ) exp = [ - tb.astensor(toms748(f, *best_bracket(i), args=(i), k=2, xtol=atol, rtol=rtol)) - for i in range(1, 6) + tb.astensor( + toms748(f, *best_bracket(idx), args=(level, idx), k=2, xtol=atol, rtol=rtol) + ) + for idx in range(1, 6) ] - if from_upperlimit_fn: + if from_upper_limit_fn: return obs, exp, (list(cache.keys()), list(cache.values())) return obs, exp -def upperlimit_fixedscan( +def linear_grid_scan( data, model, scan, level=0.05, return_results=False, **hypotest_kwargs ): """ Calculate an upper limit interval ``(0, poi_up)`` for a single - Parameter of Interest (POI) using a fixed scan through POI-space. + Parameter of Interest (POI) using a linear scan through POI-space. Example: >>> import numpy as np @@ -159,7 +158,7 @@ def upperlimit_fixedscan( >>> observations = [51, 48] >>> data = pyhf.tensorlib.astensor(observations + model.config.auxdata) >>> scan = np.linspace(0, 5, 21) - >>> obs_limit, exp_limits, (scan, results) = pyhf.infer.intervals.upperlimit( + >>> obs_limit, exp_limits, (scan, results) = pyhf.infer.intervals.upper_limits.upper_limit( ... data, model, scan, return_results=True ... ) >>> obs_limit @@ -184,6 +183,8 @@ def upperlimit_fixedscan( - Tuple of Tensors: The given ``scan`` along with the :class:`~pyhf.infer.hypotest` results at each test POI. Only returned when ``return_results`` is ``True``. + + .. versionadded:: 0.7.0 """ tb, _ = get_backend() results = [ @@ -193,10 +194,10 @@ def upperlimit_fixedscan( obs = tb.astensor([[r[0]] for r in results]) exp = tb.astensor([[r[1][idx] for idx in range(5)] for r in results]) - result_arrary = tb.concatenate([obs, exp], axis=1).T + result_array = tb.concatenate([obs, exp], axis=1).T # observed limit and the (0, +-1, +-2)sigma expected limits - limits = [_interp(level, result_arrary[idx][::-1], scan[::-1]) for idx in range(6)] + limits = [_interp(level, result_array[idx][::-1], scan[::-1]) for idx in range(6)] obs_limit, exp_limits = limits[0], limits[1:] if return_results: @@ -204,10 +205,12 @@ def upperlimit_fixedscan( return obs_limit, exp_limits -def upperlimit(data, model, scan, level=0.05, return_results=False): +def upper_limit( + data, model, scan=None, level=0.05, return_results=False, **hypotest_kwargs +): """ - Calculate an upper limit interval ``(0, poi_up)`` for a single - Parameter of Interest (POI) using root-finding or a fixed scan through POI-space. + Calculate an upper limit interval ``(0, poi_up)`` for a single Parameter of + Interest (POI) using root-finding or a linear scan through POI-space. Example: >>> import numpy as np @@ -219,7 +222,7 @@ def upperlimit(data, model, scan, level=0.05, return_results=False): >>> observations = [51, 48] >>> data = pyhf.tensorlib.astensor(observations + model.config.auxdata) >>> scan = np.linspace(0, 5, 21) - >>> obs_limit, exp_limits, (scan, results) = pyhf.infer.intervals.upperlimit( + >>> obs_limit, exp_limits, (scan, results) = pyhf.infer.intervals.upper_limits.upper_limit( ... data, model, scan, return_results=True ... ) >>> obs_limit @@ -230,7 +233,8 @@ def upperlimit(data, model, scan, level=0.05, return_results=False): Args: data (:obj:`tensor`): The observed data. model (~pyhf.pdf.Model): The statistical model adhering to the schema ``model.json``. - scan (:obj:`iterable` or "auto"): Iterable of POI values or "auto" to use ``upperlimit_auto``. + scan (:obj:`iterable` or ``None``): Iterable of POI values or ``None`` to use + :class:`~pyhf.infer.intervals.upper_limits.toms748_scan`. level (:obj:`float`): The threshold value to evaluate the interpolated results at. return_results (:obj:`bool`): Whether to return the per-point results. @@ -242,15 +246,25 @@ def upperlimit(data, model, scan, level=0.05, return_results=False): - Tuple of Tensors: The given ``scan`` along with the :class:`~pyhf.infer.hypotest` results at each test POI. Only returned when ``return_results`` is ``True``. + + .. versionadded:: 0.7.0 """ - if isinstance(scan, str) and scan.lower() == 'auto': - bounds = model.config.suggested_bounds()[ - model.config.par_slice(model.config.poi_name).start - ] - obs_limit, exp_limit, results = upperlimit_auto( - data, model, bounds[0], bounds[1], rtol=1e-3, from_upperlimit_fn=True + if scan is not None: + return linear_grid_scan( + data, model, scan, level, return_results, **hypotest_kwargs ) - if return_results: - return obs_limit, exp_limit, results - return obs_limit, exp_limit - return upperlimit_fixedscan(data, model, scan, level, return_results) + # else: + bounds = model.config.suggested_bounds()[ + model.config.par_slice(model.config.poi_name).start + ] + obs_limit, exp_limit, results = toms748_scan( + data, + model, + bounds[0], + bounds[1], + from_upper_limit_fn=True, + **hypotest_kwargs, + ) + if return_results: + return obs_limit, exp_limit, results + return obs_limit, exp_limit diff --git a/src/pyhf/schema/loader.py b/src/pyhf/schema/loader.py index c046bec409..920766c4dc 100644 --- a/src/pyhf/schema/loader.py +++ b/src/pyhf/schema/loader.py @@ -50,7 +50,7 @@ def load_schema(schema_id: str): raise pyhf.exceptions.SchemaNotFound( f'The schema {schema_id} was not found. Do you have the right version or the right path? {path}' ) - with path.open() as json_schema: + with path.open(encoding="utf-8") as json_schema: schema = json.load(json_schema) variables.SCHEMA_CACHE[schema['$id']] = schema return variables.SCHEMA_CACHE[schema['$id']] diff --git a/src/pyhf/utils.py b/src/pyhf/utils.py index 23f374515d..c4a855430e 100644 --- a/src/pyhf/utils.py +++ b/src/pyhf/utils.py @@ -111,7 +111,7 @@ def citation(oneline=False): >>> import pyhf >>> pyhf.utils.citation(oneline=True) - '@software{pyhf, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark}, title = "{pyhf: v0.7.0rc3}", version = {0.7.0rc3}, doi = {10.5281/zenodo.1169739}, url = {https://doi.org/10.5281/zenodo.1169739}, note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc3}}@article{pyhf_joss, doi = {10.21105/joss.02823}, url = {https://doi.org/10.21105/joss.02823}, year = {2021}, publisher = {The Open Journal}, volume = {6}, number = {58}, pages = {2823}, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark and Kyle Cranmer}, title = {pyhf: pure-Python implementation of HistFactory statistical models}, journal = {Journal of Open Source Software}}' + '@software{pyhf, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark}, title = "{pyhf: v0.7.0rc4}", version = {0.7.0rc4}, doi = {10.5281/zenodo.1169739}, url = {https://doi.org/10.5281/zenodo.1169739}, note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.0rc4}}@article{pyhf_joss, doi = {10.21105/joss.02823}, url = {https://doi.org/10.21105/joss.02823}, year = {2021}, publisher = {The Open Journal}, volume = {6}, number = {58}, pages = {2823}, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark and Kyle Cranmer}, title = {pyhf: pure-Python implementation of HistFactory statistical models}, journal = {Journal of Open Source Software}}' Keyword Args: oneline (:obj:`bool`): Whether to provide citation with new lines (default) or as a one-liner. diff --git a/src/pyhf/writexml.py b/src/pyhf/writexml.py index 0567c94031..8d3ecd3ca3 100644 --- a/src/pyhf/writexml.py +++ b/src/pyhf/writexml.py @@ -289,7 +289,7 @@ def writexml(spec, specdir, data_rootdir, resultprefix): channelfilename = str( Path(specdir).joinpath(f'{resultprefix}_{channelspec["name"]}.xml') ) - with open(channelfilename, 'w') as channelfile: + with open(channelfilename, "w", encoding="utf-8") as channelfile: channel = build_channel(spec, channelspec, spec.get('observations')) indent(channel) channelfile.write( diff --git a/tbump.toml b/tbump.toml index 60204abbc2..50f4ff2fb7 100644 --- a/tbump.toml +++ b/tbump.toml @@ -1,7 +1,7 @@ github_url = "https://github.com/scikit-hep/pyhf/" [version] -current = "0.7.0rc3" +current = "0.7.0rc4" # Example of a semver regexp. # Make sure this matches current_version before @@ -19,7 +19,7 @@ regex = ''' [git] # The current version will get updated when tbump is run -message_template = "Bump version: 0.7.0rc3 → {new_version}" +message_template = "Bump version: 0.7.0rc4 → {new_version}" tag_template = "v{new_version}" # For each file to patch, add a [[file]] config diff --git a/tests/conftest.py b/tests/conftest.py index 96c1d11918..673d30d3b6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,7 +13,7 @@ @pytest.fixture def get_json_from_tarfile(): def _get_json_from_tarfile(archive_data_path, json_name): - with tarfile.open(archive_data_path, "r:gz") as archive: + with tarfile.open(archive_data_path, "r:gz", encoding="utf-8") as archive: json_file = ( archive.extractfile(archive.getmember(json_name)).read().decode("utf8") ) diff --git a/tests/constraints.txt b/tests/constraints.txt index 5f695f17fc..4e2e4d860c 100644 --- a/tests/constraints.txt +++ b/tests/constraints.txt @@ -1,5 +1,5 @@ # core -scipy==1.1.0 +scipy==1.2.0 # c.f. PR #1274 click==8.0.0 # c.f. PR #1958, #1909 tqdm==4.56.0 jsonschema==4.15.0 # c.f. PR #1979 diff --git a/tests/contrib/baseline/test_plot_results_no_axis.png b/tests/contrib/baseline/test_plot_results_no_axis.png index 62d432a5a5f40f7e78cabb2bf9728a597934c9a4..f52ca488834b944059b2c71cc011b610f829bdeb 100644 GIT binary patch literal 55805 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

U^x9ZfBkaC?1zEGr<#Adh{z{0#>@ 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