From df749bfe6b61027a34d4b9f1aaaec008a0432483 Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 19:49:32 -0400 Subject: [PATCH 1/9] updating --- .copier-answers.yml | 16 ++- .gitignore | 1 + docs/.gitignore | 6 +- docs/Makefile | 223 +---------------------------- docs/_static/README.md | 1 + docs/_static/logo.svg | 1 + docs/conf.py | 29 ++-- docs/index.md | 9 +- docs/license.md | 5 + pyproject.toml | 8 +- tests/.gitkeep | 0 tests/test_corner.py | 308 ----------------------------------------- 12 files changed, 50 insertions(+), 557 deletions(-) create mode 100644 docs/_static/README.md create mode 100644 docs/_static/logo.svg create mode 100644 docs/license.md create mode 100644 tests/.gitkeep delete mode 100644 tests/test_corner.py diff --git a/.copier-answers.yml b/.copier-answers.yml index 8fc6d00..39ed302 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,12 +1,21 @@ -_commit: v0.0.14 +_commit: v0.0.14-7-ge6351db _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey -author_username: dfm code_of_conduct_email: foreman.mackey@gmail.com copyright_holder: Dan Foreman-Mackey copyright_license: BSD -copyright_year: 2013-2022 +copyright_year: '2013' +documentation_build_type: dirhtml +documentation_enable: true +documentation_enable_binder: true +documentation_enable_colab: true +documentation_enable_execution: true +documentation_execution_dependencies: '"arviz>=0.9"' +documentation_execution_excludepatterns: '' +documentation_favicon_filename: logo.svg +documentation_logo_filename: logo.svg +documentation_sphinx_theme: sphinx_book_theme documentation_url: https://corner.readthedocs.io enable_mypy: false enable_pybind11: false @@ -22,6 +31,7 @@ python_min_version: 7 python_nox_sessions: '"tests"' python_package_distribution_name: corner python_package_import_name: corner +python_test_dependencies: '' readthedocs_project_name: corner repository_name: corner.py repository_namespace: dfm diff --git a/.gitignore b/.gitignore index 06d01ca..c6a07e9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ _skbuild dist build result_images +result_images diff --git a/docs/.gitignore b/docs/.gitignore index d20889f..e35d885 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,5 +1 @@ -_* -!_static -!*.png -modules -examples +_build diff --git a/docs/Makefile b/docs/Makefile index 93d2fa4..23da889 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,231 +1,16 @@ -# Makefile for Sphinx documentation - default: dirhtml -# You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -W --keep-going -n SPHINXBUILD = sphinx-build -PAPER = BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) - $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\'t have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " epub3 to make an epub3" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - @echo " dummy to check syntax errors of document sources" +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) . .PHONY: clean clean: - rm -rf $(BUILDDIR)/* $(PAGES) - -.PHONY: html -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + rm -rf $(BUILDDIR)/* .PHONY: dirhtml -dirhtml: $(PAGES) +dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/cornerpy.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/cornerpy.qhc" - -.PHONY: applehelp -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/cornerpy" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/cornerpy" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: epub3 -epub3: - $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 - @echo - @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." - -.PHONY: dummy -dummy: - $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy - @echo - @echo "Build finished. Dummy builder generates no files." diff --git a/docs/_static/README.md b/docs/_static/README.md new file mode 100644 index 0000000..f2a84bc --- /dev/null +++ b/docs/_static/README.md @@ -0,0 +1 @@ +Default logo attribution: https://feathericons.com diff --git a/docs/_static/logo.svg b/docs/_static/logo.svg new file mode 100644 index 0000000..5afe634 --- /dev/null +++ b/docs/_static/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/conf.py b/docs/conf.py index f074d37..a1f32fa 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,25 +1,35 @@ -# -*- coding: utf-8 -*- - import corner +language = "en" +master_doc = "index" + extensions = [ "sphinx.ext.autodoc", + "sphinx.ext.autosummary", "sphinx.ext.mathjax", "sphinx.ext.napoleon", + "sphinx.ext.viewcode", "myst_nb", ] -master_doc = "index" + +myst_enable_extensions = ["dollarmath", "colon_fence"] +source_suffix = { + ".rst": "restructuredtext", + ".ipynb": "myst-nb", +} +templates_path = ["_templates"] # General information about the project. project = "corner.py" -copyright = "2013-2021 Dan Foreman-Mackey & contributors" - +copyright = "2013-2022 Dan Foreman-Mackey" version = corner.__version__ release = corner.__version__ exclude_patterns = ["_build"] html_theme = "sphinx_book_theme" html_title = "corner.py" +html_logo = "_static/logo.svg" +html_favicon = "_static/logo.svg" html_static_path = ["_static"] html_show_sourcelink = False html_theme_options = { @@ -28,16 +38,15 @@ "repository_branch": "main", "launch_buttons": { "binderhub_url": "https://mybinder.org", - "colab_url": "https://colab.research.google.com/", "notebook_interface": "jupyterlab", + "colab_url": "https://colab.research.google.com/", }, "use_edit_page_button": True, "use_issues_button": True, "use_repository_button": True, "use_download_button": True, } -html_baseurl = "https://corner.readthedocs.io/en/latest/" -nb_execution_mode = "force" -# download notebooks as .ipynb and not as .ipynb.txt -html_sourcelink_suffix = "" +nb_execution_mode = "auto" +nb_execution_excludepatterns = [] +nb_execution_timeout = -1 diff --git a/docs/index.md b/docs/index.md index d3dfb77..6a32bb5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -60,10 +60,7 @@ If you make use of this code, please cite [the JOSS paper](https://dx.doi.org/10 } ``` -## Authors & License +## Authors & license -Copyright 2013-2021 Dan Foreman-Mackey - -Built by [Dan Foreman-Mackey](https://github.com/dfm) and contributors (see -[the contribution graph](https://github.com/dfm/corner.py/graphs/contributors) for the most -up to date list). Licensed under the 2-clause BSD license (see `LICENSE`). +```{include} license.md +``` diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..8ea10a2 --- /dev/null +++ b/docs/license.md @@ -0,0 +1,5 @@ +Copyright 2013-2022 Dan Foreman-Mackey + +Licensed under the BSD license (see `LICENSE`). +See [the contribution graph](https://github.com/dfm/corner.py/graphs/contributors) +for the most up-to-date list of contributors. diff --git a/pyproject.toml b/pyproject.toml index 151ab41..83a7db6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,8 @@ dependencies = ["matplotlib>=2.1"] [project.optional-dependencies] test = ["pytest"] +docs = ["sphinx>=3.3", "sphinx_book_theme", "myst-nb", "arviz>=0.9"] arviz = ["arviz>=0.9"] -docs = ["arviz>=0.9", "sphinx>=1.7.5", "pandoc", "myst-nb", "sphinx-book-theme"] [build-system] requires = ["setuptools>=62.0", "wheel", "setuptools_scm"] @@ -47,11 +47,7 @@ known_first_party = ["corner"] parallel = true branch = true source = ["corner"] -omit = [ - "docs/*", - "tests/*", - "*/corner/version.py", -] +omit = ["docs/*", "tests/*", "*/corner/version.py"] [tool.coverage.paths] source = ["src", "*/site-packages"] diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_corner.py b/tests/test_corner.py deleted file mode 100644 index 323212a..0000000 --- a/tests/test_corner.py +++ /dev/null @@ -1,308 +0,0 @@ -# -*- coding: utf-8 -*- - -from collections import OrderedDict - -import numpy as np -import pytest -from matplotlib import pyplot as pl -from matplotlib.testing.decorators import image_comparison - -import corner - -try: - import arviz as az -except ImportError: - az = None - -try: - import pandas as pd -except ImportError: - pd = None - -try: - import scipy # noqa -except ImportError: - scipy_installed = False -else: - scipy_installed = True - - -def _run_corner( - pandas=False, - arviz=False, - N=10000, - seed=1234, - ndim=3, - factor=None, - **kwargs -): - np.random.seed(seed) - data1 = np.random.randn(ndim * 4 * N // 5).reshape([4 * N // 5, ndim]) - data2 = 5 * np.random.rand(ndim)[None, :] + np.random.randn( - ndim * N // 5 - ).reshape([N // 5, ndim]) - data = np.vstack([data1, data2]) - if factor is not None: - data[:, 0] *= factor - data[:, 1] /= factor - if pandas: - # data = pd.DataFrame.from_items() - data = pd.DataFrame.from_dict( - OrderedDict(zip(map("d{0}".format, range(ndim)), data.T)) - ) - elif arviz: - data = az.from_dict( - posterior={"x": data[None]}, - sample_stats={"diverging": data[None, :, 0] < 0.0}, - ) - kwargs["truths"] = {"x": np.random.randn(ndim)} - - fig = corner.corner(data, **kwargs) - return fig - - -@image_comparison( - baseline_images=["basic"], remove_text=True, extensions=["png"] -) -def test_basic(): - _run_corner() - - -@image_comparison(baseline_images=["labels"], extensions=["png"]) -def test_labels(): - _run_corner(labels=["a", "b", "c"]) - - -@image_comparison( - baseline_images=["quantiles"], remove_text=True, extensions=["png"] -) -def test_quantiles(): - _run_corner(quantiles=[0.16, 0.5, 0.84]) - - -@image_comparison( - baseline_images=["title_quantiles"], remove_text=False, extensions=["png"] -) -def test_title_quantiles(): - _run_corner( - quantiles=[0.16, 0.5, 0.84], - title_quantiles=[0.05, 0.5, 0.95], - show_titles=True, - ) - - -@image_comparison( - baseline_images=["title_quantiles_default"], - remove_text=False, - extensions=["png"], -) -def test_title_quantiles_default(): - _run_corner(quantiles=[0.16, 0.5, 0.84], show_titles=True) - - -@image_comparison( - baseline_images=["title_quantiles_raises"], - remove_text=False, - extensions=["png"], -) -def test_title_quantiles_raises(): - with pytest.raises(ValueError): - _run_corner(quantiles=[0.05, 0.16, 0.5, 0.84, 0.95], show_titles=True) - - # This one shouldn't raise since show_titles isn't provided - _run_corner(quantiles=[0.05, 0.16, 0.5, 0.84, 0.95]) - - -@image_comparison( - baseline_images=["color"], remove_text=True, extensions=["png"] -) -def test_color(): - _run_corner(color="g") - - -@image_comparison( - baseline_images=["color_filled"], remove_text=True, extensions=["png"] -) -def test_color_filled(): - _run_corner(color="g", fill_contours=True) - - -@image_comparison( - baseline_images=["overplot"], remove_text=True, extensions=["png"] -) -def test_overplot(): - fig = _run_corner(N=15000, color="g", fill_contours=True) - _run_corner( - N=5000, factor=0.5, seed=15, color="b", fig=fig, fill_contours=True - ) - - -@image_comparison( - baseline_images=["smooth1"], remove_text=True, extensions=["png"] -) -def test_smooth1(): - _run_corner(bins=50) - - -@pytest.mark.skipif(not scipy_installed, reason="requires scipy for smoothing") -@image_comparison( - baseline_images=["smooth2"], remove_text=True, extensions=["png"] -) -def test_smooth2(): - _run_corner(bins=50, smooth=1.0) - - -@pytest.mark.skipif(not scipy_installed, reason="requires scipy for smoothing") -@image_comparison( - baseline_images=["smooth1d"], remove_text=True, extensions=["png"] -) -def test_smooth1d(): - _run_corner(bins=50, smooth=1.0, smooth1d=1.0) - - -@image_comparison(baseline_images=["titles1"], extensions=["png"]) -def test_titles1(): - _run_corner(show_titles=True) - - -@image_comparison(baseline_images=["titles2"], extensions=["png"]) -def test_titles2(): - _run_corner(show_titles=True, title_fmt=None, labels=["a", "b", "c"]) - - -@image_comparison( - baseline_images=["top_ticks"], remove_text=True, extensions=["png"] -) -def test_top_ticks(): - _run_corner(top_ticks=True) - - -@pytest.mark.skipif(pd is None, reason="requires pandas") -@image_comparison(baseline_images=["pandas"], extensions=["png"]) -def test_pandas(): - _run_corner(pandas=True) - - -@image_comparison( - baseline_images=["truths"], remove_text=True, extensions=["png"] -) -def test_truths(): - _run_corner(truths=[0.0, None, 0.15]) - - -@image_comparison( - baseline_images=["reverse_truths"], remove_text=True, extensions=["png"] -) -def test_reverse_truths(): - _run_corner(truths=[0.0, None, 0.15], reverse=True) - - -@image_comparison( - baseline_images=["no_fill_contours"], remove_text=True, extensions=["png"] -) -def test_no_fill_contours(): - _run_corner(no_fill_contours=True) - - -@image_comparison( - baseline_images=["tight"], remove_text=True, extensions=["png"] -) -def test_tight(): - _run_corner(ret=True) - pl.tight_layout() - - -@image_comparison( - baseline_images=["reverse"], remove_text=True, extensions=["png"] -) -def test_reverse(): - _run_corner(ndim=2, range=[(4, -4), (-5, 5)]) - - -@image_comparison( - baseline_images=["extended_overplotting"], - remove_text=True, - extensions=["png"], -) -def test_extended_overplotting(): - # Test overplotting a more complex plot - labels = [r"$\theta_1$", r"$\theta_2$", r"$\theta_3$", r"$\theta_4$"] - - figure = _run_corner(ndim=4, reverse=False, labels=labels) - - # Set same results: - ndim, nsamples = 4, 10000 - np.random.seed(1234) - - data1 = np.random.randn(ndim * 4 * nsamples // 5).reshape( - [4 * nsamples // 5, ndim] - ) - mean = 4 * np.random.rand(ndim) - data2 = mean[None, :] + np.random.randn(ndim * nsamples // 5).reshape( - [nsamples // 5, ndim] - ) - samples = np.vstack([data1, data2]) - - value1 = mean - # This is the empirical mean of the sample: - value2 = np.mean(data1, axis=0) - - corner.overplot_lines(figure, value1, color="C1", reverse=False) - corner.overplot_points( - figure, value1[None], marker="s", color="C1", reverse=False - ) - corner.overplot_lines(figure, value2, color="C2", reverse=False) - corner.overplot_points( - figure, value2[None], marker="s", color="C2", reverse=False - ) - - -@image_comparison( - baseline_images=["reverse_overplotting"], - remove_text=True, - extensions=["png"], -) -def test_reverse_overplotting(): - # Test overplotting with a reversed plot - labels = [r"$\theta_1$", r"$\theta_2$", r"$\theta_3$", r"$\theta_4$"] - - figure = _run_corner(ndim=4, reverse=True, labels=labels) - - # Set same results: - ndim, nsamples = 4, 10000 - np.random.seed(1234) - - data1 = np.random.randn(ndim * 4 * nsamples // 5).reshape( - [4 * nsamples // 5, ndim] - ) - mean = 4 * np.random.rand(ndim) - data2 = mean[None, :] + np.random.randn(ndim * nsamples // 5).reshape( - [nsamples // 5, ndim] - ) - samples = np.vstack([data1, data2]) - - value1 = mean - # This is the empirical mean of the sample: - value2 = np.mean(data1, axis=0) - - corner.overplot_lines(figure, value1, color="C1", reverse=True) - corner.overplot_points( - figure, value1[None], marker="s", color="C1", reverse=True - ) - corner.overplot_lines(figure, value2, color="C2", reverse=True) - corner.overplot_points( - figure, value2[None], marker="s", color="C2", reverse=True - ) - - -@image_comparison( - baseline_images=["hist_bin_factor"], remove_text=True, extensions=["png"] -) -def test_hist_bin_factor(): - _run_corner(hist_bin_factor=4) - - -@pytest.mark.skipif(az is None, reason="requires arviz") -@image_comparison(baseline_images=["arviz"], extensions=["png"]) -def test_arviz(): - _run_corner(arviz=True) From 0d37f1c46cad63711a17699fc22d4349e54f8cfc Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 19:51:12 -0400 Subject: [PATCH 2/9] updating --- .copier-answers.yml | 2 +- .pre-commit-config.yaml | 2 +- pyproject.toml | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 39ed302..f98c506 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.0.14-7-ge6351db +_commit: v0.0.14-9-ga1869f9 _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a67191b..0c6e67c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: language: fail files: "\\.rej$" - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: "v4.3.0" hooks: - id: trailing-whitespace - id: end-of-file-fixer diff --git a/pyproject.toml b/pyproject.toml index 83a7db6..56b3159 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,8 +20,15 @@ dependencies = ["matplotlib>=2.1"] "Bug Tracker" = "https://github.com/dfm/corner.py/issues" [project.optional-dependencies] -test = ["pytest"] -docs = ["sphinx>=3.3", "sphinx_book_theme", "myst-nb", "arviz>=0.9"] +test = [ + "pytest", +] +docs = [ + "sphinx>=3.3", + "sphinx_book_theme", + "myst-nb", + "arviz>=0.9" +] arviz = ["arviz>=0.9"] [build-system] From 9719ebe3a25fa8f57f564541d2afb66444e29052 Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 19:52:23 -0400 Subject: [PATCH 3/9] re-adding test corner --- tests/test_corner.py | 308 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 tests/test_corner.py diff --git a/tests/test_corner.py b/tests/test_corner.py new file mode 100644 index 0000000..323212a --- /dev/null +++ b/tests/test_corner.py @@ -0,0 +1,308 @@ +# -*- coding: utf-8 -*- + +from collections import OrderedDict + +import numpy as np +import pytest +from matplotlib import pyplot as pl +from matplotlib.testing.decorators import image_comparison + +import corner + +try: + import arviz as az +except ImportError: + az = None + +try: + import pandas as pd +except ImportError: + pd = None + +try: + import scipy # noqa +except ImportError: + scipy_installed = False +else: + scipy_installed = True + + +def _run_corner( + pandas=False, + arviz=False, + N=10000, + seed=1234, + ndim=3, + factor=None, + **kwargs +): + np.random.seed(seed) + data1 = np.random.randn(ndim * 4 * N // 5).reshape([4 * N // 5, ndim]) + data2 = 5 * np.random.rand(ndim)[None, :] + np.random.randn( + ndim * N // 5 + ).reshape([N // 5, ndim]) + data = np.vstack([data1, data2]) + if factor is not None: + data[:, 0] *= factor + data[:, 1] /= factor + if pandas: + # data = pd.DataFrame.from_items() + data = pd.DataFrame.from_dict( + OrderedDict(zip(map("d{0}".format, range(ndim)), data.T)) + ) + elif arviz: + data = az.from_dict( + posterior={"x": data[None]}, + sample_stats={"diverging": data[None, :, 0] < 0.0}, + ) + kwargs["truths"] = {"x": np.random.randn(ndim)} + + fig = corner.corner(data, **kwargs) + return fig + + +@image_comparison( + baseline_images=["basic"], remove_text=True, extensions=["png"] +) +def test_basic(): + _run_corner() + + +@image_comparison(baseline_images=["labels"], extensions=["png"]) +def test_labels(): + _run_corner(labels=["a", "b", "c"]) + + +@image_comparison( + baseline_images=["quantiles"], remove_text=True, extensions=["png"] +) +def test_quantiles(): + _run_corner(quantiles=[0.16, 0.5, 0.84]) + + +@image_comparison( + baseline_images=["title_quantiles"], remove_text=False, extensions=["png"] +) +def test_title_quantiles(): + _run_corner( + quantiles=[0.16, 0.5, 0.84], + title_quantiles=[0.05, 0.5, 0.95], + show_titles=True, + ) + + +@image_comparison( + baseline_images=["title_quantiles_default"], + remove_text=False, + extensions=["png"], +) +def test_title_quantiles_default(): + _run_corner(quantiles=[0.16, 0.5, 0.84], show_titles=True) + + +@image_comparison( + baseline_images=["title_quantiles_raises"], + remove_text=False, + extensions=["png"], +) +def test_title_quantiles_raises(): + with pytest.raises(ValueError): + _run_corner(quantiles=[0.05, 0.16, 0.5, 0.84, 0.95], show_titles=True) + + # This one shouldn't raise since show_titles isn't provided + _run_corner(quantiles=[0.05, 0.16, 0.5, 0.84, 0.95]) + + +@image_comparison( + baseline_images=["color"], remove_text=True, extensions=["png"] +) +def test_color(): + _run_corner(color="g") + + +@image_comparison( + baseline_images=["color_filled"], remove_text=True, extensions=["png"] +) +def test_color_filled(): + _run_corner(color="g", fill_contours=True) + + +@image_comparison( + baseline_images=["overplot"], remove_text=True, extensions=["png"] +) +def test_overplot(): + fig = _run_corner(N=15000, color="g", fill_contours=True) + _run_corner( + N=5000, factor=0.5, seed=15, color="b", fig=fig, fill_contours=True + ) + + +@image_comparison( + baseline_images=["smooth1"], remove_text=True, extensions=["png"] +) +def test_smooth1(): + _run_corner(bins=50) + + +@pytest.mark.skipif(not scipy_installed, reason="requires scipy for smoothing") +@image_comparison( + baseline_images=["smooth2"], remove_text=True, extensions=["png"] +) +def test_smooth2(): + _run_corner(bins=50, smooth=1.0) + + +@pytest.mark.skipif(not scipy_installed, reason="requires scipy for smoothing") +@image_comparison( + baseline_images=["smooth1d"], remove_text=True, extensions=["png"] +) +def test_smooth1d(): + _run_corner(bins=50, smooth=1.0, smooth1d=1.0) + + +@image_comparison(baseline_images=["titles1"], extensions=["png"]) +def test_titles1(): + _run_corner(show_titles=True) + + +@image_comparison(baseline_images=["titles2"], extensions=["png"]) +def test_titles2(): + _run_corner(show_titles=True, title_fmt=None, labels=["a", "b", "c"]) + + +@image_comparison( + baseline_images=["top_ticks"], remove_text=True, extensions=["png"] +) +def test_top_ticks(): + _run_corner(top_ticks=True) + + +@pytest.mark.skipif(pd is None, reason="requires pandas") +@image_comparison(baseline_images=["pandas"], extensions=["png"]) +def test_pandas(): + _run_corner(pandas=True) + + +@image_comparison( + baseline_images=["truths"], remove_text=True, extensions=["png"] +) +def test_truths(): + _run_corner(truths=[0.0, None, 0.15]) + + +@image_comparison( + baseline_images=["reverse_truths"], remove_text=True, extensions=["png"] +) +def test_reverse_truths(): + _run_corner(truths=[0.0, None, 0.15], reverse=True) + + +@image_comparison( + baseline_images=["no_fill_contours"], remove_text=True, extensions=["png"] +) +def test_no_fill_contours(): + _run_corner(no_fill_contours=True) + + +@image_comparison( + baseline_images=["tight"], remove_text=True, extensions=["png"] +) +def test_tight(): + _run_corner(ret=True) + pl.tight_layout() + + +@image_comparison( + baseline_images=["reverse"], remove_text=True, extensions=["png"] +) +def test_reverse(): + _run_corner(ndim=2, range=[(4, -4), (-5, 5)]) + + +@image_comparison( + baseline_images=["extended_overplotting"], + remove_text=True, + extensions=["png"], +) +def test_extended_overplotting(): + # Test overplotting a more complex plot + labels = [r"$\theta_1$", r"$\theta_2$", r"$\theta_3$", r"$\theta_4$"] + + figure = _run_corner(ndim=4, reverse=False, labels=labels) + + # Set same results: + ndim, nsamples = 4, 10000 + np.random.seed(1234) + + data1 = np.random.randn(ndim * 4 * nsamples // 5).reshape( + [4 * nsamples // 5, ndim] + ) + mean = 4 * np.random.rand(ndim) + data2 = mean[None, :] + np.random.randn(ndim * nsamples // 5).reshape( + [nsamples // 5, ndim] + ) + samples = np.vstack([data1, data2]) + + value1 = mean + # This is the empirical mean of the sample: + value2 = np.mean(data1, axis=0) + + corner.overplot_lines(figure, value1, color="C1", reverse=False) + corner.overplot_points( + figure, value1[None], marker="s", color="C1", reverse=False + ) + corner.overplot_lines(figure, value2, color="C2", reverse=False) + corner.overplot_points( + figure, value2[None], marker="s", color="C2", reverse=False + ) + + +@image_comparison( + baseline_images=["reverse_overplotting"], + remove_text=True, + extensions=["png"], +) +def test_reverse_overplotting(): + # Test overplotting with a reversed plot + labels = [r"$\theta_1$", r"$\theta_2$", r"$\theta_3$", r"$\theta_4$"] + + figure = _run_corner(ndim=4, reverse=True, labels=labels) + + # Set same results: + ndim, nsamples = 4, 10000 + np.random.seed(1234) + + data1 = np.random.randn(ndim * 4 * nsamples // 5).reshape( + [4 * nsamples // 5, ndim] + ) + mean = 4 * np.random.rand(ndim) + data2 = mean[None, :] + np.random.randn(ndim * nsamples // 5).reshape( + [nsamples // 5, ndim] + ) + samples = np.vstack([data1, data2]) + + value1 = mean + # This is the empirical mean of the sample: + value2 = np.mean(data1, axis=0) + + corner.overplot_lines(figure, value1, color="C1", reverse=True) + corner.overplot_points( + figure, value1[None], marker="s", color="C1", reverse=True + ) + corner.overplot_lines(figure, value2, color="C2", reverse=True) + corner.overplot_points( + figure, value2[None], marker="s", color="C2", reverse=True + ) + + +@image_comparison( + baseline_images=["hist_bin_factor"], remove_text=True, extensions=["png"] +) +def test_hist_bin_factor(): + _run_corner(hist_bin_factor=4) + + +@pytest.mark.skipif(az is None, reason="requires arviz") +@image_comparison(baseline_images=["arviz"], extensions=["png"]) +def test_arviz(): + _run_corner(arviz=True) From 4c226e4a43b35d5bb3150a0eb7f7142d470a68be Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 19:58:43 -0400 Subject: [PATCH 4/9] update --- .copier-answers.yml | 4 ++-- pyproject.toml | 2 +- tests/.gitkeep | 0 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 tests/.gitkeep diff --git a/.copier-answers.yml b/.copier-answers.yml index f98c506..f536fc4 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.0.14-9-ga1869f9 +_commit: v0.0.14-10-g9d9af6a _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey @@ -31,7 +31,7 @@ python_min_version: 7 python_nox_sessions: '"tests"' python_package_distribution_name: corner python_package_import_name: corner -python_test_dependencies: '' +python_test_dependencies: '"arviz>=0.9"' readthedocs_project_name: corner repository_name: corner.py repository_namespace: dfm diff --git a/pyproject.toml b/pyproject.toml index 56b3159..c80fc6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dependencies = ["matplotlib>=2.1"] [project.optional-dependencies] test = [ - "pytest", + "pytest", "arviz>=0.9" ] docs = [ "sphinx>=3.3", diff --git a/tests/.gitkeep b/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 From 2fc0b55ffed3d4eec5fd8501977ad07ebb8f54f1 Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 20:20:39 -0400 Subject: [PATCH 5/9] update --- .copier-answers.yml | 2 +- pyproject.toml | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index f536fc4..75a3a65 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.0.14-10-g9d9af6a +_commit: v0.0.14-11-g238e35a _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey diff --git a/pyproject.toml b/pyproject.toml index c80fc6c..4e8d760 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,15 +20,8 @@ dependencies = ["matplotlib>=2.1"] "Bug Tracker" = "https://github.com/dfm/corner.py/issues" [project.optional-dependencies] -test = [ - "pytest", "arviz>=0.9" -] -docs = [ - "sphinx>=3.3", - "sphinx_book_theme", - "myst-nb", - "arviz>=0.9" -] +test = ["pytest", "arviz>=0.9"] +docs = ["sphinx>=3.3", "sphinx_book_theme", "myst-nb", "arviz>=0.9"] arviz = ["arviz>=0.9"] [build-system] @@ -54,7 +47,12 @@ known_first_party = ["corner"] parallel = true branch = true source = ["corner"] -omit = ["docs/*", "tests/*", "*/corner/version.py"] +omit = [ + "docs/*", + "tests/*", + "*/corner/version.py", +] +arviz = ["arviz>=0.9"] [tool.coverage.paths] source = ["src", "*/site-packages"] From 5dcee0ab3df82d58cc8d44c249912b5eeb658c5f Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 20:22:00 -0400 Subject: [PATCH 6/9] update --- .copier-answers.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 75a3a65..0812f8d 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.0.14-11-g238e35a +_commit: v0.0.14-12-gc3c7d8e _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey @@ -29,6 +29,7 @@ python_formal_min_version: 6 python_max_version: 10 python_min_version: 7 python_nox_sessions: '"tests"' +python_optional_dependencies: arviz = ["arviz>=0.9"] python_package_distribution_name: corner python_package_import_name: corner python_test_dependencies: '"arviz>=0.9"' From a5d3f03740955387379629b4189de26353ca1111 Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Sun, 4 Sep 2022 20:26:24 -0400 Subject: [PATCH 7/9] remove font info --- docs/pages/matplotlibrc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/pages/matplotlibrc b/docs/pages/matplotlibrc index c06e600..bbed886 100644 --- a/docs/pages/matplotlibrc +++ b/docs/pages/matplotlibrc @@ -1,7 +1,3 @@ savefig.dpi: 100 figure.dpi: 100 font.size: 14 -font.family: sans-serif -font.sans-serif: Liberation Sans -font.cursive: Liberation Sans -mathtext.fontset: custom From cc8604c736c5887984328c6dace21f6186ce8770 Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Mon, 5 Sep 2022 07:46:30 -0400 Subject: [PATCH 8/9] fonts again --- docs/pages/matplotlibrc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/pages/matplotlibrc b/docs/pages/matplotlibrc index bbed886..c06e600 100644 --- a/docs/pages/matplotlibrc +++ b/docs/pages/matplotlibrc @@ -1,3 +1,7 @@ savefig.dpi: 100 figure.dpi: 100 font.size: 14 +font.family: sans-serif +font.sans-serif: Liberation Sans +font.cursive: Liberation Sans +mathtext.fontset: custom From abe46b16dfd60668d4536e8d2599cdda8882ebeb Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Mon, 5 Sep 2022 07:47:40 -0400 Subject: [PATCH 9/9] adding fonts back in --- .copier-answers.yml | 2 +- readthedocs.yaml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 0812f8d..d8b012d 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.0.14-12-gc3c7d8e +_commit: v0.0.14-13-g199528f _src_path: gh:dfm/copier-python author_email: foreman.mackey@gmail.com author_fullname: Dan Foreman-Mackey diff --git a/readthedocs.yaml b/readthedocs.yaml index b59224b..f9dbdd9 100644 --- a/readthedocs.yaml +++ b/readthedocs.yaml @@ -5,6 +5,8 @@ submodules: build: os: ubuntu-20.04 + apt_packages: + - fonts-liberation tools: python: "3.10"