diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..ae81ef3 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include tests/test_data/ +include tests/test_data/* diff --git a/README.md b/README.md deleted file mode 100644 index 1398797..0000000 --- a/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# dataprob - -Library for calculating the probability of data (the likelihood) to extract -parameter estimates for models describing experimental data. Can do maximum -likelihood, bootstrap, and Bayesian sampling using a consistent API. - -Docs in progress. See `tests/examples/example-fit.ipynb` for basic demonstration -of the API. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..e34cf43 --- /dev/null +++ b/README.rst @@ -0,0 +1,118 @@ +======== +dataprob +======== + +.. image:: docs/badges/tests-badge.svg + +.. image:: docs/badges/coverage-badge.svg + + +dataprob was designed to allow experimentalists to fit parameters from arbitrary +models to experimental data. + ++ **ease of use:** Users write a python function that describes their model, + then load in their experimental data as a dataframe. A full analysis can + be run with two python commands. ++ **dataframe centric:** Users use a dataframe to specify parameter bounds, + guesses, fixedness, and priors. Observed data can be passed in as a + dataframe or numpy vector. All outputs are simple pandas dataframes. ++ **consistent experience:** Users can run maximum-likelihood, bootstrap + resampling, or Bayesian MCMC analyses with an identical interface and nearly + identical diagnostic outputs. ++ **interpretable:** Provides simple diagnostic plots and runs tests assessing + fit results, flagging problems with residuals and co-varying parameters. + +Simple example +============== + +The following code generates noisy linear data and uses dataprob to find +the maximum likelihood estimate of its slope and intercept. + +.. code-block:: python + + import dataprob + import numpy as np + + # Generate "experimental" linear data (slope = 5, intercept = 5.7) that has + # random noise on each point. + x_array = np.linspace(0,10,25) + noise = np.random.normal(loc=0,scale=0.5,size=x_array.shape) + y_obs = 5*x_array + 5.7 + noise + + # 1. Define a linear model + def linear_model(m=1,b=1,x=[]): + return m*x + b + + # 2. Set up the analysis. 'method' can be "ml", "mcmc", or "bootstrap" + f = dataprob.setup(linear_model, + method="ml", + non_fit_kwargs={"x":x_array}) + + # 3. Fit the parameters of linear_model model to y_obs, assuming uncertainty + # of 0.5 on each observed point. + f.fit(y_obs=y_obs, + y_std=0.5) + + # 4. Access results + print(f.fit_df) + fig = dataprob.plot_summary(f) + fig = dataprob.plot_corner(f) + +The ``f.fit_df`` dataframe will look something like: + ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| index | name | estimate | std | low_95 | high_95 | ... | prior_std | ++=======+=======+==========+=======+========+=========+=======+===========+ +| ``m`` | ``m`` | 5.009 | 0.045 | 4.817 | 5.202 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| ``b`` | ``b`` | 5.644 | 0.274 | 4.465 | 6.822 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ + +The plots will be: + +.. image:: docs/source/_static/simple-example_plot-summary.svg + +.. image:: docs/source/_static/simple-example_plot-corner.svg + +Installation +============ + +We recommend installing dataprob with pip: + +.. code-block:: bash + + pip install dataprob + +To install from source and run tests: + +.. code-block:: bash + + git clone https://github.com/harmslab/dataprob.git + cd dataprob + pip install . + + # to run test-suite + pytest --runslow + +Examples +======== + +A good way to learn how to use the library is by working through examples. The +following notebooks are included in the `dataprob/examples/` directory. They are +self-contained demonstrations in which dataprob is used to analyze various +classes of experimental data. The links below launch each notebook in Google +colab: + ++ `linear.ipynb `_: fit a linear model to noisy data (2 parameter, linear) ++ `binding.ipynb `_: a single-site binding interaction (2 parameter, sigmoidal curve) ++ `michaelis-menten.ipynb `_: Michaelis-Menten model of enzyme kinetics (2 parameter, sigmoidal curve) ++ `lagged-exponential.ipynb `_: bacterial growth curve with initial lag phase (3 parameter, exponential) ++ `multi-gaussian.ipynb `_: two overlapping normal distributions (6 parameter, Gaussian) ++ `periodic.ipynb `_: periodic data (3 parameter, sine) ++ `polynomial.ipynb `_: nonlinear data with no obvious form (5 parameter, polynomial) ++ `linear-extrapolation-folding.ipynb `_: protein equilibrium unfolding data (6 parameter, linear embedded in sigmoidal) + +Documentation +============= + +Full documentation is on `readthedocs `_. diff --git a/docs/Makefile b/docs/Makefile index d4bb2cb..d0c3cbf 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -5,8 +5,8 @@ # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build +SOURCEDIR = source +BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 3f33e09..6a4e15a 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 90.55%coverage90.55% \ No newline at end of file +coverage: 100.00%coverage100.00% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 819e499..0c68c6e 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 64tests64 \ No newline at end of file +tests: 132tests132 \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index dc39447..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,55 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = 'dataprob' -copyright = '2020, Michael J. Harms' -author = 'Michael J. Harms' - -# The full version, including alpha/beta/rc tags -release = '0.1' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index ae20f4a..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. dataprob documentation master file, created by - sphinx-quickstart on Fri Apr 17 15:49:02 2020. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to dataprob's documentation! -==================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - -If you set ModelWrapper.K1.name == "test", it changes the name of the parameter -in the underlying FitParameter and output, but *not* in the ModelWrapper. - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/make.bat b/docs/make.bat index 2119f51..747ffb7 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -7,10 +7,8 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help +set SOURCEDIR=source +set BUILDDIR=build %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( @@ -21,10 +19,12 @@ if errorlevel 9009 ( echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ + echo.https://www.sphinx-doc.org/ exit /b 1 ) +if "%1" == "" goto help + %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end diff --git a/docs/source/_static/badges/coverage-badge.svg b/docs/source/_static/badges/coverage-badge.svg new file mode 100644 index 0000000..6a4e15a --- /dev/null +++ b/docs/source/_static/badges/coverage-badge.svg @@ -0,0 +1 @@ +coverage: 100.00%coverage100.00% \ No newline at end of file diff --git a/docs/source/_static/badges/tests-badge.svg b/docs/source/_static/badges/tests-badge.svg new file mode 100644 index 0000000..0c68c6e --- /dev/null +++ b/docs/source/_static/badges/tests-badge.svg @@ -0,0 +1 @@ +tests: 132tests132 \ No newline at end of file diff --git a/docs/source/_static/sample-comparisons/bootstrap.svg b/docs/source/_static/sample-comparisons/bootstrap.svg new file mode 100644 index 0000000..e3abc45 --- /dev/null +++ b/docs/source/_static/sample-comparisons/bootstrap.svg @@ -0,0 +1,15540 @@ + + + + + + + + 2024-08-20T20:50:41.342484 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/bootstrap_corner.svg b/docs/source/_static/sample-comparisons/bootstrap_corner.svg new file mode 100644 index 0000000..a67b20c --- /dev/null +++ b/docs/source/_static/sample-comparisons/bootstrap_corner.svg @@ -0,0 +1,4202 @@ + + + + + + + + 2024-08-20T20:50:50.721704 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/mcmc.svg b/docs/source/_static/sample-comparisons/mcmc.svg new file mode 100644 index 0000000..81798a8 --- /dev/null +++ b/docs/source/_static/sample-comparisons/mcmc.svg @@ -0,0 +1,15540 @@ + + + + + + + + 2024-08-20T20:47:39.000584 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/mcmc_corner.svg b/docs/source/_static/sample-comparisons/mcmc_corner.svg new file mode 100644 index 0000000..7127ac8 --- /dev/null +++ b/docs/source/_static/sample-comparisons/mcmc_corner.svg @@ -0,0 +1,4210 @@ + + + + + + + + 2024-08-20T20:47:43.078747 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/ml.svg b/docs/source/_static/sample-comparisons/ml.svg new file mode 100644 index 0000000..2a88654 --- /dev/null +++ b/docs/source/_static/sample-comparisons/ml.svg @@ -0,0 +1,15540 @@ + + + + + + + + 2024-08-20T20:42:56.148097 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/ml_corner-no-filter.svg b/docs/source/_static/sample-comparisons/ml_corner-no-filter.svg new file mode 100644 index 0000000..55a36a4 --- /dev/null +++ b/docs/source/_static/sample-comparisons/ml_corner-no-filter.svg @@ -0,0 +1,52350 @@ + + + + + + + + 2024-08-27T12:09:27.212229 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/sample-comparisons/ml_corner.svg b/docs/source/_static/sample-comparisons/ml_corner.svg new file mode 100644 index 0000000..dfa8cb0 --- /dev/null +++ b/docs/source/_static/sample-comparisons/ml_corner.svg @@ -0,0 +1,4170 @@ + + + + + + + + 2024-08-20T20:43:26.761622 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/simple-example_plot-corner.svg b/docs/source/_static/simple-example_plot-corner.svg new file mode 100644 index 0000000..b4604a2 --- /dev/null +++ b/docs/source/_static/simple-example_plot-corner.svg @@ -0,0 +1,3979 @@ + + + + + + + + 2024-08-20T07:02:50.183707 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/simple-example_plot-summary.svg b/docs/source/_static/simple-example_plot-summary.svg new file mode 100644 index 0000000..5fcbb54 --- /dev/null +++ b/docs/source/_static/simple-example_plot-summary.svg @@ -0,0 +1,8473 @@ + + + + + + + + 2024-08-20T07:02:50.089487 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..b1de0d7 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'dataprob' +copyright = '2024, Michael J. Harms' +author = 'Michael J. Harms' +release = '0.9.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'pydata_sphinx_theme' +html_static_path = ['_static'] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..1e97ae0 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,1122 @@ +.. dataprob documentation master file, created by + sphinx-quickstart on Tue Aug 20 16:28:23 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. include:: links.rst + +====================== +dataprob documentation +====================== + +dataprob was designed to allow experimentalists to fit parameters from arbitrary +models to experimental data. + ++ **ease of use:** Users write a python function that describes their model, + then load in their experimental data as a dataframe. A full analysis can + be run with two python commands. ++ **dataframe centric:** Users use a dataframe to specify parameter bounds, + guesses, fixedness, and priors. Observed data can be passed in as a + dataframe or numpy vector. All outputs are simple pandas dataframes. ++ **consistent experience:** Users can run maximum-likelihood, bootstrap + resampling, or Bayesian MCMC analyses with an identical interface and nearly + identical diagnostic outputs. ++ **interpretable:** Provides simple diagnostic plots and runs tests assessing + fit results, flagging problems with residuals and co-varying parameters. + +Simple example +============== + +The following code generates noisy linear data and uses dataprob to find +the maximum likelihood estimate of its slope and intercept. + +.. code-block:: python + + import dataprob + import numpy as np + + # Generate "experimental" linear data (slope = 5, intercept = 5.7) that has + # random noise on each point. + x_array = np.linspace(0,10,25) + noise = np.random.normal(loc=0,scale=0.5,size=x_array.shape) + y_obs = 5*x_array + 5.7 + noise + + # 1. Define a linear model + def linear_model(m=1,b=1,x=[]): + return m*x + b + + # 2. Set up the analysis. 'method' can be "ml", "mcmc", or "bootstrap" + f = dataprob.setup(linear_model, + method="ml", + non_fit_kwargs={"x":x_array}) + + # 3. Fit the parameters of linear_model model to y_obs, assuming uncertainty + # of 0.5 on each observed point. + f.fit(y_obs=y_obs, + y_std=0.5) + + # 4. Access results + print(f.fit_df) + fig = dataprob.plot_summary(f) + fig = dataprob.plot_corner(f) + +The ``f.fit_df`` dataframe will look something like: + ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| index | name | estimate | std | low_95 | high_95 | ... | prior_std | ++=======+=======+==========+=======+========+=========+=======+===========+ +| ``m`` | ``m`` | 5.009 | 0.045 | 4.817 | 5.202 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| ``b`` | ``b`` | 5.644 | 0.274 | 4.465 | 6.822 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ + +The plots will be: + +.. image:: _static/simple-example_plot-summary.svg + :align: center + :alt: data.plot_summary result + :width: 50% + +.. image:: _static/simple-example_plot-corner.svg + :align: center + :alt: data.plot_corner result + :width: 50% + + +Installation +============ + +We recommend installing dataprob with pip: + +.. code-block:: shell + + pip install dataprob + +To install from source and run tests: + +.. code-block:: shell + + git clone https://github.com/harmslab/dataprob.git + cd dataprob + pip install . + + # to run test-suite + pytest --runslow + +Examples +======== + +A good way to learn how to use the library is by working through examples. The +following notebooks are included in the `dataprob/examples/` directory. They are +self-contained demonstrations in which dataprob is used to analyze various +classes of experimental data. The links below launch each notebook in Google +colab: + ++ `linear.ipynb `_: fit a linear model to noisy data (2 parameter, linear) ++ `binding.ipynb `_: a single-site binding interaction (2 parameter, sigmoidal curve) ++ `michaelis-menten.ipynb `_: Michaelis-Menten model of enzyme kinetics (2 parameter, sigmoidal curve) ++ `lagged-exponential.ipynb `_: bacterial growth curve with initial lag phase (3 parameter, exponential) ++ `multi-gaussian.ipynb `_: two overlapping normal distributions (6 parameter, Gaussian) ++ `periodic.ipynb `_: periodic data (3 parameter, sine) ++ `polynomial.ipynb `_: nonlinear data with no obvious form (5 parameter, polynomial) ++ `linear-extrapolation-folding.ipynb `_: protein equilibrium unfolding data (6 parameter, linear embedded in sigmoidal) + + +Set up an analysis +================== + +------------- +Write a model +------------- + +The first step is to define a function that we think can reproduce our +observations given some set of parameters. ``dataprob`` will find the values of +`float `_ parameters passed to the function that reproduce our +observations. Such a function must meet two criteria: + ++ The function must take at least one float argument somewhere in its + definition OR a numpy array of floats as its first argument. These arguments + are the parameters that will be estimated. + ++ The function must return a numpy array the same length as the numpy array of + observations. + +For example, the function ``good_model`` below takes the arguments ``m``, ``b``, +and ``x``. If we pass in an array with 10 ``x`` values, it will return an array +an output array with 10 values. We can thus use it to reproduce the 10 +observations in ``y_obs``. + +.. code-block:: python + + # define a model + def good_model(m,b,x): + return m*x + b + + # Array of x from 0->9 + x_input = np.arange(10) + x_input.shape # --> (10,) + + # y_calc has a line with a slope of 1 and an intercept of 2 calculated at + # x from 0 to 9 + y_calc = good_model(m=1,b=2,x=x_input) + y_calc.shape # --> (10,) + + # y_obs is a line with a slope of 5 and an intercept of 2 observed at x + # from 0 to 9 + y_obs = x_input*5 + 2 + y_obs.shape # --> (10,) + +Aside from the requirements to have float parameters and return a numpy array of +the correct size, dataprob places no other limits on the input function. It can +be a standard function, class method, or any other python object with a +``__call__`` attribute. The next section describes how to select which +parameters of the input function should be used in the statistical analysis. + +---------------- +Set up the model +---------------- + +We set up the analysis by calling ``dataprob.setup`` on the function we will +use to model our experimental data. This returns a ``Fitter`` object. (We will +call this object ``f`` in this and all following examples.) ``dataprob.setup`` +semi-intelligently guesses which parameters should be fittable. By default, it +treats the first ``n`` arguments of the input function whose default is a +``float`` or ``None`` as fittable parameters. All remaining arguments are +treated as non-fittable. For example, in the following code block +``dataprob.setup`` identifies ``a`` and ``b`` as fit parameters, but not +``square``. + +.. code-block:: python + + def some_fcn(a,b=2,square=False): + if square is True: + return a**2 + b + else: + return a + b + + f = dataprob.setup(some_fcn) + print(f.param_df["name"]) # -> ["a","b"] + + +One can change this behavior using the ``fit_parameters``, ``non_fit_kwargs`` +and ``vector_first_arg`` arguments to ``dataprob.setup``. A few patterns +demonstrate how this works. + +.. code-block:: python + + # A function we wish to analyze + def some_fcn(a=1,b=2,c=3): + return a*b*c + + # a, b, and c are fit parameters with guesses of 1, 2, and 3, taken from + # their argument defaults. + f = dataprob.setup(some_fcn) + + # b and c are fit parameters with guesses of 2 and 3; a is a fixed + # non-fittable parameter with value 1 + f = dataprob.setup(some_fcn, + fit_parameters=["b","c"]) + + # a and c are fit parameters with guesses of 1 and 3; b is a non-fittable + # parameter with a value of np.arange(20) + f = dataprob.setup(some_fcn, + non_fit_kwargs={"b":np.arange(20)}) + + # a and c are fit parameters with guesses of 14 and 7; b in a non-fittable + # parameter with a value of np.arange(20) + f = dataprob.setup(some_fcn, + fit_parameters={"a":14,"c":7}, + non_fit_kwargs={"b":np.arange(20)}) + +The ``vector_first_arg`` argument enables one to use a function where the first +argument is an array of parameters. This allows for computationally efficient +models that deal exclusively in numpy arrays. Note that a ``fit_parameters`` +argument is required if ``vector_first_arg == True``. Here is an example: + +.. code-block:: python + + def some_fcn(a,b=2,c=3): + return a*b*c + + # Treat "a" as a vector there than a single parameter. This vector is built + # from parameters w, x, y, and z. (Assigned default guesses of 0). b and c + # are fixed non-fittable parameters with values of 2 and 3. + f = dataprob.setup(some_fcn, + vector_first_arg=True, + fit_parameters=["w","x","y","z"]) + + # When running the analysis, dataprob will do the following under the hood. + y_calc = some_fcn(a=np.array([w,x,y,z]),b=2,c=3) + +One can even more precisely define information about the fittable parameters. +For a full description, see the `Advanced Model Definitions`_ section. + +---------------------------- +Customize the fit parameters +---------------------------- + +Each fit parameter has seven attributes. These are stored in ``f.param_df`` +dataframe. Each row is a parameter; each column is an attribute. + +.. code-block:: python + + def some_fcn(a,b=2,c=3): + return a*b*c + + f = dataprob.setup(some_fcn) + + f.param_df + ++-------+-------+-----------+-------------+-------------+------------+-----------+ +| name | guess | fixed | lower_bound | upper_bound | prior_mean | prior_std | ++=======+=======+===========+=============+=============+============+===========+ +| ``a`` | 0.0 | ``False`` | ``-inf`` | ``inf`` | ``NaN`` | ``NaN`` | ++-------+-------+-----------+-------------+-------------+------------+-----------+ +| ``b`` | 2.0 | ``False`` | ``-inf`` | ``inf`` | ``NaN`` | ``NaN`` | ++-------+-------+-----------+-------------+-------------+------------+-----------+ +| ``c`` | 3.0 | ``False`` | ``-inf`` | ``inf`` | ``NaN`` | ``NaN`` | ++-------+-------+-----------+-------------+-------------+------------+-----------+ + +The ``f.param_df`` dataframe can be accessed and edited using standard +`pandas DataFrame `_ commands. The ``name`` column is set +when the dataframe is initialized and cannot be changed. The ``name`` column is +used as the index for the dataframe, allowing commands like the following, which +sets the ``guess`` of parameter ``a`` to 10.0: + +.. code-block:: python + + # set the guess of parameter a to 10.0. + f.param_df.loc["a","guess"] = 10.0 + +One can also edit the dataframe en masse and load in directly: + +.. code-block:: python + + df = f.param_df.copy() + + # do lots of edits to dataframe + # ... + # ... + # then: + + f.param_df = df + +One can even load ``param_df`` directly from a spreadsheet. + +.. code-block:: python + + f.param_df.to_excel("my-parameters.xlsx") + + # edit my-parameters.xslx in excel. + + f.param_df = "my-parameters.xslx" + +The full rules for the parameter dataframe are: + ++-----------------+---------------------------------------------------------+ +| key | value | ++=================+=========================================================+ +| ``name`` | string name of the parameter. should not be changed | +| | by the user once fitter is initialized. | ++-----------------+---------------------------------------------------------+ +| ``guess`` | guess as single float value (must be non-nan and | +| | within bounds if specified) | ++-----------------+---------------------------------------------------------+ +| ``fixed`` | whether or not parameter can vary. ``True`` or ``False``| ++-----------------+---------------------------------------------------------+ +| ``lower_bound`` | single float value; ``-np.inf`` allowed; ``None``, | +| | ``np.nan``, or ``pd.NA`` interpreted as ``-np.inf``. | ++-----------------+---------------------------------------------------------+ +| ``upper_bound`` | single float value; ``np.inf`` allowed; ``None``, | +| | ``np.nan``, or ``pd.NA`` interpreted as ``np.inf``. | ++-----------------+---------------------------------------------------------+ +| ``prior_mean`` | single float value; ``np.nan`` allowed (see note) | ++-----------------+---------------------------------------------------------+ +| ``prior_std`` | single float value; ``np.nan`` allowed (see note) | ++-----------------+---------------------------------------------------------+ + +.. note:: + + An MCMC analysis requires prior distributions for each parameter. These are + specified using the ``prior_mean`` and ``prior_std`` columns. Together, + these define a Gaussian prior with a mean of ``prior_mean`` and a standard + deviation of ``prior_std``. Because they are specifying a Gaussian + distribution, neither value can be ``np.inf`` and ``prior_std`` must be + greater than zero. If both a Gaussian prior and bounds are defined, the + Gaussian distribution is trimmed and re-normalized so its probability + density function sums to one between the bounds. To uses uniform priors + between the bounds, set both ``prior_mean`` and ``prior_std`` to ``np.nan``. + +-------------------------- +Set non-fittable arguments +-------------------------- + +One can specify arguments that should not be used as fit parameters using +the ``non_fit_kwargs`` dictionary. This can be passed as an argument to +``dataprob.setup``. Unless the function has a ``**kwargs`` argument, all keys +must correspond to function arguments. dataprob puts no constraint on the +values in ``non_fit_kwargs``. The ``non_fit_kwargs`` dictionary can be accessed +and edited after initialization; it is exposed as an attribute to the ``Fitter`` +class that is returned by ``dataprob.setup``. In the following example, we +initially set the value of ``square`` to be ``True``, then update that to +be ``False``. + +.. code-block:: python + + def some_fcn(a,b=2,square=False): + if square is True: + return (a*b)**2 + else: + return (a*b) + + # Initially set square to True + f = dataprob.setup(some_fcn, + non_fit_kwargs={"square":True}) + + # Oops, changed our mind. Set back to False + f.non_fit_kwargs["square"] = False + +Run an Analysis +=============== + +------------------------- +Select an analysis method +------------------------- + +Dataprob has three analysis methods to estimate parameter values. These are +selected via the ``method`` argument to ``dataprob.setup``: +:code:`f = setup(some_fcn,method="ml")`. If no method is specified, the ``ml`` +method will be used. The available methods are: + ++ **ml** (default). Do a maximum likelihood (i.e. least-squares) fit, regressing + model parameters against observed data. It finds the parameters that minimize + the weighted residual function. + ++ **bootstrap**: Estimate parameter distributions consistent with observed data + by sampling observation uncertainty, then finding maximum likelihood + parameter estimates for each pseudo-replicate dataset. + ++ **mcmc**: Use Markov-Chain Monte Carlo sampling to estimate the posterior + distributions of model parameters. By default, the analysis uses uniform + priors; however, the user can also specify Gaussian priors. + +------------------------------- +Specify ``y_obs`` and ``y_std`` +------------------------------- + +All analyses require the user specify a vector of observations (``y_obs``) and +a vector of standard deviations on the value of each observation (``y_std``). +The software will estimate model parameters that reproduce the observations in +``y_obs``, weighted by the confidence in each observation encoded by +``y_std``. ``y_obs`` and ``y_std`` must be non-nan float values. Further, all +values in ``y_std`` must be larger than zero. + +The analysis makes several assumptions about ``y_obs`` and ``y_std``. + ++ The error of the independent variable is negligible. For example, if you were + to measure the progress of a chemical reaction over time, this software + assumes no error in your time measurement. ++ The uncertainty for each observation value is normally distributed, with a + standard deviation of ``y_std``. ++ The errors in each observation are independent. + +.. note:: + + dataprob assumes the ``y_std`` are `population standard deviations `_, + not sample standard deviations. We therefore recommend that users + calculate ``y_std`` as: + + .. math:: + + \sigma = \sqrt{ \frac{1}{N-1} \sum_{i=0}^{i < N-1} \left ( x_{i} - \mu \right )^2} + + where :math:`N` is the number of replicates for a given observation and + :math:`\mu` is the mean of the replicates. + +.. note:: + + A typical way to estimate ``y_std`` is via technical replicates on each + observed point. Sometimes this is not possible. In this case, one can + declare a global ``y_std`` for all points based on an overall estimate of + observation precision. For example, one might take the standard deviation of + points from a flat experimental baseline and use that as the value for + ``y_std`` on all points. One could even "make up" a value that "seems + plausible" given the instrument set up and collected data. If one uses the + same ``y_std`` for all points, the chosen value will not alter the parameter + estimates, but it will directly impacts the final parameter estimate + uncertainty. We thus recommend being conservative and assuming your error is + on the large side of plausible. **If you underestimate y_std, + you overestimate parameter precision!!!** + +``y_obs`` and ``y_std`` can be passed to the program in two different ways. +The first is via ``f.fit``: + +.. code-block:: python + + def some_fcn(a,b=2,c=3): + return a*b*c + + f = dataprob.setup(some_fcn) + + f.fit(y_obs=y_obs, + y_std=y_std) + +The ``f.fit`` call also allows the user to specify a single, global ``y_std`` to +use for all parameters: + +.. code-block:: python + + def some_fcn(a,b=2,c=3): + return a*b*c + + f = dataprob.setup(some_fcn) + + # apply uncertainty of 0.1 to all observations + f.fit(y_obs=y_obs, + y_std=0.1) + +In addition to using ``f.fit``, one can set ``y_obs`` and ``y_obs`` from a +dataframe via the ``data_df`` attribute. + +.. code-block:: python + + import pandas as pd + + df = pd.DataFrame({"y_obs":y_obs, + "y_std":y_std}) + + f = dataprob.setup(some_fcn) + + f.data_df = df + + f.fit() + +A dataframe passed to ``data_df`` must have a ``y_obs`` and a ``y_std`` column. +All other columns are ignored. The input dataframe must be either a pandas +``DataFrame`` or a string pointing to a spreadsheet that can be read by pandas. + +-------------- +Method options +-------------- + +Each method has different options that are passed to the ``fit`` method. A +description of these options can be accessed via ``help``. + +.. code-block:: python + + # A function we wish to analyze + def some_fcn(a=1,b=2,c=3): + return a*b*c + + f = dataprob.setup(some_fcn, + method="mcmc") + + help(f.fit) + +.. code-block:: + + Help on method fit in module dataprob.fitters.bayesian.bayesian_sampler: + + fit(y_obs=None, y_std=None, num_walkers=100, use_ml_guess=True,num_steps=100, burn_in=0.1, num_threads=1, **emcee_kwargs) method of dataprob.fitters.bayesian.bayesian_sampler.BayesianSampler instance + + Perform Bayesian MCMC sampling of parameter values. + + Parameters + ---------- + y_obs : numpy.ndarray + observations in a numpy array of floats that matches the shape + of the output of some_function set when initializing the fitter. + nan values are not allowed. y_obs must either be specified here + or in the data_df dataframe. + y_std : numpy.ndarray + standard deviation of each observation. nan values are not allowed. + If not specified, all points are assigned an uncertainty of + 0.1*mean(y_obs). + num_walkers : int, default=100 + number of markov chains to use in the analysis + use_ml_guess : bool, default=True + if true, do a maximum likelihood maximization then sample from the + fit parameter covariance matrix to get the initial chain positions + num_steps: int, default=100 + number of steps to run each markov chain + burn_in : float, default = 0.1 + fraction of samples to discard from the start of the run + num_threads : int + number of threads to use. if `0`, use the total number of cpus. + [NOT YET IMPLEMENTED] + **emcee_kwargs : + all remaining keyword arguments are passed to the initialization + function of emcee.EnsembleSampler + + +Results +======= + +dataprob generates outputs that allow the users to access and assess their +fit results. + +------ +fit_df +------ + +This pandas dataframe holds the summarized parameter estimates. The ``fit_df`` +output from the `Simple example`_ was: + ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| index | name | estimate | std | low_95 | high_95 | ... | prior_std | ++=======+=======+==========+=======+========+=========+=======+===========+ +| ``m`` | ``m`` | 5.009 | 0.045 | 4.817 | 5.202 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ +| ``b`` | ``b`` | 5.644 | 0.274 | 4.465 | 6.822 | ... | ``NaN`` | ++-------+-------+----------+-------+--------+---------+-------+-----------+ + +All three methods (ml, bootstrap, and mcmc) will have identical columns. These +columns measure similar, but not identical, features of each parameter for each +method. + +**ml** + + ``estimate``: maximum-likelihood parameter estimate + + ``std``: standard deviation of a parameter uncertainty distribution + calculated assuming normally distributed error centered on the + maximum-likelihood estimate. Distribution width is determined by the local + curvature of the likelihood surface. (See the `Maximum likelihood`_ section + for details.) + + ``low_95`` and ``high_95``: 95% of the distribution described above falls + between low_95 and high_95. This defines the 95% `confidence interval + `_. + +**bootstrap** + + ``estimate``: mean of the maximum-likelihood parameter estimates over all + pseudo-replicate datasets. + + ``std``: standard deviation of the parameter estimates across + pseudo-replicate datasets. + + ``low_95`` and ``high_95``: 95% of the distribution described above falls + between low_95 and high_95. This is determined numerically, making no + assumption about the shape of the distribution. This defines the 95% + `confidence interval `_. + +**mcmc** + + ``estimate``: mean of this parameter over the posterior distribution + + ``std``: standard deviation of this parameter over the posterior distribution. + + ``low_95`` and ``high_95``: 95% of the distribution described above falls + between low_95 and high_95. This is determined numerically, making no + assumption about the shape of the distribution. This defines the + 95% `credible interval `_. + +In addition to the analysis output, the ``fit_df`` column holds the parameter +constraints that went into the analysis (``guess``, ``fixed``, ``upper_bound``, +``lower_bound``, ``prior_mean``, and ``prior_std``). + +One can save this dataframe out to a spreadsheet (``fit_df.to_excel("fit-results.xlsx")``) +to preserve both the parameter fit results and parameter inputs. + +------------ +Summary plot +------------ + +The summary plot allows the user to assess how well the model reproduces the +observations with four combined plots. + +.. code:: python + + # assuming f is a Fitter object for which f.fit() has been run + fig = dataprob.plot_summary(f) + fig.savefig("summary-plot.pdf") + +Here is an example output for a six-parameter model of protein folding (see this +`notebook `_ for details). + +.. image:: _static/sample-comparisons/ml.svg + :align: center + :alt: example summary plot for a maximum likelihood fit. + :width: 50% + +The central plot shows ``y_obs`` plotted against the order of the observations +in the input array. Each point is an observation with its ``y_std`` shown as +error bars. The red line shows the output of the model using the parameters in +``f.fit_df["estimate"]``. The cloud of gray lines shows the output of the model +calculated with parameters drawn from ``f.samples``. + +The lower plot shows the model residuals as a function of observation number, +while the right plot shows the model residuals as a function of ``y_obs``. The +residual is calculated as ``(y_calc - y_obs)/y_std``, where ``y_calc`` is +calculated using the parameters in ``f.fit_df["estimate"]``. The error bars are +``y_std``. The cloud of gray points are residuals when the model is calculated +using parameters drawn from ``f.samples``. The red line shows the residual mean. + +The bottom right plot shows a histogram of residuals, using an x-axis shared by +the plot above. + +A model that describes the data well will have three features: + +1. It will have residuals centered at zero (red line). +2. The residuals will be normally distributed about zero (histogram). +3. The residuals will be uncorrelated with each other (no runs of residuals + above or below the red line on the bottom plot). + +One can control the style of the plot with the arguments passed to +``dataprob.plot_summary``. Key arguments include: + ++ ``x_axis`` is a list of values to use for the x-axis. The length of this list + must match the length of ``y_obs``. ++ ``plot_unweighted`` allows the user to select whether to plot weighted or + unweighted residuals. ++ ``x_label`` and ``y_label`` allow the user to label the axes. ++ The ``*_style`` arguments alow the user to control how the plot + components are drawn. These should be dictionaries holding arguments to be + passed to `matplotlib plot `_ calls. For example, one could use + :code:`y_obs_style={"marker":"+"}` to change the marker style for the + data points to ``+`` symbols. The dictionaries available are + + + ``y_obs_style`` for observations, passed to `matplotlib scatter `_. + + ``y_std_style`` for observation standard deviations, passed to `matplotlib errorbar `_. + + ``y_calc_style`` for model lines in main plot and residuals, passed to `matplotlib plot `_. + + ``sample_line_style`` for sample lines in main plot, passed to `matplotlib plot `_. + + ``sample_point_style`` for sample points in residuals plots, passed to `matplotlib scatter `_. + + ``hist_bar_style``, for bars in residual histogram, passed to `matplotlib fill `_. + +----------- +Corner plot +----------- + +The corner plot allows the user to visually assess how well determined each +parameter is and the extent to which estimates of the parameters co-vary with +one another. The meaning of the distributions is slightly different for each +method; see the `Samples`_ section below for details. + +.. image:: _static/sample-comparisons/ml_corner.svg + :align: center + :alt: corner plot result without for a maximum likelihood fit + :width: 50% + +In the example above, we see that the ``dG_unfold`` parameter varies between +about -10 and -15 (top left) and that ``m_unfold`` varies between -5.5 and -3.5 +(bottom right). These values are *not* independent of one another. The +correlation plot (bottom left) reveals that the estimates of the two parameters +strongly co-vary. Knowing about co-variation is helpful for a number of reasons. + +1. If we can find some way to constrain one of the values -- say, with a + new experiment -- we would know the other with high precision. +2. It might make sense to fold these two parameters into a single parameter. For + example, imagine molecule A can bind to either molecule B or C. If we + mixed A, B, and C together, our results might depend only on the *ratio* of + the A's affinity for B vs. C, not the absolute value of either affinity. + In such a case, the corner plot would reveal a strong co-variation between + the parameters and help us decide how best to model the system. +3. When presenting results in a publication, a co-variation plot allows the + reader to understand what an uncertainty like + :math:`\Delta \hat{G}_{unfold} = -12.5 \pm 2.5` means with respect to the + other parameters in the dataset. + +One cool feature ``datprob.plot_corner`` is the ability to filter parameters. +The model above has six parameters, many of which are 'nuisance' parameters that +are important fo the fit but do not provide information about the (in this case) +protein chemistry. We generated the above plot using the following command: + +.. code:: python + + dataprob.plot_corner(f,filter_params=["native","denat"])) + +This removed any parameter that had the text "native" or "denat" in its name. +If we run the same call without the filter, we get the full corner plot with +all six parameters. + +.. image:: _static/sample-comparisons/ml_corner-no-filter.svg + :align: center + :alt: corner plot result without a filter applied to remove nuisance parameters + :width: 50% + +This larger plot useful--and should generally be checked to make sure nothing +crazy is going on with the nuisance parameters--but it also buries the results +for the the two parameters we care the most about (``dG_unfold`` and ``m_unfold``). +See ``help(dataprob.plot_corner)`` for details on how to do this filtering. + +----------- +fit_quality +----------- + +dataprob provides statistics to help users evaluate the quality of their +results. + +------- +Samples +------- + +After ``f.fit()`` runs, a fitter object will have an attribute ``f.samples``. +This is an numpy array with shape ``(num_samples,num_params)`` that holds +vectors of parameters sampled from the conditional parameter probability +distribution. These samples are used to draw the gray fit lines in a summary +plot and to construct the distributions in a corner plot. The samples are +calculated in different ways for the three methods. + ++ **ml**: Samples parameter values from the covariance matrix assuming that the + parameter uncertainty is normally distributed and centered on the maximum + likelihood parameter estimate. See the `Maximum likelihood`_ section for + details. ++ **bootstrap**: Each sample is a the result of a maximum likelihood fit of the + model to a pseudo-replicate dataset generated by sampling from + observation uncertainty. See the `Bootstrap`_ section for + details. ++ **mcmc**: Records the the locations of Markov chains in parameter space as + they traverse the space by Metropolis Monte Carlo. Each sample is a draw + from the conditional parameter posterior distribution. See the + `Bayesian MCMC`_ section for details. + + +Analysis method details +======================= + +------------------ +Maximum likelihood +------------------ + +Description +----------- + +The maximum likelihood (``"ml"``) method uses the `scipy.optimize.least_squares `_ +function to find parameters (:math:`\vec{x}`) that minimize the weighted +residuals between the model (:math:`y_{calc}(\vec{x})`) and our observations +(:math:`y_{obs}`). The weight on each observation is set to :math:`1/y_{std}`, +meaning that observations with higher uncertainty contribute less in the +regression. The residual function for observation :math:`i` is given by: + +.. math:: + + r_{i}(\vec{x}) = (y_{calc,i}(\vec{x}) - y_{obs,i})/y_{std,i} + +By default, dataprob will minimize the square of this function: + +.. math:: + + \sum_{i=0}^{i`_, +which can be approximated by :math:`(2 J^{T} J)`, where :math:`J` is the +`Jacobian matrix `_. (:math:`J` is automatically calculated and +returned by ``scipy.optimize.least_squares``.) This approach to parameter +uncertainty is discussed `here `_ and in more detail +`here `_. + +We calculate our estimated parameter distributions +(:math:`\vec{\mathcal{N}}(\hat{\mu},\hat{\sigma}^{2})`) as: + +.. math:: + + \vec{\mathcal{N}}(\hat{\mu},\hat{\sigma}^{2}) = \vec{\mathcal{N}}(\mu = 0,\sigma^{2}=1) \cdot H^{-1} + \vec{\hat{\mu}} + +where :math:`\vec{\mathcal{N}}(\mu = 0,\sigma^{2}=1)` is an array of normal +distributions with a mean of zero and standard deviation of one, :math:`H` is +the Hessian matrix, and :math:`\vec{\hat{\mu}}` is an array of the maximum +likelihood parameter estimates. + +This approach is unaware of parameter bounds, so the code truncates any regions +of the resulting distribution that fall outside user-specified fit parameter +bounds. + +Outputs +------- + ++ The ``f.fit_df`` dataframe reports the mean, standard deviation, and 95% + confidence intervals of the estimated parameter uncertainty. ++ The ``plot_corner(f)`` function plots histograms of the marginal distribution + for each parameter, as well histograms showing the co-variation between pairs + of parameter estimates as reflected in the inverse Hessian matrix. ++ The ``f.samples`` attribute samples values from the covariance matrix + assuming that the parameter uncertainty is normally distributed and centered + on the maximum likelihood parameter estimate. + +--------- +Bootstrap +--------- + +Description +----------- + +The ``bootstrap`` method performs maximum likelihood inferences on +pseudo-replicate datasets sampled from the observation uncertainty, then returns +the resulting distribution of parameter value estimates. + +The method assumes the uncertainty each observation :math:`i` is normally distributed, +with a mean of ``y_obs[i]`` and population standard deviation of ``y_std[i]``. +It further assumes that each observation is independent. The ``bootstrap`` method +generates a defined number of pseudo-replicate datasets by sampling form these +values. For each pseudo-replicate it: + +1. Draws a random value for each observation from a normal distribution with + that observation's mean and standard deviation. +2. Uses ``scipy.optimize.least_squares`` to find the maximum likelihood estimate + of the parameter values for that psuedo-replicate dataset. Because + observation uncertainty is captured by the sampling process, the + regression for each pseudo-replicate uses the *unweighted* residuals: + + .. math:: + + r(\vec{x}) = (y_{calc}(\vec{x}) - y_{obs}) + + meaning the regression minimizes the following: + + .. math:: + + \sum_{i=0}^{i`_. In simple terms, we create +a large number of walkers that traverse parameter space. Each walker then +iterates over the following steps: + +1. Take a step (that is, alter one or more parameter values). +2. Determine how this changes the `posterior probability `_ by + feeding the new parameters into the model and prior distributions. +3. Either keep or reject the step based on a `Metropolis criterion `_. + This criterion keeps all moves that increase the posterior probability and + stochastically keeps a subset of moves that decrease the posterior probability. +4. Record the current parameter values of the walker. + +Each walker will spend the most of its time in high probability regions of +parameter space, but will also wander briefly through low probability regions. +When run for a sufficient amount of time, the paths taken by the walkers will +reveal the entire parameter posterior distribution. + +The posterior probability for a given parameter value is calculated from the +likelihood (:math:`P(y_{obs}|\vec{x})`) and the parameter prior (:math:`P(\vec{x})`). + +Likelihood function +------------------- + +The log-likelihood for a set of parameters :math:`\vec{x}` is given by the +following. Note that the core of the likelihood function is the weighted square +difference between ``y_calc`` and ``y_obs``. + +.. math:: + + \text{ln} \left ( \mathcal{L}(\vec{x}) \right ) = - \frac{1}{2} \left ( \sum _{i=0} ^{i < N-1} \frac{ \left ( y _{i,calc}(\vec{x}) - y _{i,obs} \right )^{2} }{y^{2} _{std,i}} + \text{ln} ( 2 \pi y^{2} _{std,i} ) \right ) + +Prior probabilities +------------------- + +The parameter `prior probability `_ encodes other information about +the parameter that is not included in the model itself. In dataprob, each +parameter is assigned its own independent prior. + +If we know nothing about the parameter, we might use "uniform" (also know as +uninformative) priors. This means we believe every value of the parameter is +equally likely. This is the dataprob default if no priors are specified. This +is encoded by setting ``prior_mean`` and ``prior_std`` to ``np.nan`` in the +``f.param_df`` dataframe. + +If we have some bounds on the parameter (say, it must be higher than 0), but +know nothing else, we can use uniform priors between bounds. This means that +any parameter value between the bounds has the same probability; every parameter +value outside the bounds has zero probability. This is encoded by setting +``lower_bound`` and/or ``upper_bound`` in ``f.param_df``, but leaving +``prior_mean`` and ``prior_std`` as ``np.nan``. + +If we have more information about a parameter, we can use more specific +priors. We might have a pretty good guess about a parameter from outside +experiments. To make it concrete: imagine we know an equilibrium constant for a +reaction is :math:`log(K) \approx -6 \pm 1` based on a low-resolution +experiment. We then perform a higher-resolution experiment and want to use +dataprob to extract parameter estimates. We can encode the existing information +using a Gaussian prior with a mean of -6 and standard deviation of 1. In the +MCMC run, parameter values near -6 will have high prior probability; parameter +values well away from that will have low prior probability. This would be +encoded by setting ``prior_mean`` to -6 and ``prior_std`` to 1 in ``f.param_df``. + +Finally, one can encode a compound prior that uses both bounds and a Gaussian +prior. In this case, any parameter value outside above or below the specified +bounds has a prior probability of zero. Within the bounds, the prior is +determined by the Gaussian. Any part of the Gaussian that falls outside the +bounds is truncated. The trimmed Gaussian is renormalized to account for the +loss of density. Compound priors are specified when a user sets ``prior_mean``, +``prior_std``, and at least one of ``lower_bound`` and ``upper_bound``. + +Implementation +-------------- + +dataprob uses the `emcee `_ `EnsembleSampler `_ +class to do the MCMC sampling. Users can exert fine-grained control over this +calculation by passing keyword arguments to ``.fit()``. These arguments are +passed to the ``__init__`` function of ``EnsembleSampler``. For example, the +following code alters the default move used by emcee when walkers traverse the +parameter space. + +.. code:: python + + import emcee + + y_obs = np.arange(10)*5 - 14 + np.random.normal(0,1,size=10) + + def linear(m,b): + return m*np.arange(10) + b + + f = dataprob.setup(linear, + method="mcmc") + f.fit(y_obs=y_obs, + y_std=0.1, + moves=emcee.moves.StretchMove()) # <- change emcee move + +Outputs +------- + ++ The ``f.fit_df`` dataframe reports the mean, standard deviation, and 95% + credibility interval of the parameter marginal posterior probability + distribution in ``f.samples``. ++ The ``plot_corner(f)`` function plots histograms of the marginal distribution + for each parameter, as well histograms showing the co-variation between pairs + of parameter estimates. ++ The final output is the ``f.samples`` array, which holds the parameter values + sampled by the MCMC walkers over the course of the run. + + +Advanced Model definitions +========================== + +-------------- +fit_parameters +-------------- + +In addition to defining names, the ``fit_parameters`` argument to ``dataprob.setup`` +can be used to declare parameter attributes (``guess``, ``fixed``, ``lower_bound``, +``upper_bound``, ``prior_mean``, and ``prior_std``). To do this, +``fit_parameters`` can be one of five different types: + ++ **list.** Each entry is the name of the parameter as a string (e.g. ``['a','b']``). + ++ **dict with float values.** The keys are the parameter names; the values + are the parameter guesses (e.g. ``{'a':5,'b':11}``). + ++ **dict with dict values.** The keys are the parameter names; the values + are dictionaries keying parameter attributes to their values. For example: + + .. code-block:: python + + fit_parameters = {"a":{"guess":1,"lower_bound":0}, + "b":{"upper_bound":20}} + + This indicates that parameter ``a`` should have a guess of ``1`` and a + lower bound of zero. Parameter ``b`` should have an upper bound of ``20``. + Note that the dictionary does not need to exhaustively define all parameter + attributes. Any attributes that not specified are assigned defaults. + ++ **dataframe**. The dataframe must have a ``name`` column with parameter + names (this corresponds directly to the parameter names in a normal + ``fit_parameters`` list). Columns then define parameter features, just like + the ``param_df`` dataframe. Not all columns must be present; missing + attribute columns will be assigned their default values. + ++ **string**: The software will treat this as a filename and will attempt to load + it in as a dataframe (``xlsx``, ``csv``, and ``tsv`` are recognized.) + +------------------------- +Functions with \*\*kwargs +------------------------- + +Sometimes a python function has a ``**kwargs`` argument. This grabs any keyword +argument not specified in the function definition and passes it into the +function. For example, the following function returns the +value of ``a`` unless ``b`` is also passed to the function, in which case it +returns ``a * b``. + +.. code-block:: python + + def some_fcn(a=1,**kwargs): + if "b" in kwargs: + return a*kwargs["b"] + else: + return a + + print(some_function(a=5)) # --> 5 + print(some_function(a=5,b=2)) # --> 10 + +If a function has a ``**kwargs`` parameter, dataprob allows one to specify +arguments not in the function definition as ``fit_parameters``. For example: + +.. code-block:: python + + def some_fcn(a=1,**kwargs): + # do stuff here + return some_1d_numpy_array + + f = dataprob.setup(some_fcn, + fit_parameters=['a','b','c']) + + # When running the analysis, dataprob will do the following under the hood. + y_calc = some_fcn(a=a_value,b=b_value,c=c_value) + + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + diff --git a/docs/source/links.rst b/docs/source/links.rst new file mode 100644 index 0000000..27ea85c --- /dev/null +++ b/docs/source/links.rst @@ -0,0 +1,44 @@ +.. + # sundry links +.. _pop-std: https://en.wikipedia.org/wiki/Bessel%27s_correction +.. _float-number: https://en.wikipedia.org/wiki/Floating-point_arithmetic +.. _pandas-dataframe: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html + +.. + # example links +.. _linear-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/linear.ipynb +.. _binding-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/binding.ipynb +.. _michaelis-menten-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/michaelis-menten.ipynb +.. _lagged-exponential-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/lagged-exponential.ipynb +.. _multi-gaussian-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/multi-gaussian.ipynb +.. _periodic-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/periodic.ipynb +.. _polynomial-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/polynomial.ipynb +.. _linear-extrapolation-folding-example: https://githubtocolab.com/harmslab/dataprob/blob/main/examples/linear-extrapolation-folding.ipynb + +.. + # least squares links +.. _confidence-interval: https://en.wikipedia.org/wiki/Confidence_interval +.. _gauss-newton: https://en.wikipedia.org/wiki/Gauss–Newton_algorithm#Derivation_from_Newton.27s_method +.. _scipy-least-squares: https://docs.scipy.org/doc/scipy-1.14.1/reference/generated/scipy.optimize.least_squares.html +.. _hessian-matrix: https://en.wikipedia.org/wiki/Hessian_matrix +.. _jacobian-matrix: https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant +.. _jac-to-hess: https://stackoverflow.com/questions/40187517/getting-covariance-matrix-of-fitted-parameters-from-scipy-optimize-least-squares +.. _samples-from-dist: https://stats.stackexchange.com/questions/120179/generating-data-with-a-given-sample-covariance-matrix +.. + # Bayesian MCMC links +.. _mcmc: https://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo +.. _posterior-prob: https://en.wikipedia.org/wiki/Posterior_probability +.. _prior-prob: https://en.wikipedia.org/wiki/Prior_probability +.. _metropolis-crit: https://en.wikipedia.org/wiki/Metropolis–Hastings_algorithm +.. _credible-interval: https://en.wikipedia.org/wiki/Credible_interval +.. _emcee: https://emcee.readthedocs.io/en/stable/ +.. _emcee-ensemble-sampler: https://emcee.readthedocs.io/en/stable/user/sampler/ + +.. + # pyplot links +.. _pyplot: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html +.. _pyplot-scatter: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html +.. _pyplot-errorbar: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.errorbar.html +.. _pyplot-fill: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.fill.html + + diff --git a/examples/binding.ipynb b/examples/binding.ipynb new file mode 100644 index 0000000..ecec1f6 --- /dev/null +++ b/examples/binding.ipynb @@ -0,0 +1,237 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "ef2a1bab-5c5c-4ae5-9f8c-e0a6c6ec7ffd", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d409a022-794e-4cf0-939e-4c9a946ce033", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "961ffc657ed04122ac63a660b46df223", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/100 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import dataprob\n", + "\n", + "def binding_curve(K=1,x=None): \n", + " return x/(K + x)\n", + "\n", + "gen_params = {\"K\":1e-3}\n", + "\n", + "err = 0.05\n", + "num_points = 20\n", + "x = 10**(np.linspace(-8,0,num_points))\n", + "y_obs = binding_curve(x=x,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = err*2\n", + "\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "f = dataprob.setup(some_function=binding_curve,\n", + " method=\"bootstrap\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f,\n", + " x_axis=np.log10(x),\n", + " x_label=\"log10([X])\",\n", + " y_label=\"fractional saturation\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7678c606-ead1-41cf-bae9-649367dc72db", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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p72x/fv3S/PmzeXll1/2bquoqJBffvml3lXrrKysf/1YNJlYy8vLpW/fvjJ37lzvtoMHD0qvXr1k8+bN1+2/fft2mTx5srRt21b27dvnx0mvd+LECenevbvs3LnTu83hcMgXX3wh3bt3l/Hjx3u379ixQzZs2CCfffaZHDt2zIBpb6ympkaefvppyczMlEuXLnn/Ya9YsULi4+Oltra23r1mYWGhDB06VLp06WL417+Ow+GQIUOGSKtWrbzbxo4dK3369BGTySRDhw6V9957z3vbv30smszPrIWFhTCbzcjMzPRu69GjB0JCQnDs2LF6+zocDpSWluLy5cvIz89HQkKCv8etJzw8HJcvX8bOnTsxYMAAAEDLli2Rnp6OixcvYunSpVi+fDmeffZZ3HvvvYbO+lfcbjecTicGDx6MZs2aebd37NgRVVVVcDqd9bYnJibihRdewN133+3T9+K9FcHBwXjqqaewePFijBkzBhcvXoTZbMb8+fMRGRmJDz/8EGvXroXVasWUKVP+/WPxj3NXoqKiQlavXu39vO5K8H333SdvvvnmdftXV1fLhQsX/DbfzdTW1sqUKVMkLS1NioqK6t124cIFSU9Pl0cffdSg6RquvLzc++u6e9bdu3dLQkJCvXvVAwcO+H22hrp48aJs2LBBunTpIgMGDJBTp055b6usrJSBAwfKY4895pO/u8k8ztq+fXtMnjwZwJWrjGazGQAQFhYGh8Ph3e+dd95BUVERWrRogbCwMENmvZbFYkFWVhb27duHJUuW4MiRI97bwsLCMGTIEBw6dAg1NTUGTvn3IiMjAVz5+tddFfV4PLDb7d7ZFyxYgFmzZuH8+fOGzXkzoaGhGD58ON5//30sXLgQd9xxB4ArZw5t2rRBUlISTp486ZNXDTWZ0+CrBQUFQURgMpngdru9T3ZYuHAhlixZgqKiIoMnrM/j8SAhIQGbN29GamoqPB4Pnn32WQwbNgwAUFxcjKioKISE6DicV7+ixul0wuFwICQkBIsWLcIbb7yBXbt2ISIiwsAJb6558+a4//77ERQU5P2mU/fRZrMhKSnJN68a8sn9tQKXL18WEZHU1FR577335N1335XQ0FApKCgwbCa3233d82DrHsqo2753715JSkqS5ORkSUxMlFGjRonVapXCwkK/z/tXbraOa+3atUv69esnWVlZYrFYZO/evf4Y8W/dyhpErlxAmz9/vkRGRkpxcbFPZmryb0WakZGBr7/+GmazGXl5eejXr58hcxw4cACvvvoqTp8+jbi4OIwYMQLDhw8HcOUUKzg42PuxtLQUBQUFyMvLQ3R0NNLT09GjRw9D5r5WQ9ZxtZ07d2LQoEFo3bo1vvvuOyQnJxsxdj23uoavvvoKGzZsQH5+PrZu3Yo+ffr4ZK5GFevhw4exZs0aOJ1OdOrUCTNnzvTeJv897a37WOeJJ57A+vXrUVRUhPj4eCPGRklJCfr374+HHnoIsbGxyM3NhdlsxqBBg7Bs2TIA8F4tvXb+QHIr66hz/PhxZGRkYNWqVejVq5dRo3vd7hrWrVuHCRMmIC4uznfD+eT+2gC//vqrWK1WefDBB2XIkCESEREhAwYMkLy8PO8p79WnMXXPVCopKTH0CQ8ej0fmz58vGRkZ3m12u12WLFkiSUlJ8tRTT9Xbf9OmTVJRUeHvMf/Wra5j8+bN3iupV78U0Uj/ZA3+eBlfo4i1trZWRo0a5f1iOp1OqaiokL59+0pycrLk5OTUC3X27Nkye/bs655aaJSpU6fK4MGD622z2+2ydOlSSUlJkddee01ERLZs2SJRUVGyYMGCm/78ZJRbXcf8+fPF5XIFxFMI69zOGtxut1/W0CgeurFYLKiurvY+NGAymdC+fXts374dLVq0wMKFC+s93BEVFYVVq1bVe8jGCPLfn0CSk5Phdru9//M5cOWJENOmTUOfPn2Qk5MDp9OJ4cOHY9q0aZg2bVpAvUfR7a4jMzMTwcHBAXFa/0/WEBQU5J81+PzbgR+43W4ZNmxYvafdXbp0SUSunO7GxsbKhAkT6v2eQHpy++HDh6Vdu3Yybdo0cTgcIvLnCwbqXhyfk5Nj5IgN0hjWEchrUB9r3RcyLy9PWrRoIW+//bb3tpqaGhERycnJkU6dOklxcXFAnXJdLS8vTywWi8yYMUP++OMP7/ZTp05JYmJivecFB7LGsI5AXYOOR9Fvou70IyUlBbNmzcL7778Ps9mM5557Ds2bNwdw5VknoaGhaNmyZUCcct3IsGHDsGHDBowfPx6nTp1CRkYGevfujTVr1uDMmTOIjo42esQGaQzrCNg1GPIt4l9Wd7X38OHDMnv2bOnYsaNkZ2fL+fPnpbKyUrKzsyUhIUFsNpvBk/69goICGTJkiHTu3Fm6du0q3bt3D6iXuTVUY1hHoK1B/eOsdQ9SHz9+HHv27EH//v2Rk5ODBQsWwGq1wmq1orKyElu3bg2IB9wbwm63o6qqCg6HA5GRkWjXrp3RI92WxrCOQFqD6ljr3p7l+PHjiIuLw6RJk7B69WoAQHl5ObZv346WLVuid+/e3rcKIdJKbaxXh5qcnIwxY8ZgxYoVMJvN3vfuIWpMVMZ6bajp6en4+OOP1bzqhOh2qLv7cbvdDJWaJHWxBgcH48SJE4iPj8fo0aPxySefMFRqEtSdBrvdbkyfPh0mkwkrVqxgqNRkqIsVAM6ePYuIiAheRKImRWWsRE0R75qIlGCsREowViIlGCuREoyVSAnGSqQEYyVSgrESKcFYiZRgrERKMFYiJRgrkRKMlUgJxkqkBGMlUoKxKjJ16lSMHj263rYvv/wSoaGheOutt4wZivyG74mi2Mcff4wZM2ZgxYoVePLJJ40eh3yM96xKvfHGG5g5cyY+//xzhtpE8J5VoRdffBHLly/Hli1bkJqaavQ45CeMVZnc3Fxs3rwZ33//Pe677z6jxyE/4mmwMr1790ZsbCwWLVqE6upqo8chP2KsynTq1An5+fn4/fffkZaWBofDYfRI5CeMVaHOnTvjhx9+wOnTpxlsE8JYlYqOjkZ+fj7OnDmDBx98EHa73eiRyMcYq2JRUVHIz8+HzWZjsE0A35GfSAnesxIpwViJlGCsREowViIlGCuREoyVSAnGSqQEYyVSgrESKcFYiZRgrERK/D/WyqbYdOmv4wAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a7eb9dec-c5f0-479a-bb78-f471554b2757", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
KK0.001320.0003220.0007250.0020751.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed lower_bound \\\n", + "name \n", + "K K 0.00132 0.000322 0.000725 0.002075 1.0 False -inf \n", + "\n", + " upper_bound prior_mean prior_std \n", + "name \n", + "K inf NaN NaN " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "971401ed-a193-4389-a7ce-00d8114db4a2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/exponential-saturation.ipynb b/examples/exponential-saturation.ipynb new file mode 100644 index 0000000..5a05dc8 --- /dev/null +++ b/examples/exponential-saturation.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "8fc1904b-71ce-4e1b-913a-74e65beecb6d", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ba7c5dd8-0b6e-4268-9295-acd88c6e06c9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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pxNHIGAsCKQVOkVERETaixLyNpFMJo3+43szGeoV4i95PLhcLqPDitVqVctDERERkTaihLwN1Go1YrEYoVCIVCrV0H/8mN+P2+02asidTidms36tIiIiIu1CmVsbKBaLJJNJotEo6XSagysmdJ7v68Nut+NyubQgkIiIiEgbUkLeBur9xyORCIV8nkPLCwLFLRYSvb14PB4cDocWBBIREZGWZzKZMKs9cwMl5G0gnU6zuLhIIpGgP5slsNwq6EW3G7fHQ2dnJ3a7HafTqRFyERERaWk2mw2vxwOAqcmxtAol5C1uZf14Op3mpnzeuO1YR4dRO26327Hb7RohFxEREWkz1mYHIBeam5tjbm4OWFrN6uTJkxw7doxQKNSwQufpnh4cDoexIJDdbteEThEREWk5K3MbgP2lEnagWCrx8tGjDAwMMDAw0LwAm0wJeQt6+OGHefDBBy96243L/1aB8WCQUadTEzpFRESkpb06t5kChoBQKMShQ4e4//77eeCBB5oVXtMpIW9Bhw8f5u677wbg6aef5uMf/ziHDh0iPjvLgeWzy7NOJ/aeHlwul9FlReUqIiIi0opW5jYvvfQSfOhDAAR7ezny3e9u6tFxUELeklZetpmYmDC231guG7+wl71ebDZbw4ROJeQiIiLSilbmNqXlbnEANrudgwcPNiuslqGC4xbncDgAKBQK3LhiQueJzk6cy+UqDocDm82mhFxERESkDSkhb3HJZBKAXC7HG1acUZ7p6cFms+F2u/F6vZrQKSIiItKmlMG1uFqtBkCxUDBW6EyZzUSDQaPlocfj0ei4iIiISJtSQt7iKpUKAP2FAsHlBYFe9nrx+nx4l+vI3W63EnIRERGRNqWEvMXNz88DcFOhYGw75vMtrXLl9eJwOIxFgURERERancmk9TlfTQl5m1hZP346EDA6q9RX59QIuYiIiLQDq/VnTf6Umi9pi4R8fHycj3zkI4yNjeFyudi+fTv3338/xeWa6o2sXC4DcGj5X4DzwSBWqxWPx4PP58NqtepsU0RERKRNtUUf8hMnTlCtVnn44YfZsWMHL7/8Mh/96EfJZDL80R/9UbPDW1flchkHS0vMApx3OqGrSxM6RURERDaItkjI3/Wud/Gud73L+H7btm2cPHmSz3/+8xs+IS8WixwE6hXiL3u9OJ1OvF4vFosFt9ut+nERERFpG+UVV/1rqGwF2iQhv5hEIkF3d/dl71MoFCismAxZ7+ndTkwmE7et+P5kV5dRrlKf0KkRchEREWkX9ZbO8jNtUUP+amfOnOFP/uRPOHz48GXv99BDD+H3+42v4eHhaxTh2llcXOSNK74/19eHw+EwylUsFosSchEREZE21tSE/Pd+7/cwmUyX/Tpx4kTDY2ZmZnjXu97Fr/zKr/DRj370svu/7777SCQSxtfU1NR6Pp110dvbayTkabOZUE8Pdrsdj8dDR0cHNptNEzpFRERE2lhTS1Z+53d+hw996EOXvc+2bduM/8/OzvK2t72NN73pTfzpn/7pa+7f4XDgcDhWG2ZTmWdnqY/rH/N6cXo8RstDl8ul0XERERGRNtfUhLy3t5fe3t4ruu/MzAxve9vbOHToEF/84hcxm9uy2uZ12xEOG/8/7vdjt9vxer1YrVat0CkiIiKyAbTFpM6ZmRnuuOMORkdH+aM/+iMWFxeN2/r7+5sY2fr62te+RvoHPzC+f2a5Xrw+obM+qVNERERaWz6fJ5lMUigUcDgc+Hw+nE7n695HKBQiEolgMpno7u4mGAzidDqJx+PMzMyQyWTweDwMDg7S2dl50cdHo1Hy+Tx2ux2fz2fkEiaTycgtisUiiUSCYrHYkG8Ui0UKhQJ2ux2Hw0E+nyeTyWAymfB4PNRqNTKZDKlUynisx+OhWq2SSCT4wQ9+wCOPPMJTyzGl02kmX3kFh8NBrVYjHA6TSCQoFApUq1UqlQqlUgm3201fXx/d3d0UCgXOnj1LKBTC5XIxMjLCwMAAZrOZxcVFYrEYFosFn89HR0cH5XKZWq2G1Wolk8mQSCSwWq0MDw8zMjKC0+k0fj8rn7PP58Pn8wGs+nf3WtoiIf/+97/PmTNnOHPmDENDQw23bdSZul/72tf4wAc+wJEVv/C/HR/nDRMTHDhwgI6ODsxmc8NqVyIiItJ68vk88/PzwFI5bTabJZvN0t/ff8WJXT6fZ2JigsXFRZxOJ7VajenpaXK5HH6/nzNnzmA2m/F4PCQSCWKxGPv37zeS8vrjI5EIANFolFKpRGdnJyaTCavVyuDgILlcjlAohM/no1AoUCqVqFarRqvCemJeqVTIZrOk02n6+/sxmUycPHmSWq1GZ2cnMzMzxknDmTNnmJ+fZ35+nv/6X/8rW7duNZ5XIpHgq1/9Km9961uZmZkhl8vh8/mYnJwkHo/jdrtxuVyYzWYjyQ8vVw94PB7y+TwzMzP09fXR09PD3NwcDoeDjo4Ozp49i8lkYt++fVQqFY4fP47FYmF4eJhyucxLL71EPp9nZGSEeDxOoVAgmUxSKpWw2WxUq1VisZjxe7va392VaIu6jw996EPUarWLfm1U//f//X/zC3feyQ3Lb4Bxux1rXx/PPfccbrfbKFvRhE4REZHWVm+7HAgE8Hq9BAKBhu1Xuo9UKkVXVxeDg4MMDQ3R2dlJJpPh1KlTmM1mxsbGCAaDjI2NYTabmZmZaXh8JpOhs7MTn89Hf38/w8PDZDIZrFYrXV1d1Go1bDYbZrOZfD6P2+1mbGzM2F4fBKzvv1AoNHSzs9ls2O12crkc/f397N69m1qtRrVapbOzk29+85vcfPPNfOpTnzListlsfOUrXyGbzVIqldiyZQtms5lgMEhvby9Op5PR0VFGR0epVCqk02njJOANb3gDw8PDBAIBstksExMTDA4Osn37dtxuN11dXTidTiwWC2azGYfDQVdXF319fezevRu/38/8/LzxOtlsNuM51xderI/2r+Z3dyXaIiHfjE6cOMGvXncd1uWE/GWPh+HhYWKxmLFKp+rHRUREWl+91GElh8PRsFbKleyjXlJSVx+tTiQSeDyehvt7PB4ymUzD4+uPKRaLxjom5XLZ2G+hUKBYLBqPXfmz6t3vVn5fLpfxer0Ui0VjVNlut5NKpXC5XFitVqrVKoVCga6uLmZmZrjtttsa5gE67HbOnTtHuVzGbDbjcrlIp9NYrVacTqfxM91uN8VikWq12nByUH8tq9UquVwOt9uN1Woll8sZ+8jlcmSzWSOm0vLq516vl3K5bDzXlb+n+utUf66r+d1dCSXkLWrPnj3845EjPPHmN/MD4LmuLubm5ujt7TXO4FQ/LiIi0voulsBdLEl/rX3UarWG/dQTRr/f35B8A0Yt+crH1x9TTzZLpRJWq9XYb71WvP7YlT/r1ZUJ9ZrsdDptJPelUolisUhHRwe5XM5Ish0OB7FYjMHBQZ566imq1erPXodikW3bthnJey6XMxLlfD5v/MxsNovdbsdsNlMqlRpW+ywUCkYyn81mKZfLuFwuYx/1gcx6TPUBzXriX3+uK39P9dep/lxX87u7EipAblH/5//5f/KBD3yAp3bu5DTQGY0Sj8f50Ic+ZLQ71Ai5iIhI6/P5fGSzWSKRSEPSV58weKX76OjoYHFxkVwuR61Wo1QqEQgE2LJlC2fOnOH8+fPG6Ha1WmVwcLDh8R6P56I15OVymVgshtvtNmrGnU4n2WyWRCKByWQyRpXtdjvnz5+nWq3icDhIJBK4XC7jPitryBcWFuju7sZsNhOPx3nPe97Df/2v/5XFxUU+sBxXqVTigx/8oHHlf3Z2Fp/PRygUMmrIJyYmMJvN9PT04PV6jZr8VCpl1LLXa8hnZmYIh8N0dHQQi8UwmUxUKhVjpL5cLrOwsMDCwgL5fJ6dO3cyODhIPB6nVCoZz7k+Cl8/qVnN7+5KmGobuRD7VZLJJH6/n0QiseYv5Hr42te+xm/91m8xMzNDR0cHb37zm3nPe97D9ddfz/bt241JFCIiItLa1GXlZ11WvvSlL/Hk1BRDQMrvZ/LHP970XVaUkLe4P/uzP+Pf/tt/yzvf+U6uu+46brzxRq6//nqGhobo6elpdngiIiIir8tPfvITBt/4RoaA2uAgpunpZofUdKohb3GVSgXAOBN1OBya0CkiIiKygSghb3H12iWbzYbL5cJisRg15CIiIiLS/pSQt7h8Pg+A2Ww2JmRYLBZ1WBERERHZIJSQtzi32w2A1WrFbrfj9/uNFbVEREREpP0pIW9x9V6dFosFr9drrBwlIiIiIhuDEvIWVy9N0YROERER2QhW5jFq3rxECXmLq9eQOxwObDYbTqdT9eMiIiIiG4gS8jbhdrtxu92YzWaNkIuIiIhsIErIW1x98qbNZqOrq0sTOkVERKStlctl4/+bZnXK16CEvMUFg0FgqR+52+1WuYqIiIi0tU20SPwVU0Le4kqlErA0Uq4JnSIiIiIbjxLyFpdKpYClbiv1iZ0iIiIisnEoIW9x9RFyp9OJyWRSQi4iIiKywSghb3FdXV0A+P1+zGazJnSKiIiIbDDK7lrQ3Nwcc3NzABw7dgyAmZkZjh07xuzsLAMDAwwMDDQzRBEREZErtjK3OXHiBIPL20vFIi8fPbrpcxtTbRNNdU0mk/j9fhKJBD6fr9nhXNIDDzzAgw8+eMnb77//fh544IFrF5CIiIjIKrw6t5kChoBpYBjlNkrIW9DKs0iAWCxGuVzG5/PhcDg2/VmkiIiItJdX5zb73/1u7KEQxWCQlx99dNPnNkrIW1ytVjP+gPv6+rBYLE2OSERERGSV3vAGmJ+H/n549tlmR9N0qiFvcfUuK2azWcm4iIiIbAxKwhuoy0qLqyfkancoIiIisjEpIW9x9YTcbrc3ORIRERERWQ9KyFtcsVgENEIuIiIislGphrzF+Xw+SqWSRshFRERENigl5C3O6XTidDqbHYaIiIiIrBOVrIiIiIiINJESchERERGRJlJCLiIiIiLSRErIRURERESaSAm5iIiIiEgTKSEXEREREWkiJeQiIiIiIk2khFxEREREpImUkIuIiIiINJESchERERGRJlJCLiIiIiLSRErIRURERESaSAm5iIiIiEgTKSEXEREREWkiJeQiIiIiIk2khFxEREREpImUkIuIiIiINJESchERERGRJlJCLiIiIiLSRErIRURERESaSAm5iIiIiEgTKSEXEREREWkiU61WqzU7iGulVquRSqXo6OjAZDI1OxwRERERkc2VkIuIiIiItBqVrIiIiIiINJESchERERGRJlJCLiIiIiLSRErIRURERESaSAm5iIiIiEgTKSEXEREREWkiJeQiIiIiIk2khFxEREREpImUkIuIiIiINJESchERERGRJlJCLiIiIiLSRJsqIa/VaiSTSWq1WrNDEREREREBNllCnkql8Pv9pFKpZociIiIiIgJssoRcRERERKTVKCEXEREREWkiJeQiIiIiIk2khFxEREREpImszQ5ARERENo65uTnm5uYuefvAwAADAwPXMCJpSW94A8zPQ38/PPtss6NpOiXkIiIiLaodk9uHH36YBx988JK333///TzwwAPXLiBpTfPzMDPT7ChahhJyERGRFtWOye3hw4e5++67ATh+/Dj33HMPjzzyCHv37gVouRMIkVaghFxERKRFtWNye7FR+71793Lw4MEmRSStplarUavVMAM1wNTsgFqAEnIREZEWpeRWNqJSqUQ+lcLX7EBaiLqsiIiIiIg0kUbIRURERKQpKuUyLx49etHbenp6GBkZucYRNUdbJeT/9E//xH/+z/+ZI0eOMDc3x9e//nXe9773NTss2QDy+TzJZJJCoYDD4cDn8+F0OpsdlohI28rn80SjUQCi0Sj5fF7HVbnAQijEoUOHLnqb2+3m+PHjmyIpb6uEPJPJcODAAX7jN36D97///c0ORzaIfD7P/Pw8AA6Hg2w2Szabpb+/Xx8eIiJXIZ/PMzEx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rB77eve7GAqRzWaZmprirW996/+/vXuPiqs89wf+nYG5MPcbMAMMEAK53xPB3Lwl5tJVrUarxzTVWFdXqvF4NEaPLqvRU2tOzS85rdZz6uqqRuuqtnVV07pa4yUY4y2WXGqiMQGSQICBgWFgmIG5798fdL+yGyDJ7D2ZDfN81mIFZiabl7k++32f93nw4RtvwO12C/KzUzkuAPT29ODo0aOor6/HD37wA7ywYweqqqowY8aMsypoXOhzp/7IEbz11ltoaGjACy+8gB/cdBMqKyvx7W9/W1DrN5Xn5N9ra/Hyyy+jq6sLb731Fr599dVwOBy49dZbceWVV6Z8XODc93eqx335+efR39+PZDKJzZs34//95Ces4+iGDRske22Kue1wtz/r/ti1a9Tn34WM477vfx+tra1QKBTYs2cPrrrySnAch+LiYvz2t79N+bhDHf3nsvGBv/3tgpaGRzruvevWIRgMguM4/PnPf8a1K1dCoVDAYDDglVdeETXe7Y8/zlIW/+u//guP3XcfAoEAzGbzOTehnut+eO3Xv0ZdXR1UKhWee+45bFy/HrFYDAsWLBDkT1/ocdN926UVFUgmk1i2bNng+8gtt+D9999HTk4O6zCc7jGk87aEjBXnHZAPnWk+lx07dqQ0mPMZw2233YYFCxaguroaP//5zxEKhUYNIseqm2++GU899RSee+45AIP11xsbG/HII4+IPrbD4YDX62X1YVtaWmCxWCRpvFFQUMAqFwCDs5YXGliMxGKx4Oqrr8YXX3wBYHCT1dVXXy26zu/QUnk8vqOhWK2trVAqlYKSdkqlEq2traJL2nV3dyMQCAhKKgYCAUladfNBC7+py2QywWQySVIKMhKJgOM4tvnN7/ejpKRE9P3Nlzgc2l00Go1K8jimUzqffwaDAVarla3I8Btd5Vyb3eFwoLe3l22EVSqViMfjkrw/qdVq1nUWANv0K8XmQIPBAK/Xi3379gEAXnvtNSxdulTW9zUAXH755di5cyd2794NANi9ezdaW1uxfv36zA6MjGvxeBwD4fDo6U9Z5rwD8kOHDgl+PnjwIOLxOGswceLECeTk5IguQTeam2++GZ2dnXjsscfQ3t6OOXPm4O233xakK4wXV199NU6dOoXa2loAgykEa9euxfLly0Uf+8SJEwgEAjh69CgA4OjRo5g1axZOjLIh9XxV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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Define model and generate data\n", + "\n", + "def exponential_saturation(a,b,k,x): \n", + " \n", + " return a*(1 - np.exp(-k*(x))) + b\n", + "\n", + "gen_params = {\"a\":13,\n", + " \"b\":-2,\n", + " \"k\":0.5}\n", + "\n", + "err = 0.3\n", + "num_points = 20\n", + "\n", + "x = np.linspace(0,10,num_points)\n", + "y_obs = exponential_saturation(x=x,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = 2*err\n", + "\n", + "test_fcn = exponential_saturation\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Run analysis\n", + "\n", + "f = dataprob.setup(some_function=test_fcn,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "f.param_df.loc[[\"a\",\"b\",\"k\"],\"guess\"] = [1,1,1]\n", + "\n", + "f.param_df.loc[\"k\",\"lower_bound\"] = 1e-12\n", + "f.param_df.loc[\"k\",\"upper_bound\"] = 2\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "\n", + "fig = dataprob.plot_summary(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5108f9b2-c919-45bd-a049-a4a5ff1c671b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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428fOt/6t9vt4ttvvw3Kz7bkVPvg8/mE2+0Wf/7znwMysbOnTvc+CNFx0dhXuumcDZ/PJ5YsWSJmzZolP2a328XTTz8tRo0aJX75y1922f7dd98VVVVVFzpMv3ob+6ZNm+T3NNB3884k9mApMTyT2IPlM9NbTJT7GY/HI1/tr1u3Th4JLCsrEw899JC4+eab+8TI2+n246abbhKtra0BjvLUTrcPt9xyS9C/F8H0PnRPbObMmXNCYhPsBtI+BPN+9WQfAp1EXWg/+9nPxFVXXdXlMbvdLl544QVxySWXiGXLlgkhhPjPf/4jEhISxKOPPho0r1FvY1+yZInwer1BMTI+kF73YIq9N5go90M+n0/+MK5fv15oNBoxZMgQoVKpAl703xsn2w+1Wt1naptOtQ995b0Ihvehcx1pX00wuQ/BoT/sw7kkJYsrV64UV1xxxQltH+vr68Uvf/lLcfnll8t3b5544gmRn59/wWPtjrEHRl+O/UwwUe6nfD6f/GGeOHGiiIiICLqa5J7oD/vBfTg3CgsLhV6vFz//+c/77OIP3Ifg0B/24VzLy8sTVqtVzJ07VzQ3NwshfkiIiouLhUKhEO+9914gQzwpxh4YfTn23mCi3I95PB7x0EMPCYVCEdQTak6nP+wH9+Hsf/fcuXPFL37xiz47+sd9CA79YR/Ol08++UTodDrxwAMPdJm4W1FRIUaOHCl27NgRwOhOjbEHRl+OvaeCvzM4nZXhw4djz549yMrKCnQoZ6U/7Af34cypVCq88MILsFgsfheI6Au4D8GhP+zD+XLNNddg48aNmDlzJioqKjBr1ixkZWVhzZo1qK6uRmJiYqBDPCnGHhh9OfaeUggRZMsk0TklhIBCoQh0GGetP+wH94GI+oI9e/ZgwYIFKCwshFqthkqlwvr165GdnR3o0E6LsQdGX479dJgoExERURd2ux319fVobm5GbGwsrFZroEPqMcYeGH059lNhokxERERE5AcLtIiIiIiI/GCiTERERETkBxNlIiIiIiI/mCgTEREREfnBRJmIiIiIyA8mykREREREfjBRJiIiIiLyg4kyEREREZEfTJSJiIiIiPxgokxERERE5AcTZSIiIiIiP5goExERERH5wUSZiIiIiMgPJspERERERH4wUSYiIiIi8oOJMhERERGRH0yUiYiIiIj8YKJMREREROQHE2UiIiIiIj+YKBMRERER+cFEmYiIiIjIDybKRERERER+MFEmIiIiIvKDiTIRERERkR9MlImIiIiI/GCiTERERETkBxNlIiIiIiI/mCgTEdEJJkyYgPnz5wc6DKI+jcdR38dEmYiIiIjIDybKRERERER+MFGmfumDDz7AlVdeibCwMERGRuLGG29Efn5+oMMi6lM8Hg8efPBBWCwWWK1WPP744xBCBDosoj5ry5YtsFgsWLt2baBDoR5iokz9UktLCxYsWIBdu3bh448/hlKpxM033wyfzxfo0Ij6jNWrV0OtVmPnzp146aWX8OKLL+Lvf/97oMMi6pP+9a9/4bbbbsPatWtxxx13BDoc6iGF4PAADQC1tbWw2Ww4ePAgRowYEehwiILehAkTUF1djUOHDkGhUAAAFi1ahM2bNyMnJyfA0RH1DRMmTMCoUaOQkZGBRx99FJs2bcLVV18d6LCoFziiTP3SsWPHcNtttyE1NRVmsxkpKSkAgOLi4sAGRtSHjB07Vk6SAWDcuHE4duwYvF5vAKMi6lveeustPPTQQ9i2bRuT5D6IiTL1S9OmTUN9fT3+93//F9988w2++eYbAIDL5QpwZERENJBkZ2fDZrPh9ddfZ41/H8REmfqduro65Obm4rHHHsOkSZMwbNgwNDQ0BDosoj5HusCUfP3118jIyIBKpQpQRER9T1paGrZv345Nmzbh17/+daDDoV5SBzoAonMtPDwckZGRWLVqFWJjY1FcXIxFixYFOiyiPqe4uBgLFizAvffeiz179uDPf/4zVqxYEeiwiPqcwYMHY/v27ZgwYQLUajX+9Kc/BTok6iEmytTvKJVKrF+/HvPmzcOIESMwZMgQrFy5EhMmTAh0aER9yuzZs9Ha2opLL70UKpUKv/nNb3DPPfcEOiyiPmnIkCH45JNPMGHCBKhUKl509hHsekFERERE5AdrlImIiIiI/GCiTERERETkBxNlIiIiIiI/mCgTEREREfnBRJmIiIiIyA8mykREREREfjBRJiIiIiLyg4kyEREREZEfTJSJiIiIiPxgokxERERE5AcTZSIiIiIiP5goExERERH58f8B3lx0CAupSLUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ea581335-f335-498f-ab20-ea2c4184d703", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
aa13.2104770.35533012.45721213.9637421.0False-infinfNaNNaN
bb-2.2111240.357099-2.968140-1.4541081.0False-infinfNaNNaN
kk0.5161910.0316320.4491340.5832481.0False1.000000e-122.0NaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "a a 13.210477 0.355330 12.457212 13.963742 1.0 False \n", + "b b -2.211124 0.357099 -2.968140 -1.454108 1.0 False \n", + "k k 0.516191 0.031632 0.449134 0.583248 1.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "a -inf inf NaN NaN \n", + "b -inf inf NaN NaN \n", + "k 1.000000e-12 2.0 NaN NaN " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "146dbdb2-1e96-4995-aaf4-b12607c8d81e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/lagged-exponential.ipynb b/examples/lagged-exponential.ipynb new file mode 100644 index 0000000..2bed4ed --- /dev/null +++ b/examples/lagged-exponential.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "412b6eb6-fa12-43e9-9f75-b6fd2aab9074", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ddd85f00-6ad5-45ea-b592-d7dd2044a606", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ubkoKSlBWloa2rVr57pMU6MyYsQIAEBqaqoIiOT3rmpFU5erly8139Q4yQGTGijJ7xkwEVFjpD4GyMfbGx4ejab912VYQkRXOXJpvj450tpKREREjU+jaSEnIiIiosZBufq3+mqPBrKOATkRERER1YnioiJcuXLF1dlo8BiQExERERG5EANyIiIiIiIXYkBORERERORCHGWFiIiIiJzi7NmzyMnJwQ0VFfC8Om3//v2aQx+GhITwQUNXMSAnIiIiomt29uxZREZGorS0FL8A6Hh1+s0336x5Y6evry8yMzMZlIMBORERERE5QU5ODkpLS7FkyRIEJycDubkAgPfee8/iaZ0nT57EggULkJOTw4AcDMiJiIiIyInCw8NFFxV3Dw9ERkbC3d3dxblq2BiQExEREZFNmZmZdn9uuPrXs0ULBuN2YEBORERERLpycnLg5uaGuLg4V2elyWJATkRERES6CgsLUV1djSVLliA8PFw33X//+1+89tprJtMUAIqiwGAwaH+JADAgJyIiIiI7hIeHo3fv3rqfnzx5UrxXrv4tu3wZVVVVmsMe0u/4YCAiIiIiIhdiQE5ERERE5EIMyImIiIiIXIgdeoiIiIjIJWwNpagKCQlp0g8QYkBORERERPXK0aEUfX19kZmZ2WSDcgbkRERERFSv7B1KEagZvWXBggXIyclhQE5ERERE5Ah3d3erY5DbGkqxueBNnURERETkVGoI7unpCXd3d5fmpTFgQE5ERERE5EIMyImIiIiIXIgBORERERE5lXL17+XLl1FZWenSvDQGDMiJiIiIiFyIATkRERERkQvZPexhv379rA5bI8vIyKh1hoiIiIiImhO7A/Lx48fXYTaIiIiIiJonuwPyxMTEuswHEREREVGzxD7kREREREQuZHcLuayqqgovv/wyPvroI5w9exYVFRUmn+fm5jolc0RERETUeLm5u9t9D2JzVqsW8meffRbLly/HpEmTUFBQgHnz5sFoNMLNzQ1JSUlOziIRERERNSZqCO7l6Ql3d3eX5qUxqFVAvnbtWrz55pt4/PHH4eHhgQceeAD//Oc/8be//Q3ff/+9s/NIRERERNRk1Sogv3DhAqKiogAAfn5+KCgoAAD84Q9/wOeff+683BERERERNXG1Csg7duyIrKwsAED37t3xxRdfAAD27t0LLy8v5+WOiIiIiBod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debMGbzyyiviBj4iIiIiIrJPrQLyu+++W9w1np+fj0GDBmHZsmW4++67sXLlSqdmkIiIiIioKatVQJ6RkYFbbrkFQM34tu3atcOZM2fw3nvv4R//+IdTM0hERERE1JTVKiAvLS0VN2d88cUXMBqNcHNzw5AhQ0wezEBERERERNbVKiDv0aMHNm7ciF9++QVbt24Vj+7+7bffnPqgBSIiIiJqvAxu1/TIm2ajVqX0t7/9DU888QS6du2KQYMGYejQoQBqWsv79evn1AwSERERUeNiuPrX28sLHh52D+rXbNWqhO655x7cfPPNyMrKMnkE8siRIzFhwgSnZY6IiIiIqKmr9XWEdu3awd/fH9u2bcPly5cBAAMHDhSPACYiIiIiIttqFZBfunQJI0eORK9evTB27FhkZWUBAKZNm4bHH3/cqRkkIiIiosZFufq3rLwclZWVLs1LY1CrgHzu3Llo0aIFzp49C19fXzF90qRJ4vHeRERERNS8KdXVrs5Co1CrPuRffPEFtm7dio4dO5pM79mzJ4c9JCIiIiJyQK1ayEtKSkxaxlW5ubnw8vK65kwRERERETUXtQrIb7nlFrz33nvif4PBgOrqaixduhQxMTFOyxwRERERUVNXqy4rycnJGDFiBPbt24eKigrMnz8fP/30E3Jzc/Hdd985O49ERERERE2WwwH5lStX8Oc//xn//ve/sW3bNvj7+6O4uBhGoxGzZs1CWFhYXeSTiIiIiKhJcjggb9GiBQ4cOIBWrVph4cKFdZEnIiIiImoCDG61fuRNs1KrUoqLi8Nbb73l7LwQERERURNguPrX28sLHh616iHdrNSqhCorK/H222/jyy+/RHR0NFq2bGny+fLly52SOSIiIiKipq5WAfmhQ4fQv39/AMCxY8dMPjMYDFpfISIiIiIiDbUKyHfs2OHsfBARERFRE6Fc/VteXo6qqiq4u7u7ND8NHXvaExEREVGdqK6uhqIothM2cwzIiYiIiIhciAE5EREREZELMSAnIiIiInIhBuRERERERC7EgJyIiIiIyIUYkBMRERFR3eDzaezCZ5kSERERNRFnz55FTk6OzXSZmZl1mg81DPfx9oaHB8NNW1hCRERERE3A2bNnERkZidLSUldnhRzEgJyIiIioCcjJyUFpaSmWLFmC8PBwq2n/+9//4rXXXqunnJEtDMiJiIiI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ERE1M++++y48PT3x3Xff4YUXXsCIESPQr18/7Nu3D1u2bMHFixdx3333AQCysrLwwAMP4E9/+hMyMzPx9ddfw2g06nZTefLJJ7Fz5058+umn+OKLL/D1118jIyPD4Tz6+/vjnXfeweHDh/Hqq6/izTffxMsvv3xN691QscsKERERUTPTs2dPLF26FACwePFi9OvXD88//7z4/O2330anTp1w7NgxFBcXo7KyEkajEV26dAEAREVFac63uLgYb731FlJTUzFy5EgANcF/x44dHc7jM888I9537doVTzzxBD788EPMnz/f4Xk1dAzIiYiIiJqZ6Oho8f5///sfduzYAT8/P4t0J06cwKhRozBy5EhERUVh9OjRGDVqFO655x60atVKM31FRQUGDx4spgUHB+O6665zOI/r1q3DP/7xD5w4cUKcFAQEBDg8n8aAXVaIiIiImpmWLVuK98XFxRg3bhz2799v8jp+/DhuvfVWuLu7Y9u2bdi8eTN69+6NlJQUXHfddTh16lStl28wGCy6vMj9w3fv3o3Jkydj7Nix2LRpE3788UcsXLgQFRUVtV5mQ8aAnIiIiKgZ69+/P3766Sd07doVPXr0MHmpgbvBYMBNN92EZ599Fj/++CM8PT2xYcMGi3l1794dLVq0wJ49e8S0vLw8HDt2zCRdaGgosrKyxP/Hjx9HaWmp+H/Xrl3o0qULFi5ciAEDBqBnz544c+aMs1e9wWBATkRERNSMzZo1C7m5uXjggQewd+9enDhxAlu3bsXUqVNRVVWFPXv24Pnnn8e+fftw9uxZpKWlITs7G5GRkRbz8vPzw7Rp0/Dkk09i+/btOHToEB5++GG4uZmGnCNGjMBrr72GH3/8Efv27cMjjzyCFi1aiM979uyJs2fP4sMPP8SJEyfwj3/8Q/MEoKlgQE5ERETUjLVv3x7fffcdqqqqMGrUKERFReGxxx5DUFAQ3NzcEBAQgG+++QZjx45Fr1698Mwzz2DZsmUYM2aM5vySk5Nxyy23YNy4cbj99ttx8803m/RZB4Bly5ahU6dOuOWWW/Dggw/iiSeegK+vr/j8rrvuwty5czF79mzceOON2LVrFxISEuq0HFzJoPDRSkRERERELsMWciIiIiIiF2JATkRERETkQgzIiYiIiIhciAE5EREREZELMSAnIiIiInIhBuRERERERC7EgJyIiIiIyIUYkBMRERERuRADciIiIiIiF2JATkRERETkQgzIiYiIiIhciAE5EREREZEL/T8lXA3//CIYmwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import dataprob\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Define model and generate data\n", + "\n", + "def lagged_exponential(k=0.1,lag=5,t=None):\n", + " return np.exp(k*(t + lag))\n", + "\n", + "gen_params = {\"k\":1/20,\n", + " \"lag\":5}\n", + "\n", + "err = 10\n", + "num_points = 150\n", + "\n", + "t = np.linspace(0,120,num_points)\n", + "y_obs = lagged_exponential(t=t,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = 2*err\n", + "\n", + "test_fcn = lagged_exponential\n", + "non_fit_kwargs = {\"t\":t}\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Run analysis\n", + "\n", + "f = dataprob.setup(some_function=test_fcn,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "47563a41-059b-40bf-b9f2-9e8ba4ef1086", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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BRc4nPTHVVZW6s9//rNiYmI0ZMgQSdJ1112nb775Rnv37tW3336ru+66S2PGjFFaWprDaU8sGN6L7t27a8yYMcrIyNCYMWNkjNHtt98u6eh5JZGRkU32tU+Fy+XSrl27tGfPHv9rsbGxuvPOOxUVFaXXXntNZ555pm688UYHU56Yz+eTz+dTbm6upk2bpsTERE2ePFl///vf9dVXXykpKUmvv/660zGPsWjRInXq1EmPPvqoXC6XBg8erMzMTGVnZys3N1cpKSkaNGiQ0zEbDbvooeTkZJ199tnatm2bPv/8c/Xv31/Lly9X586d1bFjRz3//PO65pprJCloyr2mpkaVlZVKSkpSYWGhJPlPVrrwwgs1btw45efn66233pIUnLsMPR6PfvOb3+iyyy7TuHHj1KlTJ9XU1OiFF17Qpk2b9MILL+jZZ5/Vyy+/LCk4l0GSqqurg+K9SE5O1uLFi/WrX/1KDzzwgO644w698sorGjt2rJ5++umg+P7VZsjMzJTP51NeXp5/WmxsrEaNGqVevXpp2rRpKi8vdyrmSbndbiUmJqpPnz7asGGDrrvuOk2aNElvvvmm1q9fr6uvvtrpiD/KGKP8/HxlZ2dLkh555BEtXLhQ8+bN0z/+8Q/dcMMNevHFFx3N2Kgc23eAoFBVVeX/99xzzzUul8v8/Oc/N3v27PHP88EHH5jWrVub559/3qmYx/WPf/zDREZGmkWLFhlj6u4anDZtmomNjTX79u1zKl69fPLJJ+aqq64yV111ldmyZUudaY899php2bKlKSoqcijd8R04cKDOx88884xj70VNTY3Zt2+fyczMNLt27TLGGPP0008bl8tlYmJi/LuOg8XmzZtNQkKCGTVqlCkpKTHGfHcIIT8/37hcLrNw4UInI9bLTTfdZO69915jjDG33HKLadWqlenatasZNWpUUO72/uabb0y/fv3MOeecY37+858bl8tl3nrrLVNTU2P27t1r7rzzTjNw4EBTWFgYNId0Tge76ENUdXW1wsPD/ZdkRUREaM2aNbr55pv1s5/9TGeccYZ/3j59+ig+Pt7xs9N37Nihr776SsXFxerdu7fS0tL029/+VitWrNAvfvELLVy4UBdddJF//nPOOUcdOnTw7zIOBnv37tWOHTt04MAB9e3bVy1atNAll1wir9erPXv2KDU1VdLRPRRut1vx8fFKTU1VbGysw8nrWrNmjXr37q2VK1eqR48ecrvd+p//+R+tWrXKkffC5XIpMTFRCQkJ2rJli5KSkrR69WrFxcWppKREX3zxhbp169YkX7shOnbsqLlz52rw4MGKjo7WpEmTlJCQIOnoupiRkaH4+HiHUx6f+f9DdZdeeqm2bt2q22+/Xe+9955WrVql7Oxs3XPPPYqMjFRGRoaioqKcjuuXlpam2bNna8WKFdq4caNcLpd+9rOfSZLatm2r5ORkffLJJ4qJiQmavZWng4IPQZs2bdJf//pX7dmzRxEREXrmmWeUmJio8PBwzZ49W5WVlXXmd7vd6tChg8466yxJcuQ4/Pr163X55ZcrNTVVq1evVq9evXThhRdq6tSpmjlzpioqKnTFFVfomWee0SWXXKKUlBQtWrRIbrc7aK4rX79+vYYPH67IyEitW7dOgwcP1uTJk5WRkaHevXv7S12S/9+cnBydc845/j/IguGXztq1azVgwACNHTtWvXr1qjPtscceU1lZWcDfC5/Pp7CwMMXHx2vz5s2aO3euPvzwQy1btkwLFy7U6NGj5Xa7NXLkyCb5+g0xaNAgzZs3T9dff712796tYcOGKSMjQy+99JL27dunlJQUpyMeV+3PYVpamn7961/rjDPO0Lvvvqu0tDSlpaXJ5XKpR48eQVXutWozPvfcc1q5cmWd8zP27t2rDh06NOuxCepwehcCAmv9+vWmTZs25pZbbjG33Xabueiii8w555xjSktLj/t/Jk6caNLS0sz27dsDmPQ7Bw8eND169DBjx441Bw8eNDt27DAPPfSQ6datm7n66qv98919992mdevWJjU11fTu3du0adPGrF692pHMP7Rp0yaTlJRkJk6caL755huTm5tr2rdvb8aOHfuj8+fn55uJEyea+Pj4oNq9vH79ehMdHW3uv/9+/2t79+41a9eurXPG/7hx4wL2Xhw5csT//J///KeJjIw0KSkpdb7eX//6V7Nx48Ym+fqna9WqVWbAgAHmrLPOMh07djSdO3cOmp/bk6mqqjIzZ840a9euNcYEz5UK9fHVV1+Z+Ph48/jjj5uXXnrJ/PGPfzQtW7Y069atczpao6HgQ8iuXbvMeeedZ+655x7/azk5OaZr167m7bffPmb+JUuWmJtuusm0adPGrFmzJoBJ69q+fbvp3LmzWb58uf+1kpIS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "43a7ff3c-8137-4254-b973-cfae1112cf89", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
kk0.0507540.0007720.0492290.0522800.1False-infinfNaNNaN
laglag3.2691711.737567-0.1646686.7030095.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed lower_bound \\\n", + "name \n", + "k k 0.050754 0.000772 0.049229 0.052280 0.1 False -inf \n", + "lag lag 3.269171 1.737567 -0.164668 6.703009 5.0 False -inf \n", + "\n", + " upper_bound prior_mean prior_std \n", + "name \n", + "k inf NaN NaN \n", + "lag inf NaN NaN " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "008fbb3a-0584-4227-90a8-41ac7cab7760", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/linear-extrapolation-folding.ipynb b/examples/linear-extrapolation-folding.ipynb new file mode 100644 index 0000000..7889d16 --- /dev/null +++ b/examples/linear-extrapolation-folding.ipynb @@ -0,0 +1,374 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "id": "236eeab4-2e4d-45fc-98b5-08937270c3fc", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d7271ffa-e45b-4452-8758-360dddd2aacb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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++67R7zt/fffz9lnn01mZiaZmZmsWLHifbf/8pe/jEqlGvG1atWq470bQnzsmUwmysvLOaj959pxa3Mz/f39EzgqIYQQYvKZUgH5448/zvXXX8/atWvZvn07CxYsYOXKlXR3d496+9dee43Pf/7zvPrqq2zatIni4mLOP/982traRtxu1apVSnH6jo4OHnvssROxO0J8rKnVaqZPn06D2axcltXRQW9v7wSOSgghhJh8plRA/otf/ILrrruOa6+9ltmzZ3PfffdhNpt54IEHRr39//7v//Kv//qvLFy4kKqqKn7/+9+TTCbZuHHjiNsZDAby8vKUr8zMzBOxO0J87OXl5dE+7P+pYGCA9vb2CRyREEIIMflMmYA8Go2ybds2VqxYoVymVqtZsWIFmzZtGtNjBINBYrEYTqdzxOWvvfYaOTk5zJw5k2984xsfWCs5Eong9XpHfAkh3s9msxEsL1e2y4JBGhoaJnBEQgghxOQzZQLy3t5eEokEubm5Iy7Pzc2ls7NzTI/xgx/8gIKCghFB/apVq/jDH/7Axo0bufvuu3n99de54IILjloJ4q677sLhcChfxcNKuwkh/slsNpMxaxYDQ9szolE6Ozul0ooQQpwENBoNBoNhoocxJZw0nTp/8pOf8H//93+89tprGI1G5fIrr7xS+XnevHnMnz+fadOm8dprr3HeeeeN+lg33XQT119/vbLt9XolKBdiFGazmdKyMvap1ZyZTFKYSuFpbiYQCGC32yd6eEIIIY4jjUaDZiggV03wWCa7KTND7nK50Gg0dHV1jbi8q6uLvLy8o973P//zP/nJT37Ciy++yPz5849624qKClwuF4cOHTribQwGA3a7fcSXEOL9tFot06ZNG1lppakJt9s9cYMSQgghJpkpE5Dr9Xqqq6tHLMhML9A8/fTTj3i/n/70p6xbt47nn3+eJUuWfODztLa20tfXR35+/riMW4iTXUVFBY0Wi7Kd1dlJT0/PBI5ICCHEiZBKpUgkk4M/T/BYJrspE5ADXH/99dx///08/PDD7N+/n2984xsEAgGuvfZaAK655hpuuukm5fZ33303t956Kw888ABlZWV0dnbS2dmJ3+8HwO/3c8MNN7B582YaGxvZuHEjF198MdOnT2flypUTso9CfNxkZWXR5XIp24VuNy0tLRM4IiGEECdCLBYjMBRziaOb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Define model and generate data\n", + "\n", + "def linear_extrapolation(dG_unfold=5,m_unfold=-2,\n", + " b_native=1,m_native=0,\n", + " b_denat=0,m_denat=0,\n", + " osmolyte=None,T=298.15,R=0.001987):\n", + " \"\"\"\n", + " Linear extrapolation unfolding model. \n", + "\n", + " Parameters\n", + " ----------\n", + " dG_unfold : float, default=5\n", + " unfolding free energy in water\n", + " m_unfold : float, default=-2\n", + " effect of osmoloyte on the folding energy\n", + " b_native : float, default=1\n", + " intercept of the native baseline\n", + " m_native : float, defualt=0\n", + " slope of the native baseline\n", + " b_denat : float, default=0\n", + " intercept of the denatured baseline\n", + " m_denat : float, defualt=0\n", + " slope of the denatured baseline\n", + " osmolyte : numpy.ndarray\n", + " array of osmolyte concentrations\n", + " T : float, default=298.15\n", + " temperature of experiment in K\n", + " R : float, default=0.001987\n", + " gas constant (default is kcal/mol)\n", + "\n", + " Returns\n", + " -------\n", + " signal : numpy.ndarray\n", + " protein fraction folded signal as a function of osmolyte\n", + " \"\"\"\n", + " \n", + " RT = R*T\n", + " dG = dG_unfold + m_unfold*osmolyte\n", + " K = np.exp(-dG/RT)\n", + " \n", + " fx = 1/(1 + K)\n", + " native_signal = (m_native*osmolyte + b_native)*fx\n", + " denatured_signal = (m_denat*osmolyte + b_denat)*(1 - fx)\n", + "\n", + " return native_signal + denatured_signal\n", + " \n", + "# Parameter for staphylococcal nuclease d+phs protein, pH 7.0\n", + "gen_params = {\"dG_unfold\":11.9,\n", + " \"m_unfold\":-4.2,\n", + " \"b_native\":1.5,\n", + " \"m_native\":-0.15,\n", + " \"b_denat\":0.1,\n", + " \"m_denat\":-0.03}\n", + "\n", + "# Generate data\n", + "T = 298\n", + "R = 0.001987\n", + "err = 0.020\n", + "num_points = 50\n", + "osmolyte = np.linspace(0,8,num_points)\n", + "\n", + "y_obs_clean = linear_extrapolation(osmolyte=osmolyte,\n", + " R=R,T=T,\n", + " **gen_params)\n", + "y_obs = y_obs_clean + np.random.normal(0,err,num_points)\n", + "y_std = err*2\n", + "\n", + "test_fcn = linear_extrapolation\n", + "non_fit_kwargs = {\"osmolyte\":osmolyte,\n", + " \"R\":R,\n", + " \"T\":T}\n", + "\n", + "# ------------------------------------------------------------------------\n", + "# Run analysis\n", + "\n", + "f = dataprob.setup(some_function=test_fcn,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f,x_label=\"[denaturant]\",y_label=\"fluorescence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1e506d8e-707e-412a-a819-f3fee2c94ae7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "not doing corner plot for parameter b_native\n", + "not doing corner plot for parameter m_native\n", + "not doing corner plot for parameter b_denat\n", + "not doing corner plot for parameter m_denat\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAYAAACmKP9/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbA0lEQVR4nO3deVhU5eMF8DMzrDOyKWAiIqYpI66omUuppanlUlkZhftuauKa+5LmhpmmBaW5ZKmVlX7dl9zLpRRFHRVRFhXFwQUYBJyZ9/cHPyZRNhFmuZzP88xT3LkMZ5CZM/fe975XJoQQICIiIkmRWzoAERERlTwWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEmRn6QBSYjQacePGDbi4uEAmk1k6DpFVEUIgNTUVPj4+kMu5bUFU2ljwJejGjRuoUqWKpWMQWbWEhAT4+vpaOgaR5LHgS5CLiwuA7DcwV1dXC6chAMjI0iN40V4AwLrQ1+DkwD95S0lJSUGVKlVMrxMiKl18tytBObvlXV1dWfBWwiFLDzsnJYDsfxcWvOXx8BWRefBAGBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgnjtTJK0hIRrpv+PjIyEg13en2k9PT3h5+dnrlhERKWOBU+SFR8fj6BGQWg++gcAQMuWLWF4mJnnukqlEhqNhiVPRJLBgifJ0mq1eJCebvr68OHDeW7BazQahISEQKvVsuCJSDJY8FRmNGjQAE4O/JMnorKBg+yIiIgkiAVPREQkQSx4IiIiCWLBExERSRALnoiISIJY8ERERBLEgiciIpIgnhRMNik+Ph5arbbAdTQajZnSEBFZHxY82Zz4+Hio1WqkPzJLXX7KuXmYIRERkfVhwZPN0Wq1SE9Px9q1a6FWqwtc18WtPIb9dM5MyYiIrAcLnmyWWq1GUFBQgetkZOkBsOCJqOzhIDsiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCTIztIBiKyFRqMpdB1PT0/4+fmZIQ0R0bNhwVOZ5+npCaVSiZCQkELXVSqV0Gg0LHkisnoseCrz/Pz8oNFooNVqC1xPo9EgJCQEWq2WBU9EVo8FT4TskmdpE5GUcJAdERGRBLHgiYiIJIgFT0REJEEseCIiIgliwRMREUkQC56IiEiCWPBEREQSxIInIiKSIBY8ERGRBLHgiYiIJIgFT0REJEEseCIiIgliwRMREUkQC56IiEiCeLlYsirx8fFFui47EREVjAVPViM+Ph5qtRrp6emFrqtUKuHp6WmGVEREtokFT1ZDq9UiPT0da9euhVqtLnBdT09P+Pn5mSkZEZHtYcGT1VGr1QgKCrJ0DCIim8ZBdkRERBLEgiciIpIgFjwREZEEseCJiIgkiAVPREQkQSx4IiIiCWLBExERSRALnoiISIJY8ERERBLEgiciIpIgFjwREZEEseCJiIgkiAVPREQkQSx4IiIiCWLBExERSRALnoiISIJY8ERERBLEgiciIpIgFjwREZEEseCJiIgkiAVPREQkQSx4IiIiCWLBExERSRALnoiISIJY8ERERBLEgiciIpIgFjwREZEEseCJiIgkiAVPREQkQSx4IiIiCWLBExERSRALnoiISIJY8ERERBLEgiciIpIgFjwREZEE2Vk6AJGt0Wg0ha7j6ekJPz8/M6QhIsobC56oiDw9PaFUKhESElLoukqlEhqNhiVPRBbDgicqIj8/P2g0Gmi12gLX02g0CAkJgVarZcETkcWw4Imegp+fH0ubiGwCB9kRERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIl4sls4iPjy/SddSJiKhksOCp1MXHx0OtViM9Pb3QdZVKJTw9Pc2QiohI2ljwVOq0Wi3S09Oxdu1aqNXqAtf19PSEn5+fmZIREUkXC57MRq1WIygoyNIxiIjKBA6yIyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAueiIhIgljwREREEsSCJyIikiAWPBERkQSx4ImIiCSIBU9ERCRBLHgiIiIJYsETERFJEAue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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f,filter_params=[\"native\",\"denat\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2434736a-0b68-4ad0-8132-72da09d90fb0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
dG_unfolddG_unfold11.0747280.8273639.40619112.7432645.0False-infinfNaNNaN
m_unfoldm_unfold-3.9321090.290666-4.518294-3.345924-2.0False-infinfNaNNaN
b_nativeb_native1.4955620.0141601.4670061.5241181.0False-infinfNaNNaN
m_nativem_native-0.1443550.011074-0.166688-0.1220230.0False-infinfNaNNaN
b_denatb_denat0.1199490.0227860.0739960.1659010.0False-infinfNaNNaN
m_denatm_denat-0.0339270.003871-0.041734-0.0261200.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "dG_unfold dG_unfold 11.074728 0.827363 9.406191 12.743264 5.0 False \n", + "m_unfold m_unfold -3.932109 0.290666 -4.518294 -3.345924 -2.0 False \n", + "b_native b_native 1.495562 0.014160 1.467006 1.524118 1.0 False \n", + "m_native m_native -0.144355 0.011074 -0.166688 -0.122023 0.0 False \n", + "b_denat b_denat 0.119949 0.022786 0.073996 0.165901 0.0 False \n", + "m_denat m_denat -0.033927 0.003871 -0.041734 -0.026120 0.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "dG_unfold -inf inf NaN NaN \n", + "m_unfold -inf inf NaN NaN \n", + "b_native -inf inf NaN NaN \n", + "m_native -inf inf NaN NaN \n", + "b_denat -inf inf NaN NaN \n", + "m_denat -inf inf NaN NaN " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "589152a0-5176-45ea-a257-6ae8614aef0e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/linear.ipynb b/examples/linear.ipynb new file mode 100644 index 0000000..a30682f --- /dev/null +++ b/examples/linear.ipynb @@ -0,0 +1,1140 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "be71f499-e425-48b8-9dc9-0af22afefc69", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0d36b125-4899-44ce-b6f2-c55cf1ab4118", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import pandas as pd\n", + "import dataprob" + ] + }, + { + "cell_type": "markdown", + "id": "7ea92915-bd72-4b53-a450-232aa0962d4e", + "metadata": {}, + "source": [ + "### Define model\n", + "\n", + "This is the model we will use to describe our experimental data. dataprob will find parameters to the model consistent with our data. \n", + "\n", + "+ The function must take at least one float argument somewhere in its \n", + " definition. These arguments are the parameters that will be estimated. \n", + "\n", + "+ The function must return a numpy array the same length as the numpy array of \n", + " observations.\n", + "\n", + "\n", + "The cell below defines a linear model ($y = mx + b$)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b749f9f1-4787-42c3-9f87-28bac05e8fc8", + "metadata": {}, + "outputs": [], + "source": [ + "def linear_model(m=0,b=0,x=None): \n", + " return m*x + b" + ] + }, + { + "cell_type": "markdown", + "id": "b5c39028-17f7-4605-920f-90b93644ead9", + "metadata": {}, + "source": [ + "### Generate some noisy data\n", + "\n", + "This is a step that only exists for the example. For real analyses, `y_obs` and `y_std` would hold your experimental data. (See the [documentation](https://datatprob.readthedocs.io/) for more information). " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "06fec716-1ef4-4abb-9fc2-348d75eaca67", + "metadata": {}, + "outputs": [], + "source": [ + "# Observed data will have a slope of -5 and an intercept of 100\n", + "gen_params = {\"m\":-5,\"b\":100}\n", + "\n", + "# Set up to collect 20 data points between -5 and 5, with an uncertainty on each \n", + "# observation of 1\n", + "num_points = 20\n", + "x = np.linspace(-5,5,num_points)\n", + "err = np.random.normal(0,1,num_points)\n", + "\n", + "# Generate y_obs and y_std. Make the estimated uncertainty larger than the\n", + "# noise to refuncertainty\n", + "y_obs = linear_model(x=x,**gen_params) + err\n", + "y_std = np.abs(err)*2\n", + "\n", + "expt_df = pd.DataFrame({\"y_obs\":y_obs,\n", + " \"y_std\":y_std})\n" + ] + }, + { + "cell_type": "markdown", + "id": "4b36a9a4-a822-44cb-b388-eb9a6fd6fc1f", + "metadata": {}, + "source": [ + "### Run analysis\n", + "\n", + "This runs the whole analysis. We pass in `x` values as non-fittable parameters to our linear model, then fit values of `m` and `b`. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "542f0664-966b-42cd-8333-9dc8634ca9e6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
mm-5.0204830.031675-5.087312-4.9536530.0False-infinfNaNNaN
bb100.0622940.12274699.803322100.3212660.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "m m -5.020483 0.031675 -5.087312 -4.953653 0.0 False \n", + "b b 100.062294 0.122746 99.803322 100.321266 0.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "m -inf inf NaN NaN \n", + "b -inf inf NaN NaN " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# we need to send `x` into our model as a non-fittable parameter holding the \n", + "# x-values for the line. \n", + "x = np.linspace(-5,5,num_points)\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "# Generate Fitter. (Set method to \"bootstrap\" or \"mcmc\" to see the other\n", + "# analysis methods in action). \n", + "f = dataprob.setup(some_function=linear_model,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "f.data_df = expt_df\n", + "\n", + "# Run fit\n", + "f.fit()\n", + "\n", + "# Show fit result dataframe\n", + "f.fit_df " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a7eb9dec-c5f0-479a-bb78-f471554b2757", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAALkCAYAAACleDscAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADiFklEQVR4nOzdeXwU9f3H8dfM7JX7IiEH95kAcgVF1HoioFWqoFYralu1/qxH1XrUggIqWq3WC6vUHh6o1UrEoxWkoqJyCZFLwiU3JCSEJJtzz/n9kWQLCioKLEnez8fDR7I7s8NnaNl573e/8/katm3biIiIiIjIEWdGuwARERERkbZKYVxEREREJEoUxkVEREREokRhXEREREQkShTGRURERESiRGFcRERERCRKFMZFRERERKJEYVxEREREJEoUxgHbtvF6vWj9IxERERE5khTGgerqapKSkqiuro52KSIiIiLShiiMi4iIiIhEicK4iIiIiEiUKIyLiIiIiESJwriIiIiISJQojIuIiIiIRInCuIiIiIhIlCiMi4iIiIhEicK4iIiIiEiUKIyLiIiIiESJwriIiIiISJQojIuIiIiIRInCuIiIiIhIlCiMi4iIiIhEicK4iIiIiEiUKIyLiIiIiESJwriIiIiISJQojIuIiIiIRElUw/i8efM499xzyc7OxjAMZs6cuc/2SZMmkZubS1xcHCkpKQwfPpxFixbts8+ePXu49NJLSUxMJDk5mSuvvJKampojeBYiIiIiIt9PVMN4bW0tAwYM4Kmnntrv9l69ejF16lRWrlzJJ598QpcuXRgxYgRlZWWRfS699FK++OIL5syZwzvvvMO8efP41a9+daROQURERETkezNs27ajXQSAYRi88cYbnHfeeQfcx+v1kpSUxH//+1/OOOMMioqK6NOnD5999hlDhgwBYNasWZx99tls376d7Ozs7/RnNx+3qqqKxMTEQ3E6IiIiIiLfqsXMGff7/fzlL38hKSmJAQMGALBgwQKSk5MjQRxg+PDhmKb5teksIiIiIiJHG0e0C/g277zzDhdffDF1dXVkZWUxZ84c2rVrB0BJSQkZGRn77O9wOEhNTaWkpOSAx/T5fPh8vshjr9d7eIoXEREREfkGR30YP+2001i2bBm7d+/m2Wef5aKLLmLRokVfC+EH44EHHmDy5MmHsMqWq7i4mOLi4gNuz8rKIisr6whWJCIiItGgTBAdR/00lbi4OHr06MHxxx/P3/72NxwOB3/7298AyMzMpLS0dJ/9g8Ege/bsITMz84DHvPPOO6mqqor8t23btsN6DkezadOmkZ+ff8D/pk2bFu0SRURE5AhQJoiOo35k/KvC4XBkismwYcOorKxk6dKl5OfnAzB37lzC4TBDhw494DHcbjdut/uI1Hu0u+aaaxg9ejQARUVFjBs3junTp5OXlwegT8AiIiJthDJBdEQ1jNfU1LBhw4bI402bNrFs2TJSU1NJS0tjypQpjB49mqysLHbv3s1TTz3Fjh07uPDCCwHIy8tj1KhRXH311TzzzDMEAgGuv/56Lr744u/cSaWt299XTnl5eQwePDhKFYmIiEg0KBNER1TD+JIlSzjttNMij2+55RYArrjiCp555hnWrFnD888/z+7du0lLS+PYY4/l448/pm/fvpHXvPTSS1x//fWcccYZmKbJ2LFjeeKJJ474uYiIiIiIHKyohvFTTz2Vb2pzXlBQ8K3HSE1N5eWXXz6UZYmIiIiIHBFH/Q2cIiIiIiKtlcK4iIiIiEiUKIyLiIiIyKEzZAh06ND4U75Vi2tt2FapEb+IiIgcbs15o6ioCCDys9mB8obf7+eBBx4A4O6SEowdOw5/sa2EwngLMW3atG9cNXTixIlMmjTpyBUkIiIirc5X88a4ceP22a68cegpjLcQasQvIiIih1tz3mjOGoDyxmGmMN5CqBG/iIiIHG7KG0eebuAUEREREYkSjYyLiIiIyA/icDi44oorGh88+2x0i2lhFMZFRERE5AcxTZMuXbpEu4wWSdNURERERESiRCPjIiIiIvKDhEIhli5dCsCxgBHdcloUhXERERER+UFCoRDvvvsu0BjG5bvTNBURERERkShRGBcRERERiRKFcRERERGRKFEYFxERERGJEoVxEREREZEoURgXEREREYkStTYUERERkR/E4XBwySWXND549tnoFtPCKIyLiIiIyA9imia9evWKdhktksJ4C1NQUMD48eMBuPTSS5kyZQpjxoyJclUiIiLSkjQ0NFBaWsratWv58ssv2b17N16vl127drF582bWrFkT2XfYsGH06NGDY445huTkZOLi4mjfvj29evWie/fuJCUlYRgGbrebxMREPFE8r5ZIYbwFKSgoYOzYsRx//PEAJCcn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nTrRu3dvunXrxsknn0x4eDgOh4OkpCSsViuxsbF07NgRt9vNypUrSUlJYeDAgSQkJBBiswFQeugQu3fvpmPHjmRkZHhqsdu1a4fNZuPkk08mKCiIrVu31vubAGJjYwkJCaGkpISwsDASEhJISkqiXbt2xMfHExUVRWxsLDExMdhsNoJrmnsd61j46vj7urwWnYyvWLGCyy67jBEjRtClSxcuv/xyhg0bxurVq4HqK6dZs2Zx//33c9lll3HKKafw2muvsW/fPj744ANzgxcREWmE26dNY6Rh8FHNchgw6f336bZxIzt37mTq1KkmRie+UNuUoa66Nar+KsflclFeXk5ERIRnnc1mw2azUVJSUm+7iooKKioqiI6O9uzHbrdjs9koLS0lLi4Ol8tFUE3n4+XLl3Pw4EGysrJ45513ePvttyktLQWgqqqKTz/91JMou91uYmJisFgsHDp0CIDo6GgcDke9v8ntdmOz2bBYLFRUVFBVVUVkZCRlZWUEBwdjsViw2WyeildbTfLvrmnqdbRj4avj7+vyWnQyfsYZZ7B06VK2bt0KwHfffcf//vc/Lr74YgB27txJTk4OF1xwgec1MTExDB48mJUrVx613Nq2TnUfIiIiZpo1axZJXbow46ST+LQmabIB7wI3REYya9YsM8MTHzhSonakhM7X5djtdk8tcy23243b7a6XoNvtdoKDgwkODsbpdHr243K5cLvdhIeHU1BQgN1up7KyEoAhQ4bQrl07UlJSGDJkCGeccQbh4eEAWK1WLrnkEioqKoDqpNnhcGAYBmFhYcAvTYXr/k02mw23241hGAQHB2O1WikuLiY0NJSKigoMw8DtdnuagtQm4bVJ+dGOha+Ov6/La9EzcN577704nU569uxJUFAQlZWV/OUvf2HChAkAnnY6HTt2rPe6jh07ep47kpkzZ/LQQw/5L3AREZFG6tu3L0899RRjx47l2aFDca9ezaiiIoKBOcXFfD5zJn010kpAi46OprS0lPz8/HqJXGP7qzW2nOjoaDp06MD27dvZsmVLvTbjKSkp9bZLTEwkKSmJTZs2kZ2dfVib8ezsbJKTkyksLCQ3Nxebzcbpp5/OggULcLlctG/f3pMch4eH07lzZ/bv309xcTElJSUcPHgQu92O2+1m48aNVFZWcuKJJ9b7mwAKCws9tfm1bcaLiorqtRkv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kmrGRURERERMomRcRERERMQkSsZFREREREyiZFxERESabP78+UyYMAGACRMmMH/+fJMjkkDx2WefkZCQQEZGBgADBgwgISGBDz/80OTImpeScREREWmS+fPnM3bsWGJjYwGIjY1l7NixSsjluD777DOuueYa8vLyiIiIACAqKoq8vDxuuummNpWQKxkXERGRJvnLX/7CsGHDmD17NgCzZ8/mwgsv5NFHHzU5MjFDeHg44eHhDdp2/vz5FBQUEBMTw9ChQwG49NJLad++PQ6Hg3feecefobYoSsZFRESkSbZs2cLw4cOxWKonQLdYLFx00UVs3rzZ5MikudlsNu6++27uvvtuLA3Y/uDBg1RVVZGQkIC9ZtbWoKAgUlJSKC8vp6CgwL8BtyBKxkVERKRJevbsycKFCzGM6mleDMPg888/p1evXiZHJi1du3btsFqt5Obm4nK5AKisrCQrK4uQkBDi4uJMjrD5aNIfERERaZJp06YxduxYHA4HAFOmTGHVqlVqMy7HNWbMGD744APy8vJYunQpAB9//DFOp5OEhATGjRtncoTNRzXjIiIi0iRjxozhvffew+l0AuB0Opk/fz6jR482OTJpbuXl5bzyyiu88sorGA3Y/uKLL+a1116jffv2lJSUAFBUVET79u156aWXuOyyy/wbcAuimnERERFpsjFjxtClSxcyMjKYN28e/fv3NzskMYFhGOzevbtRr7n44ovJzc1l3bp1ZGRksGbNmjb5+VHNuIiIiIiISZSMi4iIiIiYRMm4iIiIiIhJlIyLiIiIiJhEybiIiIiIiEk0moqIiIiIeC0kJMTsEAKSknERERER8YrNZuNPf/pT9cLf/25uMAFGzVREREREREyiZFxERERExCRqpiIiIiIiXqmoqODtt98G4ErAYm44AUXJuIiIiIh4paqqim3btpkdRkBSMxUREREREZMoGRcRERERMYmScRERERERkygZFxERERExiZJxERERERGTaDQVERERabTs7Gyys7MB2Lx5c71/AZKSkkhKSjIlNmn59Pn5hcUwDMPsIMzmdDqJiYnB4XAQHR1tdjgiIiIt3owZM3jooYeO+vz06dOZMWNG8wUkLUenTpCVBSkpsHfvETfR5+cXSsZRMi4iItJYdWs2j6Qt1WzKrwwYADk5kJgIa9YccRN9fn6hZBwl4yIiIiJiDnXg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unaCocbS1PKBLyYmhgMHDtRrI15UVKSKjTbM6XRit9vrdYTLz8/H6XQ2+Vwh0hwMw2jUZIF5eXmUlpYyc+ZM0tPT+frrr5k9e7YfI2y5fNpm/NChQxiG4elosnv3bt5//3169+7NsGHDfLkracNqxy93uVyUlJTgdrux2WxERERgt9tbZG1waGgonTt3xul0eoYri46O9urHVVPLB77ExERyc3M5cOCAp814bGys1/0UJHDVnh/qstvtnknZRFqb9PR0evfuzY4dO8wOxTQ+TcYvu+wyxowZwy233EJhYSGDBg3CZrORl5fH008/za233urL3UkbFajNL0JDQ31asxWox0F+ER0dTbt27XC73Z7mSzabzdPRV9oeu91OaWlpvYmUXC6XT0ZTEZGWyafJ+Lp16/jb3/4GwLvvvktiYiLr16/nvffe48EHH1QyLhIg1B69+URFRREbG4vNZsPtdnsm35K2KTo6mtLSUvLz8+vViOsCTaT18mkyXlpaSlRUFACLFi1izJgxWK1WTjvtNHbv3u3LXYmIH6k9evOwWCyeixq3201YWBhhYWGeTvHS9oSGhpKYmOhp0hYeHu51kzYRadl8moyfcMIJfPDBB4wePZqFCxdy++23A9UziumqXiRwqD1687Db7VRWVhIfH+9ZV1sjKiIibYNPk/EHH3yQq666ittvv53zzz+f008/HaiuJe/Xr58vdyUifqRmKNX83VwnkJokqOlS8ygrKyMnJwf4pf14aWkpiYmJqh2XFs1isZCQkGB2GAHJp8n45Zdfzplnnkl2djannnqqZ/3QoUMZPXq0L3clIuJ3/m6uE0hNEtR0qXk4nU4Az92SyMhIr4c21IWUNIeQkBB+97vfVS88+qi5wQQYnybjUD1UV3FxMYsXL+bss88mLCyMgQMHqg2kiASc5miu4+tRdvxFTZeahz+GNtSFlEjL5tNkPD8/nyuuuIJly5ZhsVjYtm0b6enp3HDDDcTFxfHUU0/5cnciIn6lGsNf6Fg0D38MbagLKZGWzafJ+O23305ISIhnitNa48eP54477lAyLiIicgz+6EegCylpDuXl5bz00ksA3AqoPUTD+TQZX7RoEQsXLqRTp0711nfv3l1DG4qIiBxHIPUjUFt0qcswDHJzc80OIyD5NBkvKSk54q20gwcPaqguERGRBgiUfgRqiy7iGz5Nxs866yxee+01/vznPwPVw9xUVVXx+OOPc9555/lyVyIiImIitUVvW2rverRv3560tDSTo2ldfJqMP/HEE5x//vmsWbMGt9vNPffcw6ZNmzh48CDLly/35a5ERETERGqG0jbk5eVhtVo9dz3Cw8PZvHmzEnIfsvqqoPLycv7whz/w8ccfc+aZZ3LZZZdRUlLCmDFjWL9+Pd26dfPVrkRERESkGTidTqqqqpg5cyYzZ86ktLSUvLw8s8NqVXxWMx4SEsL3339PXFwc06ZN81WxIiIiImKy9PR0s0NotXxWMw7VHTf+9a9/+bJIEREREWnhLBYLMTExxMTEmB1KwPFpm/GKigrmzp3LkiVLyMjIICIiot7zTz/9tC93JyIiIiItQEhICFOnTq1eePJJU2MJND5Nxjdu3Ej//v0B2Lp1a73nLBYN/+4NjecqIiIi0vr4NBlftmyZL4uTOjSeq8jR6WI1cOm9E5G2zqfJuPiPxnMVOTpdrAYuvXcirUN5eTmvvPIKADcCag/RcErGA4Rqh0SOThergUvvnUjrYBgG+/btMzuMgKRkXEQCni5WA5feOxFp63w6tKGIiIiIiDScasZFREQaQZ1ORcSXlIyLiIg0gjqdiogvKRkXERFpBHU6FRFfUjIuUkO3nkWkIXQuEDmy8PBws0MISErGRWro1rOIiMjx1VZUtW/fnrS0NABycnIYOnQoAOVPPonNtOgCj5JxkRq69SwiInJ0eXl5WK1WT0VVeHi4JzHv1asXpaWlAOwBOgEVlZVKNBtAx0ikhm49i4iIHJ3T6aSqqoqZM2cCcN9995GXlwdAaWkpM2fOJD09neibboKabeX4lIyLiIiISIOlp6cfti44OJigoCByc3MJDlZ62Rg6WiIiIiLiFYvFQmlpqaepijScZuAUERERETGJknEREREREZMoGRcRERERMYmScRERERERkygZFxERERExiUZTERERERGvWSwWrFbV8zaWjpiIiIiIeKW8vJyePXsyatQos0MJOAGfjHfp0gWLxVLv8dhjj5kdloiIiIjIcbWKZioPP/wwN910k2c5KirKxGhERERERBqmVSTjUVFRJCYmmh2GiIiISJsUHBxMZmYmBQUFpJsdTIBpFcn4Y489xp///GfS0tK46qqruP322wkOPvqf5nK5cLlcnmWn09kcYYqIiIgEhB07dgCQ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802zQwlYe/bs4Y9//CNvvPEGoaGhZofTKlRVVdG/f38effRR+vXrx80338xNN93Eiy++6LN96Pzddvj6PBfsk1ICxJ133smkSZOOuU16ejrZ2dkA9O7d27PebreTnp5OZmamP0MMOA09pl988QUrV648bPrYAQMGMGHChBZRO9ESNPR41tq3bx/nnXceZ5xxBv/4xz/8HF3r0b59e4KCgti/f3+99fv37ycxMdGkqALfbbfdxieffMJXX31Fp06dzA4nYK1du5YDBw7Qv39/z7rKykq++uorZs+ejcvlIigoyMQIA09SUlK933SAXr168d577/lsH235/N2Wzqn+OM+1qWQ8ISGBhISE426XkZGB3W7np59+4swzzwSgvLycXbt20blzZ3+HGVAaekyfffZZHnnkEc/yvn37GD58OG+99RaDBw/2Z4gBpaHHE6prVM477zzPnRurtU3d6PKKzWYjIyODpUuXeoYsraqqYunSpdx2223mBheADMPg97//Pe+//z7//e9/6dq1q9khBbShQ4fyww8/1Ft33XXX0bNnT/7v//5PiXgTDBky5LBh6LZu3erT3/S2fP5uC+dUf57n2lQy3lDR0dHccsstTJ8+ndTUVDp37swTTzwBwLhx40yOLjClpaXVW46MjASgW7duqkFrgqysLM4991w6d+7Mk08+SW5urue51lYL4S933HEH1157LQMGDGDQoEHMmjWLkpISrrvuOrNDCzhTpkzh3//+Nx9++CFRUVGeNqIxMTGEhYWZHF3giYqKOqwdakREBPHx8WqH30S33347Z5xxBo8++ihXXHEFq1ev5h//+IcpNdKt9fzd2s+pfj3PeT0eSyvldruNO++80+jQoYMRFRVlXHDBBcbGjRvNDqvV2Llzp4Y29MLLL79sAEd8SMM999xzRlpammGz2YxBgwYZ33zzjdkhBaSjfRZffvlls0NrNTS0ofc+/vhj4+STTzbsdrvRs2dP4x//+IcpcbTm83drPqf68zxnqdmBiIiIiIg0s8BupCQiIiIiEsCUjIuIiIiImETJuIiIiIiISZSMi4iIiIiYRMm4iIiIiIhJlIyLiIiIiJhEybiIiIiIiEmUjIuIiIiImETJuIiIiIh4ZdKkSYwaNeqY25x77rlMnTrVp/udMWMGffv29WmZzS3Y7ABEREREJLA988wzaFL3plEyLiIiItLGud1ubDZbk18fExPjw2jaFjVTEZE2JTc3l8TERB599FHPuhUrVmCz2Vi6dKmJkYmINJ9zzz2X2267jalTp9K+fXuGDx/Oxo0bufjii4mMjKRjx45cffXV5OXleV7z7rvv0qdPH8LCwoiPj+eCCy6gpKQEOLyZSklJCddccw2RkZEkJSXx1FNPHRaDxWLhgw8+qLcuNjaWV155xbP8f//3f5x44omEh4eTnp7OAw88QHl5uU+PhdmUjItIm5KQkMDcuXOZMWMGa9asoaioiKuvvprbbruNoUOHmh2eiEizefXVV7HZbCxfvpzHHnuM888/n379+rFmzRo+//xz9u/fzxVXXAFAdnY2V155Jddffz2bN2/mv//9L2PGjDlq05S7776bL7/8kg8//JBFixbx3//+l3Xr1jU6xqioKF555RV+/PFHnnnmGV566SX+9re/efV3tzRqpiIibc4ll1zCTTfdxIQJExgwYAARERHMnDnT7LBERJpV9+7defzxxwF45JFH6NevX727hnPnziU1NZWtW7dSXFxMRUUFY8aMoXPnzgD06dPniOUWFxfzr3/9i3nz5nkqOV599VU6derU6Bjvv/9+z/+7dOnCXXfdxZtvvsk999zT6LJaKiXjItImPfnkk5x88sm88847rF27FrvdbnZIIiLNKiMjw/P/7777jmXLlhEZGXnYdtu3b2fYsGEMHTqUPn36MHz4cIYNG8bll19OXFzcEbd3u90MHjzYs65du3b06NGj0TG+9dZbPPvss2zfvt1zQRAdHd3ocloyNVMRkTZp+/bt7Nu3j6qqKnbt2mV2OCIizS4iIsLz/+LiYi699FI2bNhQ77Ft2zbOPvtsgoKCWLx4MZ999hm9e/fmueeeo0ePHuzcubPJ+7dYLIc1c6nbHnzlypVMmDCBSy65hE8++YT169czbdo03G53k/fZEikZF5E2x+12M3HiRMaPH8+f//xnbrzxRg4cOGB2WCIipunfvz+bNm2iS5cunHDCCfUetUm7xWJhyJAhPPTQQ6xfvx6bzcb7779/WFndunUjJCSEVatWedYVFBSwdevWetslJCSQnZ3tWd62bRulpaWe5RUrVtC5c2emTZvGgAED6N69O7t37/b1n246JeMi0uZMmzYNh8PBs88+6+mpf/3115sdloiIaaZMmcLBgwe58sor+fbbb9m+fTsLFy7kuuuuo7KyklWrVvHoo4+yZs0aMjMzmT9/Prm5ufTq1euwsiIjI7nhhhu4++67+eKLL9i4cSOTJk3Caq2fdp5//vnMnj2b9evXs2bNGm655RZCQkI8z3fv3p3MzEzefPNNtm/fzrPPPnvE5D/QKRkXkTblv//9L7NmzeL1118nOjoaq9XK66+/ztdff80LL7xgdngiIqZITk5m+fLlVFZWMmzYMPr06cPUqVOJjY3FarUSHR3NV199xSWXXMKJJ57I/fffz1NPPcXFF198xPKeeOIJzjrrLC699FIuuOACzjzzzHpt1AGeeuopUlNTOeuss7jqqqu46667CA8P9zw/cuRIbr/9dm677Tb69u3LihUreOCBB/x6HMxgMTRdkoiIiIiIKVQzLiIiIiJiEiXjIiIiIiImUTIuIiIiImISJeMiIiIiIiZRMi4iIiIiYhIl4yIiIiIiJlEyLiIiIiJiEiXjIiIiIiImUTIuIiIiImISJeMiIiIiIiZRMi4iIiIiYhIl4yIiIiIiJvl/04iAj5QT6XkAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the summary and save as a pdf\n", + "fig = dataprob.plot_summary(f,\n", + " x_axis=x,\n", + " x_label=\"x\",\n", + " y_label=\"y\")\n", + "fig.savefig(\"summary-fig.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b2db827d-b606-458d-a332-e94858daef09", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "image/png": "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Af0kCeT8gZxdujj5q1Wrdt59AuF5VBaB/v2WOAZ/cupxlOV59FtwuSIAALBQDAAAgIViUEmEh4dr0qRJCg8PtzvKrxLI+QM5uxT4+StaMPx7cQz+w47jYPIhAACwMGIAAAAsFAMAAGChGAAAAAvFAAAAWCgGAFBBvF6v3RGA86IYAEA527x5s9LS0hQSEmJ3lIuq5KK2QL247fjx43ZH8EsUg0pu37592rRpU8A+sQM1tyQdPHhQ3333nXbu3KnCwkK741yQrVu3aurUqfwGXAYbN25UYmKi5s2bZ3eUi+bQoUPKzMxUenq6JFn3tAik5+PGjRs1bNgw7du3z+4ofodiUInt3btXzZo10wMPPKCNGzfaHeeC7NixQ998840cDkdAvRiV2LRpk6699lr1799fiYmJevHFF+2OVGbr169Xy5Yt5fP5rN+AA/F7UBHWr1+vTp06aezYsXr00UftjnNRbNy4UVdffbWuvfZadezYUcnJyfr6668lKWCejxs2bFCbNm102WWXqW7dupJO3rwr0GRlZWnbtm1avXp1qe2/+XtgUGmtX7/exMfHm0suucR06NDBbNiwwRQVFRljjPF6vTanO7tt27aZ0NBQ43A4zNKlS40xxvh8PntDXYD09HRTo0YNM3bsWLN161bzl7/8xbhcLpOTk2N3tPPasGGDcbvd5s9//rPdUfze9u3bjdPpNE899ZQxxpjCwkIzZ84ck5qaaubOnWs2b95sc8ILt3fvXlO3bl2TkpJili5dahYvXmyaNm1qunbtambNmmXt58/Px40bN5rIyEjzP//zP6W2Hz582J5Av9KGDRtM48aNTUJCgnE4HKZXr17mvffesx7/Ld8DikEllpWVZe666y6zb98+06RJE9OxY0ezdetWY4yx/utvDh48aG699VbTp08fM2jQIBMREWE+++wzY4x/vxiV8Pl8ZsyYMaZv377WtuPHj5vf//73Zu3atWbTpk0mMzPTxoRnt3PnTnPJJZeYu+66yxhjTHFxsZk6dap58MEHzd133202btxoc0L/UVxcbP72t78Zh8Nh3njjDWOMMT179jSJiYnm8ssvNx6Px1x33XXm3//+t71BL9CiRYtM06ZNS5XYzMxM07t3b3PVVVeZuXPn2pju/Pbt22dq165tevToYW0bPXq06dGjh2nZsqVJSUkx2dnZNiYsm/3795vGjRubcePGme+++85s3LjRXHfddaZz587m8ccft14Lf+1rIqcSKrG4uDht3rxZ2dnZWr58ubKysnTPPffo1ltv1ciRI3XixAm/Gxbcv3+/6tSpo7vvvlvTpk1TcnKybrrpJn3++edyOBx+PxzocDh09OhRORwOHTt2TJI0efJkLV68WEOHDtX111+vESNGaN26dTYnPd3KlSsVHh6uunXrauvWrerVq5fmzZunTZs2afPmzfrd736n9957TxKnFkJCQtS3b1+lpqZq1KhRqlWrlqKjozV37lylp6dr4cKFCg0N1T/+8Q/l5ubaHfeC5Ofn68iRI5KkwsJC1a5dWzNnzlSVKlX0yiuv6ODBg5L892egSZMmioyM1Ntvv62rrrpKW7ZsUfv27TVgwABNnz5d99xzj/Lz8+2OeU47d+6Uw+HQ/fffrxYtWigxMVHvvPOO2rVrp4ULF2rq1KmSfp77ccEuWoVBQCkuLjbGGHP77bebl156ydoeFRVlqlSpYt5//327op3Xd999Z32cnZ1t7r777tNGDrxerzl27JhdEc/pySefNDExMWbo0KFm6NChJiwszMyZM8ccOnTIfPLJJ6ZTp04mNTXV7phn9PLLL5vWrVubunXrmhtvvNFkZmaaEydOGGOMuf/++0316tX9dsTDDllZWeapp54y119/vVm3bl2px+bPn28cDofZtGmTTeku3K5du0xUVJT5y1/+Ym0rLCw0xhize/duU7VqVfPCCy/YFe+cSk6P7tq1y/Tu3dt4PB7Tu3dvc+DAAWufTZs2mYiICPPyyy/bFbNM1q5da+rWrWu+/PJLY4yxTgEfPHjQ3H333aZLly5m/fr1xphfN2pAMajknn32WTNx4kRjjDHDhg0ztWrVMnXr1jVXXXXVaS9kdjvbD3jJk+HUcjB+/Hgzffp0qwD5g1PzP/7442bSpEnmhhtuMGPGjCm136233mquv/76io53TqfOOXn55ZfNjTfeaL755ptS+xw4cMBUq1bNvPPOOxUdz6/t37/frFq1yhQUFBhjfv63XLZsmUlISDB79+61M16ZleR+7bXXTGhoqJk5c6Yx5uTPdcnz7OabbzYjRoywLeP5lBzD7t27zYgRI8wnn3xy2mPt27c3Dz30kC35yio7O9tceumlZvjw4da2ku9BTk6OqVOnjnnkkUd+9d8fehFHNxCAPB6PvvzySw0bNkyffPKJvv76a3k8HtWpU0fjxo3TwoUL/ea2pWcbFqtevbomT54sh8Oh2267TVdffbU+/vhjbdiwwa+uG3c4HPJ6vQoJCdHEiRMlSX/84x8VGxsr6eSsaKfTqaioKDVu3Nja1x84nU4r34gRI9SpUyclJCRIOjlk7HA4lJ2drbp166px48Y2p/UvNWvWVI0aNayfX6fz5BncRYsWqXr16nK73XbGK7OS3H369NHOnTt13333qbCwUPfdd5/1c1pUVKTo6Gg7Y55Tyc9xfHy8nn76aYWFhZV6LC8vT1FRUWrWrJmNKc/NGCOPx6Pp06erd+/eio+P1//8z/8oJCRExhjFxsaqd+/e1qWkvwbFoJLr3LmzJkyYoIiICC1atEgNGjSQJGVkZCg7O9tvSsH5VK9eXU888YSWLFmi//73v/r222+VmJhod6zT/PKNvlq1apo+fbpuueUWFRcX66OPPtInn3yi5cuX+00pKOF0Oq0S0KZNG2t7yRveu+++q8jISDVq1MiuiH7r1FK7detWvf7665o5c6aWL1+uSy65xL5g52D+/xyBXxbymJgYjRo1SpGRkRo5cqSWL1+uevXqKS8vTytWrLDOb/uDMx1DScE5U4FJTU3VDz/8oF69elVMwF+h5Fiuv/56TZs2TQ8++KCOHz+ulJQURUVFSZKys7NVs2bNX/8/+Q2jGfBzGRkZ1nmmszl+/Lh57bXXTFpamrWt5HyVncqS/VRer9c8+OCDJiQkxC/O2ebm5p7zks+S0wqHDx821113nQkJCTFNmzY1LVu2NN9++20FpTyz82X/pf/85z9m1KhR5pJLLrE9e0XLyMgwS5YsMa+//rrZv3+/ycvLM8ac/bTX1q1bzcCBA03r1q399t+qZM5IydyBc/niiy9M7969TY8ePUyfPn3Mhg0byjtemVzIMRhjzMKFC82AAQOMx+Pxu1Oo51JUVGTeeustExERYa6//nozYMAAM2zYMON2u0vNxbpQFIMgtW7dOhMVFWX+9a9/nXWfkgLgb5f5lSX7LzPv3LnTDB482C+e1GlpaaZevXrm1VdfPeu/7S+3L1y40Kxevdr8+OOPFRHxrC40+08//WSefPJJ07Zt20p3ueKGDRtM7dq1zdVXX23q1q1rGjdubFJSUsyePXuMMT9Pgv2ldevW+e0Eze+++87cfvvtpmfPnub66683X3zxhTU3osQvXzeOHz9ujPn5zdhuZTmGU78vxcXF5j//+Y/p16/fb3ozLQ9lfW3+7rvvzAMPPGBuu+02c/fdd//mX44oBkFo/fr1pmrVqmb06NFnfNzr9Zb6gfvlk8ZOvyV7yW9rdnvmmWeMw+EwLpfrjLObT50QWfKi6i8uJHvJG0ReXl5ALM50Mf3444+mZcuW5i9/+YvJzc01xhgzatQo43Q6ze2332527NhRav/nn3/ePPPMM3ZELbP09HQTHR1thg8fbsaOHWvuuOMO43A4zKRJk8zu3btP23/v3r2lnov+8AvGhR7Dvn37rI/96bm4fft2s3r1amPM2RebK3kuljxeMjpyMUZ8KQZBZvPmzSY6Oto8/PDDxpiTPzxLliwxc+bMMQsXLjxt/zFjxpiHH37YLy7t+7XZS16Y/cWiRYvMfffdZ/7+978bh8Nhpk+fbj12apHxp3/7EheSfcyYMX6VvSL997//Na1btzbff/+99UL8ww8/mMaNG5sOHTqYwYMHm4MHDxpjjDly5Ijp2bOn6d69uzl06JCdsc9pwoQJplevXqW2vfjiiyY2NtakpKSY/fv3W9unTJliateu7XejRMFwDNu2bTORkZGlVnY916m9TZs2lSo1F6OgUQyCiM/nM3379jURERFmzZo1prCw0Pz+97837du3N3Fxccbtdpu+ffuW+s36+eefN9WrVzdZWVk2Jg/s7L+0fv16k5CQYPLy8sykSZOM0+k077zzjhk1apR55plnrCeuP+YP5OwVae7cuSY2NrbU8a9evdp07drVjB071jRo0MC6xtyYk6sDlpxi8FcPP/yw9aZ66m+df//7343b7TavvPKKtS0zM9NcffXVp42M2C3QjyE7O9v07t3b3HTTTWbgwIEmJibGugT7TOVg+vTpJiwszHz88ccXNQfFIMjk5OSYq6++2nTp0sW0atXK3HDDDWbTpk3m+++/N19++aWJi4uzlrQt4S9rhAdy9hI+n89kZWWZtm3bWueRX3jhBeNwOM44Icif8gdy9org9XqtF+cTJ06YxMRE07NnT/PZZ5+ZxYsXG7fbbf73f//XGGNM586dzb333muMMX61lsa5TJs2zURFRVnD66eOED322GOmatWqpYbj/fG4Av0YNm7caO68807z6aefmu3bt5uhQ4eamJgY85///McY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the corner plot and save as a pdf\n", + "fig = dataprob.plot_corner(f)\n", + "fig.savefig(\"corner-fig.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b6ca3466-ffaa-4246-b839-c2e5018fec56", + "metadata": {}, + "outputs": [], + "source": [ + "## Fit quality here" + ] + }, + { + "cell_type": "markdown", + "id": "e84ebf12-1995-496e-b311-ef86e71d7f0e", + "metadata": {}, + "source": [ + "### Modify parameter guesses and bounds" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "02ba201d-73c2-43d4-b6f6-cc897cea2ecb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameguessfixedlower_boundupper_boundprior_meanprior_std
name
mm0.0False-infinfNaNNaN
bb0.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name guess fixed lower_bound upper_bound prior_mean prior_std\n", + "name \n", + "m m 0.0 False -inf inf NaN NaN\n", + "b b 0.0 False -inf inf NaN NaN" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = np.linspace(-5,5,num_points)\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "# Generate Fitter. (Set method to \"bootstrap\" or \"mcmc\" to see the other\n", + "# analysis methods in action). \n", + "f = dataprob.setup(some_function=linear_model,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "f.data_df = expt_df\n", + "\n", + "f.param_df" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e5ae9c31-c835-48d6-9f76-3fcfbea0a85d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameguessfixedlower_boundupper_boundprior_meanprior_std
name
mm10.0False-infinfNaNNaN
bb200.0False95.0infNaNNaN
\n", + "
" + ], + "text/plain": [ + " name guess fixed lower_bound upper_bound prior_mean prior_std\n", + "name \n", + "m m 10.0 False -inf inf NaN NaN\n", + "b b 200.0 False 95.0 inf NaN NaN" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.param_df.loc[\"m\",\"guess\"] = 10\n", + "f.param_df.loc[\"b\",\"lower_bound\"] = 95\n", + "f.param_df.loc[\"b\",\"guess\"] = 200\n", + "f.param_df" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8f98f57b-3d34-4645-9ec0-40b4de3a614d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
mm-5.0204830.031675-5.087312-4.95365310.0False-infinfNaNNaN
bb100.0622940.12274699.803322100.321266200.0False95.0infNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "m m -5.020483 0.031675 -5.087312 -4.953653 10.0 False \n", + "b b 100.062294 0.122746 99.803322 100.321266 200.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "m -inf inf NaN NaN \n", + "b 95.0 inf NaN NaN " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit()\n", + "f.fit_df" + ] + }, + { + "cell_type": "markdown", + "id": "b9aead4b-3e0e-47b2-8302-a4878cb0cc72", + "metadata": {}, + "source": [ + "### Run an MCMC analysis\n", + "\n", + "This analyzes the same data using the same model, but instead of finding the maximum likelihood paramter estimate, it uses a Bayesian sampling approach to find the posterior distribution of the parameters. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "63e0276e-0b0b-464e-83c1-46af53c1742e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████| 100/100 [00:01<00:00, 60.37it/s]\n", + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
mm-5.0191580.044304-5.108874-4.9333270.0False-infinfNaNNaN
bb100.0566040.17374399.724416100.4120740.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "m m -5.019158 0.044304 -5.108874 -4.933327 0.0 False \n", + "b b 100.056604 0.173743 99.724416 100.412074 0.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "m -inf inf NaN NaN \n", + "b -inf inf NaN NaN " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAALkCAYAAACleDscAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADi3ElEQVR4nOzdd3wVVf7/8dft6Z2QEJqAkADSAiKCAoIUV1ASO9gLumBf11UssC7y1XXXBqtYV0XXVYlldQVdQQVBWgQpoff0flNvbpnfH4T7IwrYIDfl/Xw88kgyM3f4nGjuvHPmzDkmwzAMRERERESk0ZkDXYCIiIiISGulMC4iIiIiEiAK4yIiIiIiAaIwLiIiIiISIArjIiIiIiIBojAuIiIiIhIgCuMiIiIiIgGiMC4iIiIiEiCtKowbhoHT6UTrHImIiIhIU9CqwnhFRQWRkZFUVFQEuhQRERERkdYVxkVEREREmhKFcRERERGRAFEYFxEREREJEIVxEREREZEAURgXEREREQkQhXERERERkQBRGBcRERERCRCFcRERERGRAFEYFxEREREJEIVxEREREZEAURgXEREREQkQhXERERERkQBRGBcRERERCRCFcRERERGRAFEYFxEREREJEIVxEREREZEAURgXEREREQmQRgnjX3/9NRMmTKBdu3aYTCY++OCDBvtnzpxJcnIyoaGhREdHM3r0aFatWtXgmJKSEiZPnkxERARRUVFcf/31VFZWNkb5IiIiIiInRaOE8aqqKvr27cu8efOOur979+7MnTuXjRs3snz5cjp37syYMWMoLCz0HzN58mQ2b97M559/zscff8zXX3/NTTfd1Bjli4iIiIicFCbDMIxG/QdNJt5//30uvPDCYx7jdDqJjIzkf//7H6NGjSIrK4uePXuyZs0aBg4cCMCiRYs477zzOHjwIO3atftZ//bh85aXlxMREXEimiMiIiIi8qs1uTHjdXV1vPDCC0RGRtK3b18AVq5cSVRUlD+IA4wePRqz2fyj4SwiIiIiIs2FNdAFHPbxxx9z2WWXUV1dTWJiIp9//jlxcXEA5OXlER8f3+B4q9VKTEwMeXl5xzyny+XC5XL5v3c6nSeneBERERGRX6HJhPGRI0eyfv16ioqKePHFF7nkkktYtWrVj0L4LzFnzhxmzZp1Aqts/nJzc8nNzT3m/sTERBITExuxIhEREWksygFNT5MZphIaGkq3bt0444wzePnll7Farbz88ssAJCQkUFBQ0OB4j8dDSUkJCQkJxzznfffdR3l5uf/jwIEDJ7UNzcH8+fNJTU095sf8+fMDXaKIiIicJMoBTU+T6Rn/IZ/P5x9iMmTIEMrKyli3bh2pqakALFmyBJ/Px+DBg495DofDgcPhaJR6m4upU6cyceJEALKyspgyZQoLFiwgJSUFQH8Ni4iItGDKAU1Po4TxyspKdu7c6f9+z549rF+/npiYGGJjY5k9ezYTJ04kMTGRoqIi5s2bR3Z2NhdffDEAKSkpjBs3jhtvvJHnn38et9vN9OnTueyyy372TCpyyNFuP6WkpDBgwIAAVSQiIiKNRTmg6WmUML527VpGjhzp//6uu+4C4Oqrr+b5559n69atvPbaaxQVFREbG8ugQYNYtmwZvXr18r/mzTffZPr06YwaNQqz2Ux6ejrPPPNMY5QvIiIiInJSNEoYHzFiBMebzjwjI+MnzxETE8Nbb711IssSEREREQmoJvMAp4iIiIhIa6MwLiIiIiISIArjIiIiIvLzDBwI7dsf+iwnRJOd2rA104T8IiIicrIczhlZWVkA/s+HHS1n1NXVMWfOHO7cvp2IiopGq7U1UBhvgubPn3/clUMffvhhZs6c2XgFiYiISIvxw5wxZcqUBvuVMxqXwngTpAn5RURE5GQ5nDMOZwxAOSOAFMabIE3ILyIiIieLckbTogc4RUREREQCRGFcRERERI7LarVy9dVXExIaGuhSWhwNUxERERGR4zKbzXTu3BkslkCX0uKoZ1xEREREJEAUxkVERETkuLxeL6tXr6auri7QpbQ4CuMiIiIiclxer5dPP/2U2traQJfS4iiMi4iIiIgEiMK4iIiIiEiAKIyLiIiIiASIwriIiIiISIAojIuIiIiIBIjCuIiIiIhIgCiMi4iIiMhxWa1WLr/8coJDQgJdSotjDXQBIiIiItK0mc1munfvDlZFxxNNP9EmLCMjgxkzZgAwefJkZs+eTVpaWoCrEhERkeairKyM3bt38/3337Nt2zaKi4vJyckhJyeH/fv3+48788wz6dixIwkJCbRt25auXbvSo0cP+vbtS/v27YmIiCAoKCiALWm5FMabqIyMDNLT0znjjDMAiIqKIj09nYULFyqQi4iIyE8qKytj3bp17N69m6ysLEpLS8nJyaGoqIiysjKKi4v9x9psNnbs2IFhGJjNZkwmExUVFZSVlXHWWWcRHR1NUVER/d1u7AFsU0ukMeNN1OzZsxkzZgxz584FYO7cuZx77rk8+uijAa5MREREmoPs7GxqampwuVxERETQuXNnwsLCiIuLo7i4mOjoaP+xp59+un97UlISDoeD+Ph4qqurKS4uxjAMFi5cSG1NTQBb1DIpjDdRW7duZezYsZhMJgBMJhPjxo0jKysrwJWJiIhIc1BVVYXNZqOmpsY/xMRkMmG326mqqiIuLs5/rMViIT4+HqfTic1m8/eQWywWKioqsNls+Hy+QDWlRVMYb6KSk5NZvHgxXq8XAMMwWLRoESkpKQGuTERERJqD0NBQ3G43wcHB1NbWAofyRF1dHaGhoRQVFfmP9Xq9FBQUEBERgdvtxmQy4fP58Hq9hIeH43a7MZsVG08GjRlvombMmEF6erp/PNfvf/97Vq9eTUZGRoArExERkeYgKSmJvLw8HA4HTqeT0tJSKisrKSoqIjY2lj179viPXb16NZWVlXTr1o3s7Gzi4+MpKCigW7duxMbGYhgGdrtGi58MCuNNVFpaGu+++y733nsvAKWlpbzzzjtMmjQpwJWJiIhIcxAVFUVqairR0dHYbDa2bduGzWbzD0OJjY31d/q53W5OPfVUEhISaNOmDV26dGkwm0pQUBA2my3ALWqZFMabsPPOO4+1a9fy2GOP8Yc//IFhw4bhcrlwOByBLk1ERESagaioKAYMGMCAAQN+tC8zM5PU1FQAVqxYcdRjDqurqztpNbZ2GvzThHk8HnJycoBDt482bdpESUmJf9yXiIiIiDRvCuNNmM/no7SkBBOwe/duvvrqKzZs2KBALiIiIo3KarVy0UUXERwSEuhSWhwNU2nCfD4f6Vu2cBnweF4eW7Zswev14vF46NevH7GxsQQHBwe6TBEREWnhzGYzvXr1Aqui44mmnvEmzDx3Ltfs2cNk4O/79pG/bx/btm1j2bJlrFmzhuLiYqqqqn7VuTMyMpg8eTIAkydP1iwtIiIiLdzevXuZO3cuI0eOJCIigoEDB/r3jRo1iksvvZTFixfr7nsj0583TZilWzdcJhMOw2BUdTWhW7dyb/38oF6vF6/Xy+DBgzEMg7CwsJ993oyMDNLT0znjjDOAQw93pKens3DhQtLS0k5Wc0RERCRA9u7dy5tvvsnSpUvZt28fFRUVhIaG+jv1ysrKWLVqFZWVldTW1jJ27Fj/QkFw6G59VlYW3T0eNKfKiaWe8SasaMgQbj/1VCrqvz+juppnsrKoPniQrKwsVqxYwYoVKyguLqaiouK45zrS7NmzGTNmDHPnzgVg7ty5nHvuuTz66KMnoRUiIiISaBs2bCA3NxfDMCgsLCQ+Pt7fKQeHOuaKi4upra3lm2++wel0Nni9x+Phvffeo6a6urFLb/EUxpuw9u3bUztkCKOBUpMJgL61tTy/dSvegwfZsmULK1euZNmyZRQXF//oF+dYtm7dytixYzHVn9NkMjFu3DiysrJOVlNEREQkgEpKSoBD1/zq6moSExMbzBseGxtLdXU1FouFiooKXC5XoEptdRTGm7CqqioiIiJYDVyRlERh/TK03V0u5mdlYT14kM2bN7N69Wq++uoriouLKS8v/8nzJicns3jxYgzDAA4tjbto0SJSUlJOZnNEREQkQGJiYoBD1/yQkBByc3Nxu93+/cXFxYSEhOD1egkPD9eaJo1IY8absNDQUOLj4wHwpqRwbWgoz+/cSXuvl05uNy9u28Z0w2Czz4dhGHg8HoYPH45hGERFRR3zvDNmzCA9Pd0f3KdNm8aqVav0EKeIiEgL1bdvXzZt2sTWrVtp06YNe/bs4dtvv/XvLysro3PnzgQFBTF06FAiIiICWG3rop7xJq5bt27AodtH4f37c32PHuysv62U6PHwwrZtJOTmsmnTJtatW8eSJUsoLCyktLTU3/P9Q2lpaSxcuNA/rMXpdJKRkcGkSZMap1EiIiLSqDp37szkyZO58MIL6dSpE+Hh4VQfMf47KiqK008/ndtuu+1HD2/KyaWe8SbMZrPRpUsXAHr37k1xcTF2u50bTSbm7thBr7o6Yr1ent+2jdvcbjZ5vRiGgdvtZtSoURiGQXR0tH9s+JHS0tLo3LkzqampLFiw4LhL4IqIiEjz17lzZ6ZPn8706dMByMzMJDU1FYAvvvhCWSBAFMabOGv95PrJycl4vV5WrVoFqalMs1p5Yts2BtbWEu7z8Y9du7jb52NT/es8Hg9jxozBMAxiYmKOGshFREREJLAUxpuJTp06ERkZicViYeXKlVhTU7nDbObRrVs5u6aGYMPgqd27+ZPXyyqvF7fbjc/n49xzz/UHcrNZo5JERETkl7NYLFxwwQUE/eMf8AumU5afpjDeTJjNZrp27YrVasVut7NixQpMAwZwv8XCA1lZjKuqwg78dd8+Znq9/M/nw+v1Nughj42NVSAXERGRX8xisdCvXz+wacmfE01hvAnKzc0lNzcXwD/39+HPhmGQkJDA2WefzbJlyzD3789sq5WqzZtJr6jAAjxy8CBhPh/v18+w4vV6GwRyi8USqKaJiIhIgB3OGUeuL3Lk14mJiSQmJgaitFZJYbwJmj9/PrNmzWqwbcqUKf6vH3roIW688UasVivLli3DZDLxjNVK1aZNXFVWBsC9OTmEeb287vMB+AM5oEAuIiLSiv1Uznj44YeZOXNmg/0+n4+dO3dyiseD+sZPLIXxJmjq1KlMnDjxmPsP/8VqtVoxm82sWLECgJdNJpybNzO9fpWtafn5hHo8zDtiyMq4ceP8PeQiIiLS+hzOGVlZWUyZMoUFCxY0WPjvaL3iHo+Hf/3rX9xZXa0wfoIpjDdBP/f2UEJCAlar1f9QJ8D7NhsV33/PfUVFAFxTXEyY18vjhoGvfnGgw0NWPB7PSW2HiIiIND0/zBkpKSma1jCAFMabubi4OPr27YvVasVqtWIymVhqsVC5YQOPFBRgBi4qKyN0505mHTGGfPTo0bhcrkCXLyIiItKqKYy3ANHR0fTp0wer1YrNZsNsNvOd1cqd333HE3l52IDxTichO3bwp/ohKz6fj/bt2wPgdrsD2wARERGRVkphvIWIiIjgtNNOw2Kx+BcK2mO18vt163g2J4cgYHhlJU/v2MHdhsFmwyAnJweAsrIyXC4XDocjgC0QERERaX0UxluQ0NBQevfu7R+yYjabOWAycdP69cw7cIBww+D06mr+sW0bdwBF9ePKt27dSu/evYmNjSUoKCigbRARERFpTRTGW5jg4GB69uyJxWLBbrdjMpnIsVq53mLh+X37iPH5OM3l4vmtW7m+QwcA1qxZQ+fOnUlNTSU2Npbg4OAAt0JERESkddByjC2Qw+EgJSWFwYMHc/rpp9O+fXtMgwZxbZcu5NevwHlqXR0L9u7lFGD37t189dVXfPvttxQXF1NdXR3YBoiIiEiTYrFYGD9+vO6gnwTqGW+hbDYbPXr0wGKxYLPZ+PbbbykYNIhrLRae37mTjl4vHb1elgE3ZGezadMm/1zkQ4cOxTAMQkNDA90MERERaQIsFgunn3462O2BLqXFURhvwaxWK927d/fPsrJixQrMAwdyg9XK3O3b6e52kwS8efAg0x0ONtXPsuLxeDjrrLMwDIOwsLBAN0NERESkxVIYb+HMZjNdu3b195AvW7YMs9nMTSYTT23bRj+3mxifj/k7d3Kb18umI1brHDFiBIZhEB4eHuhmiIiISAD5fD72799Pe69X4fEE08+zFTCZTHTu3Nk/w8o333yDxWLhxro6nti+neFAuGHw3J493O3zscnn8/eQn3POORiGQURERKCbISIiIgHi8Xh47bXXuLOqCiWCE0thvJUwmUx06NABq9WK3W7n66+/prhHD8Zt387HDgejXC6CDIOn9u7lTx4Pq30+DMPA6/UyatQofD4fUVFRgW6GiIiISIuiMN7KJCYmYrVasVgsFBYWUgvc060bf967l/OrqrABfz14kFk+H595PBiGgcfjYcyYMRiGQXR0dKCbICIiItJiKIy3Qm3atKF///7s2rULgA5du/LXqCiqvv+eSysqMAOzcnII9XpZ6PPhdrt/FMhNJlNgGyEiIiLSAiiMt1IxMTH06NEDgM6dO1MdH89coGLTJm4oLwfgj/n5hHm9vOr14q3/GDt2LIZhEBMTo0AuIiIi8hspjLdih2dJGTBgAEVFRZjNZt52OKj47jvuLC0F4PdFRYT7fDxjGP6HOsePH49hGMTGxiqQi4iIiPwGCuPCqaeeSs+ePbHZbAB8arFQ9d13PFBUBMCVJSWEejzMqZ9lxev1Mm7cOOBQD7vZrIVcRURERH4NhXEhKCiIXr16YbPZ/A93LjebuXf9eh7Nz8cCpDmdhOzcyUzwz7Iybtw4fw+5ArmIiEjLZbFYGD16NI5586CiItDltCgK4wKAw+GgZ8+emM1mfw/5ZquV29et4+95ediBcZWVhG3fzj1eL3V1dT8asmKxWALbCBERETkpLBYLQ4cOBbs90KW0OArj4me32+nZsycWiwWHw4HJZOKAxcLNa9cyNyeHEGBYdTVzd+zgdsPAqB9Hft5552EYBnFxcQrkIiIiIr+Awrg0YLVaSU5O9q/WuXr1arKtVm5cu5bnDhwgwjBIra1l/vbtTPf52Fg/ZGXs2LEAxMbGYrXqfysREZGWxOfzkZubS4LXi7rdTiylJvkRi8VC9+7dsdlsOBwOVqxYwUGzmWvNZl7Yv59Yn49edXW8tGMHN/t8fO/x4Kufj7xXr17Exsb6h7qIiIhI8+fxeHjppZe4s6qKiEAX08IojMtRmUwmTjnlFMxmM1arlWXLlpFjsXCN1coLe/aQ6PXS1e3m1Z07merzsb4+kHu9Xvr06UNMTAx2jSsTEREROS6FcTkmk8lE586dsdls2Gw2li1bxgGzmeusVp7buZPOHg/tPR7+uWsXNxsG6+vDuMfjoV+/fsTFxSmQi4iIiBxHo8xH9/XXXzNhwgTatWuHyWTigw8+8O9zu93ce++9nHbaaYSGhtKuXTuuuuoqcnJyGpyjpKSEyZMnExERQVRUFNdffz2VlZWNUX6rl5SUxMCBAxk5ciSdOnWizaBB3JSczNb6oShtvF5e3rWL6O3b2bBhA//73/9Yu3YthYWFuFyuAFcvIiIi0nQ1Ss94VVUVffv25brrriMtLa3BvurqajIzM3nwwQfp27cvpaWl3H777UycOJG1a9f6j5s8eTK5ubl8/vnnuN1urr32Wm666SbeeuutxmhCq5eQkMDAgQOxWq189dVXmEwmfm+x8PesLPrV1RHl8/Hyvn3cVFvL16Wl5Obmsn37dnr37k1kZCQOh4PExEQSExMD3RQRERFpBLm5ueTm5h5zv3LBIY0SxsePH8/48eOPui8yMpLPP/+8wba5c+dy+umns3//fjp27EhWVhaLFi1izZo1DBw4EIBnn32W8847jyeeeIJ27dqd9DYIxMXFkZqaisVi4euvv8YwDG43m3l0yxaGulyEGgYv5+VxSV4eb69bx9tvv93g9Q8//DAzZ84MTPEiIiLSqObPn8+sWbOOuV+54JAmOWa8vLwck8lEVFQUACtXriQqKsofxAFGjx6N2Wxm1apVTJo0KUCVtj7R0dH+HvLDq3Xeb7PxwMaNnFtTQxCQAdweFcU/ysoYNWoUI0aMoH///iQnJwe6fBEREWkkU6dOZeLEiQBkZWUxZcoUFixYQEpKCoB6xes1uTBeW1vLvffey+WXX05ExKHJc/Ly8oiPj29wnNVqJSYmhry8vGOey+VyNRiz7HQ6T07RrUx4eDgDBgzAZrNht9sxmUw8YjZT/f33XFBdjRV4tqwML7CioIADBw6QlJRE7969qaqqIjQ0NNBNEBERkV/AYrEwfPhwHHPnQkXFz3rN0YahpKSkMGDAgJNRYrPVpMK42+3mkksuwTAMnnvuud98vjlz5hz39khrdOT4raysrAaf4eeP3woNDaVv375YrVZsNhsmk4knrVYqNmxgSkUFZuB5YM6BA3wUGopRv2LnyJEjadOmDWFhYSejeSIiInIcvzYHWCwWRowYAQ5Ho9TZmjSZMH44iO/bt48lS5b4e8Xh0MODBQUFDY73eDyUlJSQkJBwzHPed9993HXXXf7vnU4nHTp0OPHFNyNHG781ZcoU/9e/ZPxWcHAwffr0wWKxYLPZsFgsvGyxULl+PTeXlwNwX1kZsdu385LHg8fjwe12M3r0aHw+X4P/xiIiInLyncgcICdGkwjjh4P4jh07WLp0KbGxsQ32DxkyhLKyMtatW0dqaioAS5YswefzMXjw4GOe1+Fw4NBfcA0cOX7raH7p+C273U7v3r2xWCxYrVZMJhMLbTZKV63ivvrbWDeVlBDq9fKUz4dhGNTV1TF+/HgMwyAyMvI3tUdERER+vl+bAwzDoLCwkFifD8vJKq6VapQwXllZyc6dO/3f79mzh/Xr1xMTE0NiYiIXXXQRmZmZfPzxx3i9Xv848MOrOKakpDBu3DhuvPFGnn/+edxuN9OnT+eyyy7TTCq/0MmYRshms9GrVy//GPK9e/cy2+fjIDCv/pjJ5eWEbt/OHA798eX1ehk3bhyGYfgf1BUREZGT69fmALfbzXPPPcedlZVEAG6Ph2+XLcPpdFJYWEhhYSFwaOa10NBQNmzYQFZWFnV1deTn57Nt2zYARowYwVlnnUXPnj2pqKjAMAzCwsKIjo7GZDJhMpmIiYmhW7dudOvWjZCQEFwuFw6Hg4iICIKCgk7kj6NJaJQwvnbtWkaOHOn//vDQkauvvpqZM2fy0UcfAdCvX78Gr1u6dOmh8UnAm2++yfTp0xk1ahRms5n09HSeeeaZxihffgaLxUL37t354osv+Oyzz2jbti3/qKqixmrlBY8HK3BhZSWh27bxgMeDr361zvPOO88fyE0mU6CbISIiIsdhGAYAXq+XgoICNm/eTH5+PrGxsdTW1rJ161ZKSkqoq6sjJCSEvLw81q1b539WzGq18t///pecnBx69epFXV0de/fuxWazERkZSWxsLB6Px3+uM844g6SkJKqrq6muriYhIaHFBfJGCeMjRozw/8c7muPtOywmJkYL/DRxFouFV199lbPOOotx48YxY8YMdpxxBpNXr+b1ujocwLlVVYTs2MEffD5/IP/d736HYRj+v4obkxYkEBGR1uS3Xvd89ZnNYj60iHt4eDg2m42YmBi8Xi+1tbUcOHCADh060KVLF/73v//Rtm1bevbsydKlSxk7dixLlixh7969jBkzBq/XS0lJCcXFxcTFxZGSkoJhGNhsNiorKykuLqZHjx6EhYVRXFyM0+lUGBc5nq1bt/LII4/Qo0cPADp27Mj3ZWWcv2kTHwIhwNCaGv6xYwe31ofxI3vIY2JiGjWQa0ECERFpTU7Udc/gUO/44ee/ampq/FMXW61WHA4HFouFiooKTj31VGw2GwA+n4+OHTvy3Xff+Ttjg4KC/AHcYrHg9Xqpq6sjLCyMiiOmUXQ4HA2mrG4pFMblhEpOTmbx4sUMHz4cgNTUVJYvX87BqCiuj4zkuf37iTIM+rtcvLhjB7f4fKz1+airq2PChAkYhkFsbGyjBXItSCAiIq3JibrumTh0R9xkMlFeXk5MTAxutxs4NOOdy+XC6/USHh7O/v37/cNUzGYz+/fvJzw83H+tr62txWQy+Z8pMwwDu91OZWVlg1nwXC4XISEhJ+pH0WQojMsJNWPGDNLT0ymvn9rwzTffZP/+/UyaNAmfzcbVwEsHDtDG5yPF7ebVnTuZ6vPxXf0v3+EhK7GxsZjrb4GdTFqQQEREWpPfet0z1wdor88HQEVFBfn5+dTU1FBbW+tf3C8vLw+n00nXrl1Zt24dVVVVACxevJjS0lL69etHdnY2dXV1lJeXY7PZKCoqYsuWLcTFxREREYHVaiU2NpbKykp/j3hLnBZZYVxOqLS0NBYuXMgDDzwAQE1NDa+99hqJiYksXbqU3SYTV1ksvLRvH0leL6d4PLy6axe3AN8ZBh6Ph/PPPx/DMIiLi2uUQC4iIiI/z+HebIvFQnx8PEFBQf7ZVMLDw0lJSWkwm0pCQgIDBw70z6bi8Xj43e9+R0pKin82lQ4dOvzkbCohISGaTUXk50pLS6Nz586kpqayYMECBgwYQHl5OVarlSVLlrDLbOZam43nd+6ki9dLktfLKzt3MtXjIdPtxufzcd555wEQGxuLxaIZTUVERALJYrEwZMgQ7A4HVFRgs1o566yzjnn8JZdc0uD7zMxMUlNT+fLLL3X3+QcUxqVRREZGMmjQIKxWK1999RXbLBZustl4eutWenk8xPl8vLJnD7d4vWTWP9g5btw4evbsSWxsLFar/lcVEREJFIvFwpgxY0CLKZ5wSjjSaMLCwkhNTfU/LW02m5lusfDXrCwG1tURaRi8tH8/t/p8rPN48Hg8eL1e4uPjqa2tPWYg1/SDIiIiv9zhhXqysrKOul/X18ahMC6NKiQkhH79+mGxWLDZbJhMJu6x2Zj1/fecXVdHiGHwjwMHuNvrZV394kAFBQXHnWNe0w+KiIj8chkZGQBMmTLlqPuPvL4ahkF5eTkRhoGe5jqxFMal0QUFBdGvXz9sNhsOhwOTycSDZjP3bdzIuJoaHMBTOTnc5/Gw2jA49dRTefLJJ0lJSSEvL49rrrlG0w+KiIj8RmlpabzwwgssWLAA4LjTHLrdbp5++mnurKig5c1nElgK43LCHLmq1+FbXkfe+jrydpfNZqN3795YrVb/sJX/s9mo+u470qursQJ/LShglmHwP58Pu91Op06daNu2LaDpB0VERH6rNm3aAPjD9+GvT9T19ZfkgtZMYVxOmKOt6nXkra8fDiexWq2kpKRgsViwWq1YLBbmWa1UrlvH1ZWVh15TWEiY18t7bjeGYdCpUyeAFrkCl4iISEvyS3NBa6UwLifMkat6Hc3R/vq1WCwkJydjs9mw2WyYzWbesFioWLuW6U4nAHeXlBCxfTt/LS6msKgIgKuuuopHHnmEyy677OQ0RkREpJkoKysjOzubqqoqrFYrPp+PwsJCcnJycLvdREZGEhERgd1uJz8/n/Xr13Pw4EEKCgoAuOuuu/j+++8BGD16NOeffz6nn346RUVFVFRUYLPZiI+PZ+PGjf5VNisrK3n7pZdISkqiW7du/pUynU4nLpcLh8PB1Vdf/YtzQWukMC4nzK+93WQymejatau/h9xkMvGRxULl2rX8qbQUgBtLS/GWlvLH+mVwDcPg8ssv938WERFpjcrKyti0aRNmsxmr1cqWLVs4ePAgwcHBVFVVUVNTw759+3A4HLjdbrKzsykqKvIvTw/w1VdfERMTAxy6Jr/xxhts2bKFHj16EBERgdfrZe/eveTl5WEYBgAer5fc3Fy8Xi9Op5OysjIiIiJwOBw4HA6qq6sxmUz07NmzRS7UcyLpgVhpEkwmE6eccgrDhw9n5MiR9OjRg68GD2ZGbCy++mNuBl7z+bACycnJ9OzZkzlz5viX2BUREWltsrOzMZvNnHLKKQQHB/s/DMOgW7du9OjRg7CwMIKDg6mursbj8dC1a1eSk5OJj48HIDo6mqFDhwLwu9/9jvj4eHbv3k379u3p0KED3bp1Izo6Grvd7l+B02q10qFDByIjI7HZbOzfv5+KigpiY2MJCwsjNjYWONRTLsenMC5NSvv27TnrrLMYNWoUycnJfD9kCHfFx+Op3z+ptpYM4OCOHQQHB7Nt2zYKCgqorB9jLiIi0ppUVVURGhoKQF1dHV6vl5CQEGprawkKCsJkMmGxWPD5fPh8h7q3QkNDMZlM/u/j4uL85wsKCqJt27Y4nU7/miAmk4ng4GDM5v8fG00mE1arFY/Hg81mo6amxh/UD3M4HHrG62dQGJcmJyEhgWHDhjF69Gh69OjBnjPO4BKrldr6/ROAeXv2kL11K2FhYXzyySfk5eVRUVERyLJFREQaXWhoqP8Osd1ux2KxUF1dTVBQELW1tRiGgdfrxWw2+8N0VVUVhmH4vy+qfx4LoLa2lvz8fP/wFJ/Ph2EY1NTUHAr39a8xDAOPx4PVasXtdvt74490eOy4HJ/GjEuTFBcXx9ChQ/3jyJfm5TF+9Wo+AsKBoW43H7rdTI2JYfny5Xg8Hs477zwMwyAiQjOgiohI65CUlERpaSl79uzBarVSU1NDTU0NwcHB7Ny5k5qaGjweDw6Hg5CQEKxWK7t27SIsLMz/AGdpaSnLly8H4OOPP6a0tJTU1FQOHjyI0+nE6/VSUVFBTEyMP8B7PB4OHDhAfHw8UVFRdOnShfDwcIqLixv0iOua/NMUxqXJioqK4swzz8Rut2O1WvnCbGb82rV85PEQA5wO/Csvj99v2MA39X+9jx8/HsMwiIyMDHT5IiIiJ11UVBS9e/f2z6bSs2dPkpOTf9ZsKocNHz7cP5sKwJVXXvmj2VR69epFbGwsto8/BsBqsZCYmHjM2VRCQkKIiIjQw5s/g8K4NGkREREMHjzYH8hXhIdz9uef8z+TiQTDINnt5tUdO7jJ6+Ubn4+6ujomTJiAYRhERUUFunwREZGTLioq6hdd8w7P9Z2ZmUlqaip///vfAUhNTeV///vfURf9MQyD6upqgu+9F0pLCQsL44YbbvjRcQrfv5zGjEuTFxoaysCBAxk7diynnnoqm4Er2rdnf/2tsk5eL//ctYu6DRv49ttvef/99zl48CClpaU/Gr8mIiIiv5zb7eaJJ56gUs9nnXDqGZcm7/ByuiaTyT+PeW379ky2WHh5/366+3wk+nz8c88ebvR4WFP/sMoFF1yAYRhER0f/6AlvERGR1q6wsBBouES9lqtvfArj0uQdbTndlStXAjAU+Nxspp/PR6zPxz/37+f3hsFqj6dBII+JiVEgFxEROUJGRgbQcIl6LVff+BTGpcmbOnVqg+V0vV4ve/bsITMzk82bNzNtzx7+vn07g91uIgyDFw8cYLrHw2qvF4/HwwUXXEDXrl0bPAUuIiLS2qWlpfHCCy+wYMECUlJSfrRfveKNQ2Fcmryj3SZLTU2lb9++LF26lFWrVvHH4GBmbtzISJeLYMPguZwc7vb5/D3kEyZMoEePHsTGxh41kGdkZDBjxgwAJk+ezOzZs0lLS2uU9omIiJxsZWVlLF26lCVLlpCZmcmWLVv8q2NeddVVxMTE0KtXL/r168f48ePp37+/piVsJArj0iyZzWa6d++O1WrFZrNhs9mYabVStWED59fUYAeeysvjfq+XNT4fHo+HiRMnkpKSQmxsLBaLxX+ujIwM0tPTOeOMM4BDT6Wnp6ezcOFCBXIREWn2ysrK+PDDD1myZAmFhYXk5+dTVlZGSEgI1dXVhISEUFRUxMGDB7FarZSVlQHQo0cPEhISNEPKSaZ79tJsmUwmunbtyqhRoxg+fDgpffvy5KBB/DskBAAL8FhhISO//541a9bwwQcfsHHjRoqLi/F6vf7zzJ49mzFjxjB37lwA5s6dy7nnnsujjz4aiGaJiIicUNnZ2WzevJnIyEisVisFBQXExcUxePBgAIYNG0Z8fDwFBQX+lTc3btwI4O89l5NHPePS7HXu3BmbzYbVasVisTDfZKJy3Tqur6wE4MHiYsI3bmShz4fP58PtdtO/f39iY2OxWq1s3bqVRx55xP+Ap8lkYty4cTz44IOBbJaIiMgJUVVV5V+Ix+fzUV1dTadOnfw93g6Hg3bt2rFx40YMw8But1NaWtpgJU2z2Uzfvn2x2e2BbEqLpDAuLUJSUhIjRozwD1t522rFuWYNd9b/RX9HWRlhGzfyan0Y93g8DBw4kLi4OJKTk1m8eDHDhw8HDi1ssGjRoqM+zCIiItLchIaG4nA4qK6uxmw2ExISQl5eHm3atAHA5XKRk5NDSEgIJpOJuro6oqOj/QEewGq1cuGFF8L06QFsScukMC4tRtu2bRk5ciQOhwOz2cxiq5WKVat4qH7s2w1OJ+EbN/Kk241hGLjdbs444wzuvfdeLr30UsrLywGYNm0aq1at8k/5JCIi0pwlJSXRq1cvlixZgsfjIT4+nl27drFq1SoAli9fTmVlJd26dcPpdBIREcFpp50GoIc4G4HCuLQoMTExnHXWWVitVsxmM6ssFu5dtYo5xcWYgUsrKwndvJm/eL3+IStDhw7l3//+t38uVafTSUZGBpMmTQpoW0RERE6EqKgoLrjgAiIiIliyZAnl5eUUFxf7x4PX1NQQFxdHUlISvXv3bjCbyuGhLIc7sWyAVu04sRTGpcWJjIxk6NCh2O12HA4Hm202bluxgr8XFmIHzq+pITQriweA2tpa3G43I0aM4JVXXmHIkCEsWLCAAQMGBLoZIiIiJ0xUVBSTJk1q0NGUmZlJamoqq1ev/snrntvtZs6cOdzpdKK+8hNLYVxapPDwcIYMGYLNZsNkMrEJuHnVKubl5REMjKyt5e9btvAHr5fFhoHH4/GPnRMRERFpLArj0mIFBwdz+umnY7PZsNvtfG+1csOqVTyfnU24YTDY5WJeVha3eb185vXStWtX4FBvuYiIiEhjUBiXFs3hcJCamuqf9vB7i4VrVq3ihf37iTUM+rjdvLBtG7d4PBQVFQFQUlLiXwRBRERE5GRSGJcWz2az0a9fP6xWKw6Hg3VmM9dYLLywZw+JhkF3j4dXdu7kmpoaAL7++muSk5NJTEwkNDQ0wNWLiIhIS6YwLq2C1WqlT58+2Gw2bDYbq81mrrVaeW7nTk7x+ejk9fKvgwcZBaxZs4bExETOP/98EhMTCQsLC3T5IiIi0kIpjEurYTabSUlJwWq1YrfbWW23M9Vm4+mtW0nxeknw+fgauCYri68iI/F4PFxwwQUkJiYSHh4e6PJFRESkBVIYl1bFbDbTo0cPfw/5N8A0i4W/bdlCf4+HWOCt/HxuWbuWZT6fP5C3b99eCx+IiEirZTab6dmzJ1abLdCltDgK49IqdenSBavVeiiQ22zcbbPx5/XrGeb1Eg68mJ3NbT4fyzwePB4PkyZNon379kRFRQW6dBERkUZntVq5+OKL4c47A11Ki6MwLq1Wx44dGTNmDDabDYvFwp21tTy8eTPnA8HAP3Jzudvn45v6HvK0tDQMwyA6OjrQpYuIiEgLoTAurVpiYiKjR4/GbrdTXFxM2ubN/NtuZ1JdHTbgqfx8Zqxdy3K3G6/Xy4UXXkiXLl2Ijo7GZNKCwCIiIvLbmANdgEigxcfHc8455zBkyBDcwKO9erGgfo5xMzCnuJhzvvuOFStW8N5777F9+3ZKSkowDCOgdYuIiDSWuro6Zs2ahdPpDHQpLY56xkWAmJgYBg4cCECPnj15NSqKyjVruLmyEoAZpaWEZ2byntuN2+3moosu4tRTTyU2NlY95CIiIvKrKYyL1Du8wM/QoUPZvXs371utVKxaxT31vQC3lZcTvmEDL3u9+Hw+0tLSSElJISYmBrNZN5lERETkl1MYF/mBvn370rt3bxwOB1+YzVSsWsWfy8oAuLaigtANG3jWMHC73aSlpXHaaacRGxurQC4iIiK/mMK4yA8EBQXRu3dvbDYbJpOJ9XY7d69cyeNFRViAS6qrCVu/nkc9Hnw+H263m/79+xMbG4vFYgl0+SIiItKMKIyLHIXdbmfgwIFYrVYcDgdrzWamrVjBM4WF2IHzamsJ2biRBzwevF4vbrebQYMGERcXp0AuIiIiP5vCuMgxWK1W+vfvj91ux2q1stZq5cZvvuG5vDxCgBEuF3/fsoV76nvH3W43Q4YMIS4uDqtVv1oiIiLy05QYRI7DYrHQu3dvLBYLdrud1VYr169YwfMHDxJpGJxeV8e8rCxu9Xj4oL6HfNiwYbRp0wablgwWEZEWwmw2c+qpp6qz6STQT1TkJ5jNZnr27IndbsfhcPCN2cy1K1cyf98+2hgGvd1uXty2jVu8Xv5T30s+cuRI4uLisNvtgS5fRETkN7NarVxxxRXwxz9CaWmgy2lRFMalVcvNzSU3NxeArKysBp/h0AqdiYmJmEwmf4+AzWZjudXKdVYrz+/aRZJh0M3r5ZUdO7jZ5+Njjwe3281pp52Gx+M5Zg/54XOLiIg0liOveytWrADgv//9r//aFxcXR5s2bQBdpxqLyWhFywg6nU4iIyMpLy8nIiIi0OVIEzBz5kxmzZp1zP0PP/wwM2fObLDt4MGDfPbZZyxbtozcb7/lH9u308XnA6DAbOamzp1xDBxITU0N//nPf37RuUVERE6mn7ruHemo16n27SE7G5KS4ODBE19gK6QwLq3akT0ER3OsXoG8vDy++OILlixZwv7Vq3kqK4teXi8ApSYTN7VvT1Xv3vTp04ezzjqLwsJCrr32WhYsWEBKSspxzy0iInKyHHndKywspKioCIA9e/bw4IMP8uyzz3LmmWcCDa9TdXV1PPHEE0x/7DEinE6F8RNIw1SkVfu1gTghIYFx48ZhsVj40mbjdpuN/9u4kYEeD9GGwT8PHGCq18tWu52kpCQ6d+4MQEpKCgMGDDjBrRAREfl5jnXdy8zM5MEHH+TMM8885nXK7XZD6+nDbTQK4yK/UmxsLOPGjSM4OJjPLBb+aLEwc8MGzna7CQVeysnh9tWreT07m/379wNw+eWXM2fOHNLS0gJbvIiItBhlZWVkZ2dTUlKCy+XCMAxKS0spKSnBZDIRExND+/btcTgcbN++ndWrV3Pw4EEMw6Bdu3bk5OTwv//9D4BRo0YxceJERowYQV5eHiUlJVitVtq0acPmzZtxezwAVFZV8c+5c4mIiODUU08lJSWFqKgoamtrcTqduFwuHA4HERERBAUFBfLH0+QpjIv8BlFRUYwaNco/F/lMm417161jbF0dQcC83Fyuys1lR2QkACEhIaSnp7Nw4UIFchER+c3KysrYtGkTbrebiooKcnJyKCoqwuVyYTKZsNlsFBUVsWPHDiwWCxs2bKCuro7g4GCqq6tZtGgR27dvJyYmBjg0g9jrr7/Ojh076NKlC6GhoTgcDvbu3Utubi6HRze73W6Ki4vxer2sX78ep9NJ3759qa2tBcDhcFBdXU11dTUJCQkK5MdhDnQBIs1dWFgYw4cP53e/+x39hwzhiSFDyKh/07ECC4Cp9W9eQ4YM4cwzz+Qvf/lL4AoWEZEWIzs7G7PZTFxcHCEhIXTo0AGLxUJYWBjdu3enbdu2tG/fHrfbzf79+7HZbHTp0oU+ffrQtWtX8vLyaNOmDaNHjwbgwgsvJD4+nqysLJKSkujevTudOnWibdu2hIaG+sO41WqlU6dOdOzYkZiYGIqLi9m+fTtw6M5xWFgYsbGxwKFn9uTY1DMucgKEhIRw9tlnY7PZsFqtPGexULFyJVfX1GAGHqt/I1q6di3R0dF89913OJ1OPUgsIiK/SVVVFaGhodTV1WEymTAMA7PZjN1ux2QyYbFY8Hq9OBwOqqqqCA4Oxmq1YrFY8Pl8VFVV0alTJ3/IttlsJCYmsmnTJv81rba2lpCQkAZT9ZpMJrz1ExfYbDZ8Ph/l5eU4HI4G9TkcDlwuV+P9QJohhXGREyQoKIihQ4cSFBSEzWbjLYuFgi++4J76aQ8fA57evJlZdjtRUVHs27ePjh07Elk/hEVEROSXCg0Npby8nPDwcAzDwGQy4fP5qKurwzAMfxB3uVyEhoZSWVmJx+PB6/ViNpsJDQ0lLy/PP9OX2+0mNzeX8PBw3G43Ho8Hq9VKdXX1oQc46xmGgcVi8b/GMAwiIyNxuVyEhYX5j3O5XISEhDTuD6WZURgXOYHsdjuDBg3CbrcfCuSFhRSvX8//1e+/vboaa3U1zyUm8tZbb3HxxRfTpUsXoqKiAlm2iIg0U0lJSZSWllJUVER1dTU5OTl4vV6qq6vZvn07NpsNs9mMzWajY8eObNiwgd27d5Obm+sfz719+3b/A5zvv/8+paWlDBkyhOzsbMrKynA4HBQWFvoDPIDH42Hfvn1ERUVht9vp0qUL3bt3p7a2luLi4gY94roLfHwK4yInmNVqpX///thsNmw2G+9brdyamcmz9T3k04C2e/fy9Jdf4vV6SU9Pp3v37kRFRWEymQJbvIiINCtRUVH07t2b7OxsrFYrISEhdO3a9ZizqXTq1Mk/m4rZbGbcuHH06dOHL774AjjU433VVVf9aDaVrl27kpCQQHBmJtTUYLPZiI2NPe5sKiEhIZpN5WfQoj8iJ4nP52Pbtm188skn/Pe//6Xd0qX8k///F/CioCAePe00Bg4bxsUXX0yPHj2Ijo5WIBcRkUaXmZlJamoq69atO/56GFqB84RTz7jISZKfn09NTQ3dunUjKSmJBYApPJyXKipwAONqawn9/nse9Plwu91ceumlpKSkEBMTo0AuIiIn3ZGrcWZlZTX4DFopurEojIucJPPnz2fWrFkNti2oqCAH+BAIA85yuXji++/5o9fLv3w+Lr74Ynr37k1MTIx/XJ6IiMjJcLTr1JQpU/xfP/zww8ycOROAuro6nn76aW6urCS8MYtsBRTGRU6SqVOnMnHiRP/3BQUFLF++nMzMTK7MzOSV/HyigYFuN89u2sTtbjdv1tVx8cUX079/f2JjYxXIRUTkpPnhdeqHftgrXl1djVH//JOcOArjIifJ0W7vDRgwgE8//ZQv27bl2q++Yv7evbQ1DHp5PLywdSu/93r5l8dDXV0dp59+OnFxcQrkIiJyUmgYStOgMC7SiOLj45kwYQIOh4P/WSxcv2wZz+3YQQfDoIvXy0vbt3OL18s7Xi9er5chQ4YQGxvrn8tVREREWhaFcZFGFhMTw/jx47FarXxmNnOT1cozW7dyqs9He5+PV3bu5Ob6QO52uxk2bBhxcXFYrfp1FRERaWl0dRcJgMjISMaPH09QUBCL7Ham2+38deNG+ni9tDEMXtmzh5vq6ni3fsjKyJEjadOmjQK5iIhIC6Mru0iAhIaGMnr0aBwOB59YrdxlsTB7wwYGezxEGgavHDzItOXLWejx4PF4GD16NG3atMFmswW6dBERETlBGuXJsK+//poJEybQrl07TCYTH3zwQYP9GRkZjBkzhtjYWEwmE+vXr//ROWpra5k2bRqxsbGEhYWRnp5Ofn5+Y5QvctIEBQUxfPhwLrjgAvoOH86MgQNZWh+2Q4H5OTnEf/MNGRkZ/Pe//yU/P5+6urrAFi0iIq2OyWSiXbt2mPUM0wnXKGG8qqqKvn37Mm/evGPuHzZsGI899tgxz3HnnXfyn//8h3fffZevvvqKnJwc0tLSTlbJIo3Gbrdz1llncfHFFzNw+HBmDx7MJ3Y7AA5gbn4+p65YwX/+8x8++ugjcnNzcblcgS1aRERaFZvNxo033khYaGigS2lxGmWYyvjx4xk/fvwx91955ZUA7N2796j7y8vLefnll3nrrbc455xzAHj11VdJSUnh22+/5YwzzjjhNYs0JqvVyqBBg7BarVitVp6yWqn69lsuqa3FAvy1sJCZy5fziceD1+tlwoQJJCQkEBQUFOjSRURE5DdoFmPG161bh9vtZvTo0f5tycnJdOzYkZUrVyqMS4tgsVgYMGAAdrsdm83Gq3Y7zmXLuKGmBoCZJSU88c03fOLxUFRUxMCBA4mNjT1qINfcsSIiEki5ubnk5uYec7+uU/9fswjjeXl52O12oqKiGmxv27YteXl5x3ydy+VqcDvf6XSerBJFTgiz2cxpp52G3W7HbreTYTZT+c033FFRAcAfyssJW7mSx7dv589//vMxz3PkEsYiIiK/ldvtZt68eVxfWUn4zzh+/vz5zJo165j7dZ36/5pFGP+15syZc9z/EUSaIpPJRHJyMpdccgk2m42ldjuVX33FA+XlANxcUUGYx8MzAwYw6IwzOOWUU7jnnntYsGABKSkpwI+XMBYREfktDMOgvLwcw+f7WcdPnTqViRMnApCVlcWUKVN0nTqGZhHGExISqKuro6ysrEHveH5+PgkJCcd83X333cddd93l/97pdNKhQ4eTWarICdO1a1cuueQSHA4HX1qt3Lt0KXNKSzEDU2pqCN+yhaeCg/F4PAB06tSJAQMGBLZoERERjj4MJSUlRdepo2gWYTw1NRWbzcYXX3xBeno6ANu2bWP//v0MGTLkmK9zOBw4HI7GKlPkhOvYsSPp6emHesitVm774gueLC7GBlxQW0vI2rXcX1YGQHZ2NhUVFYSH/5wbiCIiItIUNEoYr6ysZOfOnf7v9+zZw/r164mJiaFjx46UlJSwf/9+cnJygENBGw71iCckJBAZGcn111/PXXfdRUxMDBEREdx6660MGTJED29Ki9euXTvS09NxOBx8YbNx8xdfMDcvj2DgXJeL4G3bOA/473//S48ePejSpQsRERGBLltERER+hkaZZ3zt2rX079+f/v37A3DXXXfRv39/HnroIQA++ugj+vfvz+9+9zsALrvsMvr378/zzz/vP8eTTz7J+eefT3p6OmeffTYJCQlkZGQ0RvkiAdemTRsuvPBCxo8fT93o0dzUvj0V9fuGeTx8Aez49ltee+01tm/fTnn9+HIRERFp2hqlZ3zEiBEYhnHM/ddccw3XXHPNcc8RFBTEvHnzjrlwkEhLFx0dzYQJE3A4HHxqt3PdF1/w/L59xAKDgJd37uSuJUt4zeNh8uTJJCcn/2gGIhEREWlamsWYcRE5JCIigvPOOw+bzcYnFgs3fPkl/9i5k0TDIMXn4x+bNjGtro7XvV6mTJlCSkoKUVFRmEymQJcuIiLNmMlkok2bNpgtlkCX0uI0yjAVETlxQkJCGDduHOnp6SSNGcOUjh3ZU7/vFJ+Pl7ZtI/vzz/nnP//Jhg0bKC0tPe6dKRERkZ9is9n4/e9/T1hoaKBLaXHUMy7SDDkcDs455xzsdjsvlpQwbN8+vjCZSDYM2hkGr+zaxS0+H6+53VxxxRUMGDCAmJgY9ZCLiIg0MeoZF2mmbDYbZ511Fueeey45wI09evBd/e3DWMPgpd278SxZwuuvv863335LcXExvp+5WIOIiIg0DvWMizRjH330EY8//jgAWYWF3NSlC0/v2cOZHg8RwAv79zP9iy9Y4PHg8Xg488wziY2NxWzW3+EiIvLzud1uXnzxRa6qqiLsKPvz8vL49ttvWbNmDTk5OeTl5ZGdnU1BQQHFxcUADBkyhA4dOpCQkEC7du3o1asXqamp9OjRg8jISCIiIggKCmrchjUBuiKLNFMZGRmkp6f7Z0xJSkpi7Y4d3NqtG5/bbAAEA8/l5hK3dCkLFizgq6++oqioCK/XG7jCRUSk2TEMg8LCQnxHuX7k5eXx6aef8s0331BQUEBRURE5OTk4nU7y8/MJDg4GDt3R3bVrF0VFRZSUlLBlyxY+/fRTvv/+e0pLS8nLy6O2traxmxZwCuMizdTs2bMZM2YMc+fOBeCVV17hzDPPJM/p5O9nncWH9avP2oGn8vPp+uWX/Otf/+Lzzz9XIBcRkRNm+/btFBYWEhYWRocOHQgNDaVt27aUlJTQtm1bBg8eDMCAAQOIjY2loKCA9u3bY7fbiYqKYvfu3djqO5GcTmcgmxIQCuMizdTWrVsZO3as/6FMk8lEeno6paWlnD16NM+ffTYL6gO5Bfi/oiL6LV3KO++8w+LFiykoKMDj8QSwBSIi0hKUl5djNpuxWCzYbDY8Hg8hISFUVVWRlJTkv05ZrVbatm2L0+kkKCgIj8dDUFAQNTU1uFwuHA4HLpcrwK1pfBozLtJMJScns3jxYoYPHw4cuoW4aNEievbsyZQpUwgODubfdjtVS5cytboagAdLS3nyyy95x+Ohrq6O8ePH07ZtW6xWvRWIiMivExkZic/nw+v14vP5sFqtOJ1OQkNDyc7OJiYmBgCPx0N+fj4RERHU1tZitVqpra0lKirKH8RDQkIC3JrGpyuwSDM1Y8YM0tPTKS8vB2DatGmsWrWKjIwMOnTowGWXXYbdbudTi4WKpUv5Q0UFAHc6nYR//TXvut243W7OP/98EhIS/LcIRUREfonu3buza9cutmzZQllZGVVVVeTn5xMTE8O+ffuoru8QyszMpKqqih49enDw4EFiY2MpKytjwIABuN1uHA4HERERAW5N41MYF2mm0tLSWLhwIQ888ABwaJxdRkYGkyZNAiAhIYFLLrkEh8PBIrudhz//nFn1wf2GykrCvvmGV7xe3G43F1xwAYmJidjt9oC1R0REmqeEhATGjx9PdHQ0a9aswVM/g5dhGLRt29Y/m4rb7aZbt27ExcURExNDz549NZsKCuMizVpaWhqdO3cmNTWVBQsWMGDAgAb74+LiSE9PP9RDbrPxh0WLeKy0FAtwWXU1oStW8IzHg9vtJi0tjXbt2uGoH2cuIiJymMlkIjIyEtMxpsZNSEjgwgsv5MILL/zRvszMTFJTU1m5cuWPrlOiMC7S4kVFRTFp0iTsdjsfWyzctngxTxYWYgcm1NYS+u23POp24/F4uOiiizCbzZSWlh7zfImJiSQmJjZeA0REJOBsNht33HEHPPEE1N9lPZbc3Fxyc3P932dlZTX4rOtIQwrjIq1AWFgYEyZMwOFw8JHNxs2LFjE3N5cQ4Jy6OoLXrOGh+oc6CwoK/NMlHs3DDz/MzJkzG612ERFpXubPn8+sWbN+tH3KlCmAriM/pDAu0kqEhIQwfvx47HY7H9nt3PTpp8zbv59IYIjHwxOZmfzR4yHl7LN57733SEhIYO/evUyZMoUFCxaQkpICoN4MERE5rqlTpzJx4kTgUG/44RB++Fqi60hDCuMirYjD4eDcc88lKCiIDKuVGxct4h+7dhEH9PV6efb777nD6yU4OJgrrriCzp07A5CSkqJxfiIirZjb7eaf//wnl1dVEfYTxx5rGIquJUenMC7SythsNoYPH05QUBALHQ5u/OQT5m7fTpJh0N3r5blNm7jN6+U1t1tvmiIiAhxayyInJwefVm8+4RTGRVohi8XCGWecgc1m4x2zmZsXLeKpzZvpahh08vl4fssWprvdZGdnA1BVVRXgikVERFomhXGRVspsNjNw4ECCgoJ4227nVquVJ77/np4+H4mGwYs7dnBDfQjfvXs3ffr0ITIyMsBVi4iItCwK4yKtmMlk4rTTTsNut2Oz2bg3OJiZq1aR6vMRYxi8lp1NCfD+++/TrVs3evXqRVRUVKDLFhERaTEUxkWaoSPncP3h/K3wy+dw7dGjB1dddRUOh4MHLRbu+/ZbzvJ4CAcWAbd88w0vRkVx7bXX0qdPH6Kjo09kc0REpIU5fJ068tr0W65TLdnRl1ESkSZt/vz5pKamkpqa6p8yasqUKf5t8+fP/8Xn7NKlC1deeSUjJ07ksbPPZpHNBkAQ8EJREZGffsqLL77I2rVrKSkpwTCME9kkERFpQQ5fpw5fo+C3X6daKvWMizRDR87hejS/trehffv2XHXVVQQFBTHXaqVi6VIudruxAU8WFPDg4sW84vXi9XoZNGgQMTExmEymX9kKERFpTkJCQjCZf14/7uHr1OF5xo9crwK0ZsWRFMZFmqGTeXuvbdu2XHHFFTgcDv5RU0PJsmVM5dBttNlFRcxetIgX6+pwuVwMHTqU2NhYBXIRkRbObrdzzz33wNNPQ3n5Tx7/w+uU5hg/NoVxEfmR2NhYLrvsMnJycrh52TJcQUHcVlsLwIyyMp793/941ePB7XYzYsQIYmJiMP/M3hIRERH5/3T1FJGjioiI4NxzzwXg42HD+L+ICP++W51OJnzxBf985RU+++wzioqK8Pl8gSpVRESk2VLPuIgcU3BwMABjxo5lQ0ICD3z8MX8pKwPg+qoqwr78ktfqe8jHjRtHXFwcFoslgBWLiMjJ4Ha7efPNN7m4uprQQBfTwiiMi8hRZWRkMGPGDABeeukl0tPTyb7wQu7++GMeLyrCAlxaU0P4118z1+vF5XJx/vnn07ZtWwVyEZEWxjAM9u3bh9fjOeYxeXl5fPHFF6xYsYJNmzaxZcsWSktLATj99NOJi4sjMTGRLl26MGTIEIYOHUrXrl2JiIggKCiosZrS5GiYioj8SEZGBunp6f4FfqKjo3n00Ufp3LkzlWlpTG/bFlf9see5XPxx2TI+ePNN3n//ffLy8vAc581aRERanry8PN577z2WLl1KdnY2Bw8epKioyB+yg4ODyc/Pp7q6moKCAr755hs++eQTduzYQV5eHrX1zyW1RgrjIvIjs2fPZsyYMcydOxeAuXPncu655/Kf//yHK6+8EstFF3FL+/ZU1R8/wu1m5ooVfPLmm7z33nvk5ubidrsD1wAREWlU27dv58CBA8TGxmK32yksLKRNmzb07dsXgDPOOIPY2FgKCgpo27YtVquVmpoaDhw4AIDT6Qxk+QGlMC4iP7J161bGjh3rn7LQZDIxbtw4srKyGDp0KFdddRVRF1/M1FNOoaz+Nad7PPzf6tV8tmAB//rXv8jJyaGuri5gbRARkcZTXl6Oz+fD4XDg9Xqprq4mKSkJq/XQiGiz2UxiYiIVFRUEBwdjGAZWq5Xy8nIcDgcul+sn/oWWS2FcRH4kOTmZxYsX+1fZNAyDRYsWkZKSgslkYtCgQVx33XUkXXwxU7t3p7D+dX28Xp7OzGT5v/7Fm2++SXZ2tgK5iEgrEBkZidlsxuVyYbFYCAkJITs72z9s0efzkZubS3h4ODU1NZhMJjweD5GRkbhcLhwOR4BbEDh6gFNEfmTGjBmkp6dTXr+ww7Rp01i1ahUZGRnAoZ7y3r17c9111/GGzcYtH37Ik5s308Ew6ObzMW/DBm73eKirq2Py5Ml07NixVb/Rioi0dN27d+f7779n/fr11NXV0aZNG3bv3k11dTUA3377LZWVlXTv3p38/Hzi4uIIDg6mQ4cOwKHpdFsr9YyLyI+kpaWxcOFC/xg+p9NJRkYGkyZNanBcjx49uOGGGzjtoouY3rcvO+uHtXQwDJ7bvJktb7/Nq6++yr59+1r1wzkiIi2BzWaDY6y4nJCQwEUXXcTIkSNJSkqiffv2xMXF+d/7a2pqaNu2LSEhIcTHxzN06FB+97vfceqpp5KQkNCqZ1MxGYfvQ7cCTqeTyMhIysvLW/VfYCI/V2ZmJqmpqaxbt+64yxgfPHiQBQsWsPKDD/jLmjWcVr8AUClwa9euJE6axNVXX03Xrl39c5eLiEgz1L49ZGdDUhIcPPiTh//c60hrpp5xEfnN2rdvz3XXXcfwSy5hxplnstp86K0lGnh+1y6K332XF198kW3btvlvWYqIiIjCuIicIPHx8VxzzTWMvewyZo8YwZf1T9CHAf/Ytw9vRgYvvPACW7dupaqq6vgnExERaSUUxkXkhImJieGqq67igsmTefKcc/ivzQZAEPDUwYMEZ2Tw3HPPsXnzZioqKgJbrIiI/Gwej4e33npLdzdPAs2mIiInVHh4OJdddhkOh4NXgoKoXLyYS1wurMBf8/N54L33+HNuLmlpaXTr1o2wsDAAEhMTSUxMDGzxIiJyVD6fjx07dvzsFZZzc3PJzc0lKysLwP/5ML3n/38K4yJywoWEhHDRRRcRFBTEO3Y7VR9/zLW1tZiBR8vK+NMnn3D9J580eM3DDz/MzJkzA1KviIicWPPnz2fWrFn+76dMmdJgv97z/z+FcRE5KRwOBxMmTMDhcPAvmw3nhx9ye/3tzf8DIoEPBg3immuvpWfPnnTv3j2g9YqIyIkzdepUJk6cSFZWlj+IL1iwgJSUFAD1ih9BYVxEThq73c748eMJDg7mDbudOR9+yH1lZQDcByRs2sTHn31G586dCQoKwjAMTMeYw1ZERJqPow1DSUlJ0fSGR6EwLiInlcViYcSIEdjtdt6w23lg4UL+XFKCGbi2poaIRYt4sX61zrPOOovo6GgFchERaTUUxkXkpLNYLAwbNgyHw8Hrdju3v/UWT5aWYgXSa2sJ+fxznnO58Hg8jBgxgpiYGAVyERFpFRTGRaRRmEwmBg0axPLly5ltMrEPeIdD0x6Od7kI/fJL/ub1UldXx7nnnktMTAxms2ZfFRFpqsrKyti9ezcHDx4kOzub/Px8PB4PXq+X0tJSDh48yPr16/3HDx8+nH79+tGpUycAgoKCiIqKwmazERUVRZcuXejTpw/R0dG4XC4cDgcREREEBQUFqIWNQ2FcRBrN+++/z913303fvn35T0kJk+x23q2rIww42+0m5Ouv+bPLhcvlYvz48bRp00aBXESkCbDb7Tz88MPw4otQUYHPMFi3bh3FxcUUFhayadMmamtrAcjPz8fpdJKfn092dnaD8yxfvpzy8nJOOeUUioqK2LFjBx07dsRkMrF161a2b9/OiBEj6NKlC9XV1VRXV5OQkNCiA7muciLSQG5uLpmZmWRmZjaYH/bwttzc3F997tmzZzNmzBhefvllADpcfTUTQ0Ioqd8/0ONhzrff8sHzz/PRRx+Rn5+Pz+f7rU0SEZETzOv1UlNTQ0xMDG63m6SkJJKTk7Hb7TgcDsxmM7m5uURGRvpf0717d6Kjo9m/fz/x8fHExcURHx9Pu3btSEhIIC4uDoADBw4QFhZGbGwsAE6nMyBtbCzqGReRBn44Nyw0nB/2t8wNu3XrVh555BH/ePC0tDSePnCAcxYvZrFh0Bbo5fXytzVruMftpq6ujrS0NOLj47FYLL+2SSIicoIZPh82mw2TyYTL5SI4OBiLxYLX62XXrl1s3LjxR6/JzMwE8F8DTCYTYWFh+Hw+zGYzbrebiIgIysvL/a9xOBy4XK7GaVSAKIyLSAOH54Y9lt8yN2xycjKLFy9m+PDhALRp04aamhqK2rVjelwcf/v+ezoaBl19Pp757jvunD8fl8vFxRdfTGJiIlar3rJERALB4/Hw/vvv87uaGkIAU314tlgsOBwOKisrsdlsWCwWunbtSlRUFJmZmQQFBdGjRw9WrFjBgAED2LNnj/+Op2EYVFZWEh8fj68+3JeUlNC1a1f/v+tyuQgJCQlQqxuHrmwi0sDJXKJ4xowZpKen+3s9pk2bxqpVq3j99dcpLS3l7rfeYvbq1XQ3DNobBv/YtIlbX3gBt9vNFVdcccxAfnjZ5UC0SUSkNfD5fGzZsoWxbjdwaJas4OBgiouLsdlsZGdn+8eMl5eX43Q6iYmJ4cCBA/6HOLOysqipqSE5OZmCggJcLhc1NTUEBQX5z2c2m+nQoQOVlZX+HvGIiIiAtLmxKIyLSKNJS0tj4cKFPPDAA8ChcYAZGRlMmjSJiooK7HY799vtPPjNN/T1+WhjGDy/bRu3vvAC/6yrY8qUKbRv3x6bzdbgvEcbWnMkLbssInJimU0mUlNT2b17N0FBQZjNZv9sKjt27GDDhg3+Y6vrV1+uqakBwGazER4eTps2bfyzqURGRv5oNpWQkJBWMZuKyTAMI9BFNBan00lkZCTl5eUt/q8skaYsMzOT1NRU1q1b12A1turqat59910+XrCAu5cu5QyvF4Aq4M7OnWlzxRVcf/31tG/fHrvd7n/dkT3jh5de/uGyy+oZFxH59erq6pgzZw53/u1vRFRUQFISHDx41GOP9p4M+N+X9Z7ckHrGRaTJCAkJ4bLLLiM4OJi/2+1M/ewzRnk8hALP7t3LH19/nfkeD9dddx2dO3fG4XAAWnZZRKQpOVbY1vvy0SmMi0ij+GFPyZGf4f+/eTscDiZNmoTdbucFm43qTz9lQl0dDuDvBw8y4/XXec7l4sYbb6Rr164t/valiEhzdPg9/8j3+aO954vmGReRRjJ//nxSU1NJTU3137KcMmWKf9v8+fP9x9psNiZMmMB1t9zCvydN4u36HnAL8H95eUS/+Sbz5s1j+/bt/jGIIiLSdBx+zz9yatxjvee3duoZF5FG8UunTLRYLIwZM4bQ0FBestupXLiQG+ofAnq4qIi/v/02T9fWMv3WW+nRo0eLn/pKRKQ5Ofyef7TneOC3TZPb0iiMi0ij+DW3JE0mE0OHDsVut/Oi3U7lO+9wR0UFAHeVljL/vfd4yuNh2vTp9OrVi9DQ0JNRuohIq2ez2bjvvvuwvfgi1L8PH88P3/M1XvzYFMZFpEkzmUycfvrpBAUFMd/h4C9vvcUDZWUATK2oIHThQp5xu7ll+nT69u0b2GJFRFook8nUYBYrOXE0ZlxEmoU+ffpw6623UnzNNdwfF4evfvuU6mou+uAD5j75JOvWraOqqiqgdYqIiPwSCuMi0mwkJydz2223YdxwA3cnJOCu335hbS3X/ec//ONvf2Pz5s0BrVFEpCXyeDx88MEH1NSvsiknjsK4iDQrp5xyCtOnTyfq5pu5vWNHDs+lcm5dHbd9+ikfvP46ABU/Y0yjiIj8PD6fjw0bNuCuqwt0KS2OwriINDtJSUlMmzaNDjffzPSuXTkcu4d6PMxetYoY4LvvvqOsfmy5iIhIU6UwLiLNUlxcHLfccgu9fv97pqekUFy/PdXn42tg8auv8sUXX1BaWophGIEsVURE5JgUxkWk2YqKiuKmm25i8PTp3Nm/P7kmEwC9gHkbN/LOY4/x3//+V4FcRESaLIVxEWnWwsLCuPbaaxkxfTp3DxrE3vpA3sUweHLtWj7929/48MMPKS4uViAXEZEmR2FcRJq94OBgpkyZwu9uu41b+/VjS/32dobBU999x9InnuDdd9+lsLAQn8933HOJiIg0JoVxEWkR7HY7l1xyCcOvuIKzgUzzobe3OGDuli1kPvUU//73vykoKFAgFxGRJkNhXERaDJvNxvDhwykGHhwyhBUWCwARwDPbt7Plb3/jzTffJC8vD6/XG9BaRUSaE5vNxh/+8AfCwsMDXUqLozAuIi2KpT6AX3j11Tx3wQV8brUCEAw8s28fuU8/zSuvvEJubq4CuYjIz2QymQgNDcVc/1yOnDgK4yLSIg0YMIBp99zDW5dcwod2OwA24LEDB6iZO5cXXniBgwcP4vF4AluoiIi0ao0Sxr/++msmTJhAu3btMJlMfPDBBw32G4bBQw89RGJiIsHBwYwePZodO3Y0OKakpITJkycTERFBVFQU119/PZWVlY1Rvog0QyaTiTPOOIM7772XjydP5s2gIAAswOz8fIKee4558+axf/9+3G53YIsVEWniPB4Pn3zyCTW1tYEupcVplDBeVVVF3759mTdv3lH3P/744zzzzDM8//zzrFq1itDQUMaOHUvtEf/BJ0+ezObNm/n888/5+OOP+frrr7npppsao3wRacb69OnD3X/8IyuuvZb5oaH+7fcXFZH04ovMffZZ9u7dq0AuInIcPp+PtWvX4q6rC3QpLU6jhPHx48fzl7/8hUmTJv1on2EYPPXUUzzwwANccMEF9OnTh9dff52cnBx/D3pWVhaLFi3ipZdeYvDgwQwbNoxnn32Wt99+m5ycnMZogog0Y8nJydzzxz+y/aab+FtEhH/77WVl9HrpJZ556il27dpFnS4yIiLSyAI+ZnzPnj3k5eUxevRo/7bIyEgGDx7MypUrAVi5ciVRUVEMHDjQf8zo0aMxm82sWrWq0WsWkeanc+fO3HX33RT9/vf8OSbGv/36ykqGvvoqTz7xBFu3bsXlcgWwShERaW0CHsbz8vIAaNu2bYPtbdu29e/Ly8sjPj6+wX6r1UpMTIz/mKNxuVw4nc4GHyLSeiUlJXH33XdjuuMO7m/blsNzqVxWU8P5CxbwzF//ypYtWxoMkRMRETmZAh7GT6Y5c+YQGRnp/+jQoUOgSxKRkygjI4PJkycDh54zycjI+NExcXFx3HbbbUTffTf3tG/P4YEpE1wurnjnHZ597DE2btxITU0NALm5uWRmZh7zIzc3t7GaJyLSLHzwwQcMHjyY4OBgUlNTARg4cCCJiYk88MAD7NmzJ8AVNi0BD+MJCQkA5OfnN9ien5/v35eQkEBBQUGD/R6Ph5KSEv8xR3PfffdRXl7u/zhw4MAJrl5EmoqMjAzS09OJiooCICoqivT09KMG8sjISG655RZO+eMfubNLF6rrt59TV8eNCxcyd/ZsvvvuO6qrq5k/fz6pqanH/Jg/f37jNVJEpIlbvnw5t956K6tXr25wl9EwDPLy8pg9ezbTp0/XHcgjBDyMn3LKKSQkJPDFF1/4tzmdTlatWsWQIUMAGDJkCGVlZaxbt85/zJIlS/D5fAwePPiY53Y4HERERDT4EJGWafbs2YwZM4a5c+cCMHfuXM4991weffTRox4fFhbGjTfeSL8//Yk7kpMpr98+xOPhro8/5vlHHmH16tVceeWVrFu3jnXr1rFgwQIAFixY4N82derUxmieiEiz8MknnxAaGkpwcDDR0dEMGjQIOPQgfXh4OHa7nbq6Og0dPkKjhPHKykrWr1/P+vXrgUMPba5fv579+/djMpm44447+Mtf/sJHH33Exo0bueqqq2jXrh0XXnghACkpKYwbN44bb7yR1atX88033zB9+nQuu+wy2rVr1xhNEJEmbuvWrYwdOxZT/epwJpOJcePGkZWVdczXBAUFcfXVV3PW/fdzV79+FNZv7+v1MuOzz3h51iz27t1L9+7dGTBgACkpKcCh96QBAwYwYMAAEhMTT3bTREQCzmazcfvttxMWHn7c44qLiwkLC8PlctGxY0diY2MBiIiIICEhAY/Hg8fj0cPyR2iUML527Vr69+9P//79Abjrrrvo378/Dz30EAB//OMfufXWW7npppsYNGgQlZWVLFq0iKD6RToA3nzzTZKTkxk1ahTnnXcew4YN44UXXmiM8kWkGUhOTmbx4sUYhgEcuiW6aNEif4A+FrvdzuWXX864++/nntNPJ7t+ew+fj7989RVvPPwwy5Yto6Ki4iS3QESk6TKZTERFRWGu7/A4ltjYWFwuF8HBweTm5vrXcPB4PBQWFmK32wkLC8PhcDRG2c2CyTh85WoFnE4nkZGRlJeXa8iKSAtzeMz44MGDWbVqlf9zRkbGUdc4+CGv18unn37Ku3/9Kw8tW0bX+rfGPOBPAwaQ9vDDREZGMmLECNatW8eAAQNOcotERJqg9u0hOxuSkuDgwR/tXr58Offeey979+4lJyeHkJAQqqurCQoKora2lvbt23Pfffdx3XXXNeh0bc0CPmZcRORESEtLY+HChf5xiE6n82cHcQCLxcLvfvc7rn74YWaNGsUW86G3xwTg75mZ/OfBB/n2229PVvkiIk2a1+vls88+o/YnhpcMGzaMxx57jJ49exISEuKfmcrlctGpUyceeughBfEfsAa6ABGREyUtLY3OnTuTmprKggULfnHvtclkYuTIkQQFBfGYw8Ftn35Kqs9HDPD377/n1rIyAMrLyzEMwz8+XUSkpfN6vaxcuZIzXC5+KkYPGzaMzz//HDg0zHjKlCm88cYb/qlnpSH1jIuIHMFkMnHmmWdy+5//zD/S01lmPdRnEQ48v38/5wNffvklJSUltKJRfiIicpIojIuIHMWAAQO4589/5l9TprDYZgMgCHgfcD7/PO+88w5FRUUK5CIi8psojIuIHENycjJ/ePBBPrn+ejLqn/y3An8rKCD/kUdYsGABBQUFCuQiIvKrKYyLiBxHly5duPeBB1hxyy28Vh/IzcDM3Fzcs2fz6quvkpeXh8/nC2yhIiLSLCmMi4j8hKSkJO69/36+vuIKHj9i+x+Li4l47DHmP/88ubm5CuQiIvKLKYyLiPwMbdq04aqrr+Ze4P+OWIHu92VldP7b3/jH3LlkZ2fj9XoDV6SIiDQ7CuMiIj9TeH0Iz732Wv7cpo1/+zVVVfR7+mme+fvfOXDggAK5iLQ4NpuNW265hdCwsECX0uIojIuI/EKXXXYZcTNncl+7dhyO3RfX1HDOc8/x1GOPsWfPHjweT0BrFBE5kUwmE/Hx8VjMio4nmn6iIiK/kMPh4IYbbqD7X/7CPZ07c3g9uvEuF5NefpmnZ89m+/btuN3ugNYpIiJNn8K4iMjPkJGR4V89bvLkyXz88cdcddVVnD5nDvckJ1NVf9xwt5srFyxg7iOPsHXrVurq6gJXtIjICeL1evnyyy9xuVzHPS4vL4/58+dz9tlnEx4ezpVXXgnAlVdeSUJCApdeeimLFy+mtra2McpuFhTGRUR+QkZGBunp6URFRQEQFRVFeno6H374IZdccgnnzJnDPX37UlZ//OkeD7e88w7zHnqILVu2KJCLSLPn9Xr56quvjhvG8/LyeO2113jzzTc5cOAAlZWVBAUFARAUFER+fj5r1qzhmWeeUSA/gsK4iMhPmD17NmPGjGHu3LkAzJ07l3PPPZdHH30Us9nMBRdcwKS//pU/nXEGBfWvOc3n4+4PP+S5++5j/fr1P9mbJCLS3G3fvp2dO3fi9XopLi4mISGB3r17A3DaaacRGxtLUVERtbW1fPPNNzidzgBX3DQojIuI/IStW7cyduxYTCYTcOhBpnHjxpGVleX//txzz2XKX//KA2efzYH6151qGDyweDEv33svmZmZ6gUSkRatvLwcr9eL2Wymurqadu3aYbVagUOzscTHx1NdXY3NZqOiokKdFPUUxkVEfkJycjKLFy/2L3tvGAaLFi0iJSWlwXHDhg1j6t//zp/HjGFHfXDvYBg88uWXvH733axatYqamppGr19EpDFERkZisVjw+XyEhISQk5Pjn1nK7XZTUFBASEgIbreb8PBwHPWrGrd2CuMiIj9hxowZfPbZZ0ybNg2AadOm8fnnnzNjxowfHZuamsqdTz7J3y64gI31U4DFA4+uXMm/77iDFStWUF1d3Zjli4g0iu7du9OtWzcsFguxsbHk5eWxadMmADZu3EhxcTFt2rQhKCiIoUOHEhEREeCKmwaFcRGRn5CWlsbChQv94xudTicZGRlMmjTpqMf37NmTe554gucuuYTVFgsA0cDj69fz0W238eWXX1JZWdlY5YuINIqEhASuvvpqJk+eTIcOHQgLC/MPz6utraVt27YMHDiQ2267jbFjx/of7mztFMZFRH6GtLQ0FixYAMCCBQuOGcQP69q1K/f/9a/869pr+bJ+zGQY8PiWLSy94w6++OILKioqTnbZIiKNKiEhgalTp/L1119TUVHBG2+8AcAbb7xBXl4e//73vxXEf0BhXETkJGnfvj33P/ooi6ZN41O7HQAHMGfHDtbdcQeLFi3SbAIi0ixYrVZuuOEGQkNDA11Ki6MwLiJyErVp04b7Zs1i5V138V59T5AV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uYiOju7SN3AuXLiw2RFmFixYwMKFC9svIBEREek4evSAzExISYGDB82OplPoEC3j4j9z585l2rRpx31dreIiIiJyXPWTL2oSRr9Ry7iIiIiIiEmsZgcgIiIiItJVKRkXERERETFJl+ozXt8jx+VymRyJiIiIBLqoqCgsFstJvccwDIqLi9soIuloWvIZ6lLJeP3O0bNnT5MjERERkUDXmnvMiouLiY6ObqOIpKNpyWeoS93AWVNTw6FDh1p1pmsWl8tFz549OXDggG467cC0HTsHbcfOQduxc2iP7eiPlvHO9HnrLP9Le/4fahk/itVqpUePHmaH0SoOh6NDf/CllrZj56Dt2DloO3YOgbYdLRZLk/EEWpy+6Cz/S6D8H7qBU0RERETEJErGRURERERMomQ8wIWEhLBgwQJCQkLMDkV8oO3YOWg7dg7ajp1DR9mOHSXOlugs/0ug/R9d6gZOEREREZFAopZxERERERGTKBkXERERETGJknEREREREZMoGQ9wf/7zn+nTpw+hoaGcccYZfPbZZ2aHJCdh4cKFWCyWRo/BgwebHZacwCeffMKll15KcnIyFouF5cuXN3rdMAx+//vfk5SURFhYGBMnTiQ9Pd2cYOW4TrQdb7jhhmP2zylTppgTrDRp0aJFnH766URFRZGQkMDll1/Orl27GpWpqKhg3rx5xMXFERkZycyZMzl8+LBJETfvhx9+YM6cOfTt25ewsDD69+/PggULqKysNDu0E+oM+UhLPk9mUDIewF5//XXuuOMOFixYwNatWxk5ciSTJ0/myJEjZocmJ+HUU08lKyvL+1i/fr3ZIckJlJaWMnLkSP785z83+fpjjz3Gn/70J5577jk2b95MREQEkydPpqKiop0jleacaDsCTJkypdH++eqrr7ZjhHIi69atY968eWzatIk1a9bg8XiYNGkSpaWl3jLz58/n3Xff5Y033mDdunUcOnSIGTNmmBj18X333XfU1NSwZMkSvvnmG/74xz/y3HPP8bvf/c7s0JrVWfKRlnyeTGFIwBo7dqwxb9487/Pq6mojOTnZWLRokYlRyclYsGCBMXLkSLPDEB8Axttvv+19XlNTYyQmJhqPP/64d1lhYaEREhJivPrqqyZEKC1x9HY0DMO4/vrrjcsuu8yUeKR1jhw5YgDGunXrDMOo3fdsNpvxxhtveMvs3LnTAIyNGzeaFeZJeeyxx4y+ffuaHUazOms+cvTnySxqGQ9QlZWVbNmyhYkTJ3qXWa1WJk6cyMaNG02MTE5Weno6ycnJ9OvXj1mzZpGRkWF2SOKDffv2kZ2d3WjfjI6O5owzztC+2QF9/PHHJCQkMGjQIH7+85+Tl5dndkjSjKKiIgBiY2MB2LJlCx6Pp9H+OHjwYHr16tVh9seioiLv/xOIOnM+cvTnySxKxgNUbm4u1dXVdO/evdHy7t27k52dbVJUcrLOOOMMXn75ZVauXMlf//pX9u3bx9lnn01xcbHZoUkr1e9/2jc7vilTpvCPf/yDtWvX8uijj7Ju3TqmTp1KdXW12aFJE2pqarj99tuZMGECw4YNA2r3R7vdjtPpbFS2o+yPe/bs4dlnn2Xu3Llmh3JcnTUfaerzZJZgU/+6SCc3depU7+8jRozgjDPOoHfv3vz73/9mzpw5JkYmIj/+8Y+9vw8fPpwRI0bQv39/Pv74Yy688EITI5OmzJs3jx07dgTkfTe//e1vefTRR5sts3PnzkY38GdmZjJlyhSuvPJKbr755rYOUY4SSJ8nJeMBqlu3bgQFBR1zR/jhw4dJTEw0KSrxldPpZODAgezZs8fsUKSV6ve/w4cPk5SU5F1++PBhRo0aZVJU4g/9+vWjW7du7NmzR8l4gLntttt47733+OSTT+jRo4d3eWJiIpWVlRQWFjZqHW/v78pf//rX3HDDDc2W6devn/f3Q4cOcf7553PmmWfy/PPPt3F0vumM+cjxPk9mUTeVAGW320lNTWXt2rXeZTU1Naxdu5bx48ebGJn4oqSkhL179zZK4qRj6du3L4mJiY32TZfLxebNm7VvdnAHDx4kLy9P+2cAMQyD2267jbfffpsPP/yQvn37Nno9NTUVm83WaH/ctWsXGRkZ7bo/xsfHM3jw4GYfdrsdqG0RP++880hNTeWll17Cag3sVKwz5SMn+jyZRS3jAeyOO+7g+uuvZ8yYMYwdO5ann36a0tJSbrzxRrNDkxa68847ufTSS+nduzeHDh1iwYIFBAUFcc0115gdmjSjpKSk0dWLffv2sX37dmJjY+nVqxe33347Dz74IAMGDKBv377cd999JCcnc/nll5sXtByjue0YGxvL/fffz8yZM0lMTGTv3r385je/4ZRTTmHy5MkmRi0NzZs3j1deeYV33nmHqKgobx/l6OhowsLCiI6OZs6cOdxxxx3ExsbicDj4xS9+wfjx4xk3bpzJ0R+rPhHv3bs3TzzxBDk5Od7XArmVubPkIyf6PJnG1LFc5ISeffZZo1evXobdbjfGjh1rbNq0yeyQ5CRcffXVRlJSkmG3242UlBTj6quvNvbs2WN2WHICH330kQEc87j++usNw6gd3vC+++4zunfvboSEhBgXXnihsWvXLnODlmM0tx3LysqMSZMmGfHx8YbNZjN69+5t3HzzzUZ2drbZYUsDTW0/wHjppZe8ZcrLy41bb73ViImJMcLDw43p06cbWVlZ5gXdjJdeeum4/1Og6wz5SEs+T2aw1AUnIiIiIiLtLLA7KomIiIiIdGJKxkVERERETKJkXERERETEJErGRURERERMomRcRERERMQkSsZFREREREyiZFxERERExCRKxkVERERETKJkXERERERa5YYbbuDyyy9vtsx5553H7bff7te/u3DhQkaNGuXXOs0SbHYAIiIiItIxPfPMM2gyd98oGRcRERHpoiorK7Hb7a1+f3R0tB+j6ZrUTUVERESkizjvvPO47bbbuP322+nWrRuTJ09mx44dTJ06lcjISLp3785PfvITcnNzve958803GT58OGFhYcTFxTFx4kRKS0uBY7uplJaWct111xEZGUlSUhJPPvnkMTFYLBaWL1/eaJnT6eTll1/2Pv9//+//MXDgQMLDw+nXrx/33XcfHo/Hr+siUCgZFxEREelC/v73v2O32/n000955JFHuOCCCzjttNP44osvWLlyJYcPH+aqq64CICsri2uuuYabbrqJnTt38vHHHzNjxozjdk256667WLduHe+88w6rV6/m448/ZuvWrScdY1RUFC+//DLffvstzzzzDEuXLuWPf/yjT/93oFI3FREREZEuZMCAATz22GMAPPjgg5x22mk8/PDD3tdffPFFevbsye7duykpKaGqqooZM2bQu3dvAIYPH95kvSUlJbzwwgssW7aMCy+8EKhN/Hv06HHSMd57773e3/v06cOdd97Ja6+9xm9+85uTrivQKRkXERER6UJSU1O9v3/55Zd89NFHREZGHlNu7969TJo0iQsvvJDhw4czefJkJk2axBVXXEFMTEyT5SsrKznjjDO8y2JjYxk0aNBJx/j666/zpz/9ib1793pPCBwOx0nX0xGom4qIiIhIFxIREeH9vaSkhEsvvZTt27c3eqSnp3POOecQFBTEmjVrWLFiBUOHDuXZZ59l0KBB7Nu3r9V/32KxHNPNpWF/8I0bNzJr1ix+9KMf8d5777Ft2zbuueceKisrW/03A5mScREREZEuavTo0XzzzTf06dOHU045pdGjPmm3WCxMmDCB+++/n23btmG323n77bePqat///7YbDY2b97sXVZQUMDu3bsblYuPjycrK8v7PD09nbKyMu/zDRs20Lt3b+655x7GjBnDgAED2L9/v7//9YChZFxERESki5o3bx75+flcc801fP755+zdu5dVq1Zx4403Ul1dzebNm3n44Yf54osvyMjIIC0tjZycHIYMGXJMXZGRkcyZM4e77rqLDz/8kB07dnDDDTdgtTZONy+44AIWL17Mtm3b+OKLL/jZz36GzWbzvj5gwAAyMjJ47bXX2Lt3L3/605+aTP47CyXjIiIiIl1UcnIyn376KdXV1UyaNInhw4dz++2343Q6sVqtOBwOPvnkE370ox8xcOBA7r33Xp588kmmTp3aZH2PP/44Z599NpdeeikTJ07krLPOatRHHeDJJ5+kZ8+enH322Vx77bXceeedhIeHe1+fNm0a8+fP57bbbmPUqFFs2LCB++67r03Xg5kshqZNEhERERExhVrGRURERERMomRcRERERMQkSsZFREREREyiZFxERERExCRKxkVERERETKJkXERERETEJErGRURERERMomRcRERERMQkSsZFREREREyiZFxERERExCRKxkVERERETKJkXERERETEJP8ffjhMbE7LcPoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAYAAACmKP9/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABRBUlEQVR4nO3deVxU9f4/8NfMsA6bwKCyiLuEil/3qyYuuZWilqa44FpZmqlRippes+ViZqtXy8rbzaVuaXXT1CxNc7lmpSGKKEopKLKrIPvMvH9/8GMSF0AFzszh9Xw8eARnDsNLYuZ1ls/5HI2ICIiIiEhVtEoHICIiourHgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIXslA6gJmazGSkpKXBzc4NGo1E6DpFVERHk5ubCz88PWi33LYhqGgu+GqWkpKBRo0ZKxyCyasnJyQgICFA6BpHqseCrkZubG4DSNzB3d3eF01BhsRFj39oNAPjs2X5wcuCfu5JycnLQqFEjy+uEiGoW3/GqUdlheXd3dxa8FXAoNsLOSQ+g9P8JC9468PQVUe3giTAiIiIVYsETERGpEAueiIhIhVjwREREKsSCJyIiUiEWPBERkQqx4ImIiFSIBU9ERKRCLHgiIiIVYsETERGpEAueiIhIhVjwREREKsSCJyIiUiEWPBERkQrx/plUJ8TExMDB7vbbswaDAYGBgbWYiIioZrHgSbWSky9YPu/ZsydMJUW3XVev1yM+Pp4lT0SqwYIn1crKyrR8fuDAgdvuwcfHxyMiIgKZmZkseCJSDRY81Qnt27eHkwP/3Imo7uAgOyIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVMhO6QBEdyMpKQmZmZkVrnPq9GkA9WolDxGRtWHBk81JSkpCcHAw8vPzK1xPZ++Ifou/rKVURETWhQVPNiczMxP5+fnYsGEDgoODb7tesdGMJTvTajEZEZH1YMGTzQoODkbHjh1v+3hhsRHYubMWExERWQ8OsiMiIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqZCd0gGIrEV8fHyl6xgMBgQGBtZCGiKie8OCpzrPYDBAr9cjIiKi0nX1ej3i4+NZ8kRk9VjwVOcFBgYiPj4emZmZFa4XHx+PiIgIZGZmsuCJyOqx4IlQWvIsbSJSEw6yIyIiUiEWPBERkQqx4ImIiFSIBU9ERKRCLHgiIiIVYsETERGpEAueiIhIhXgdPFmVpKSkKk04Q0REFWPB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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(-5,5,num_points)\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "# Select the \"mcmc\" method\n", + "f = dataprob.setup(some_function=linear_model,\n", + " method=\"mcmc\", # <<<---\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "f.data_df = expt_df\n", + "\n", + "# Run fit\n", + "f.fit()\n", + "\n", + "# Plot results\n", + "fig = dataprob.plot_summary(f)\n", + "fig = dataprob.plot_corner(f)\n", + "f.fit_df" + ] + }, + { + "cell_type": "markdown", + "id": "386d4409-27d5-4366-bd62-73086ad737ee", + "metadata": {}, + "source": [ + "### Set MCMC Priors" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ec522f94-a987-49af-ad7e-e06a52471790", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameguessfixedlower_boundupper_boundprior_meanprior_std
name
mm0.0False-infinfNaNNaN
bb0.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name guess fixed lower_bound upper_bound prior_mean prior_std\n", + "name \n", + "m m 0.0 False -inf inf NaN NaN\n", + "b b 0.0 False -inf inf NaN NaN" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = np.linspace(-5,5,num_points)\n", + "non_fit_kwargs = {\"x\":x}\n", + "\n", + "# Select the \"mcmc\" method\n", + "f = dataprob.setup(some_function=linear_model,\n", + " method=\"mcmc\", # <<<---\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "f.data_df = expt_df\n", + "f.param_df" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "78df80a3-6505-4e7e-aa11-4cd6d90f3d2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameguessfixedlower_boundupper_boundprior_meanprior_std
name
mm0.0False-infinf-5.02.0
bb0.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name guess fixed lower_bound upper_bound prior_mean prior_std\n", + "name \n", + "m m 0.0 False -inf inf -5.0 2.0\n", + "b b 0.0 False -inf inf NaN NaN" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.param_df.loc[\"m\",\"prior_mean\"] = -5\n", + "f.param_df.loc[\"m\",\"prior_std\"] = 2\n", + "f.param_df" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "839b1caa-cfc1-4e0f-bbaf-8205251c4985", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████| 100/100 [00:01<00:00, 55.94it/s]\n", + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
mm-5.0207570.045663-5.112118-4.9314600.0False-infinf-5.02.0
bb100.0653350.17463699.729250100.4081140.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "m m -5.020757 0.045663 -5.112118 -4.931460 0.0 False \n", + "b b 100.065335 0.174636 99.729250 100.408114 0.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "m -inf inf -5.0 2.0 \n", + "b -inf inf NaN NaN " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuQAAALkCAYAAABHpCBlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADtnklEQVR4nOzdeXhU5d3/8feZM1v2kJB9DwkQBFECglgXFFFcoII7uC9o1cfqr9bHoiJapFrbasVWXFqtaOsWrVvBXakLKoiyhJ0kJCQQyL7Odn5/JJkHKlgXyGT5vK6LK5mZM5PvjTLnk3vu870Ny7IsREREREQkJGyhLkBEREREpD9TIBcRERERCSEFchERERGREFIgFxEREREJIQVyEREREZEQUiAXEREREQkhBXIRERERkRBSIBcRERERCaF+Fcgty6KhoQHthSQiIiIiPUW/CuSNjY3ExMTQ2NgY6lJERERERIB+FshFRERERHoaBXIRERERkRBSIBcRERERCSEFchERERGREFIgFxEREREJIQVyEREREZEQUiAXEREREQkhBXIRERERkRBSIBcRERERCSEFchERERGREFIgFxEREREJIQVyEREREZEQUiAXEREREQkhBXIRERERkRBSIBcRERERCSEFchERERGREFIgFxEREREJoW4J5B9++CGnn346qampGIbByy+/vNfjd9xxB0OHDiUiIoIBAwYwceJEli1bttcxNTU1zJgxg+joaGJjY7nssstoamrqjvJFRERERA6abgnkzc3NjBw5koceemifjw8ePJgFCxawatUq/v3vf5Odnc2kSZOorq4OHjNjxgzWrFnDW2+9xWuvvcaHH37IlVde2R3li4iIiIgcNIZlWVa3/kDD4KWXXuKnP/3pfo9paGggJiaGt99+mxNOOIHi4mKGDRvG559/zujRowFYvHgxp5xyCuXl5aSmpn6nn931uvX19URHRx+I4YiIiIiI/Cg9bg25x+PhkUceISYmhpEjRwLwySefEBsbGwzjABMnTsRms31jaYuIiIiISG9iD3UBXV577TXOPfdcWlpaSElJ4a233mLgwIEAVFVVkZiYuNfxdruduLg4qqqq9vua7e3ttLe3B283NDQcnOJFRERERH6gHhPIJ0yYwMqVK9m1axePPvooZ599NsuWLftGEP8+5s+fz9y5cw9glb1fZWUllZWV+308JSWFlJSUbqxIRERE+gJljB+uxyxZiYiIIC8vj3HjxvH4449jt9t5/PHHAUhOTmbnzp17He/z+aipqSE5OXm/r3nLLbdQX18f/LNt27aDOobeYOHChRQWFu73z8KFC0NdooiIiPRCyhg/XI+ZIf9PgUAguNzkyCOPpK6ujuXLl1NYWAjAu+++SyAQYOzYsft9DZfLhcvl6pZ6e4tZs2YxZcoUAIqLi5k5cyaLFi2ioKAAQL+5ioiIyA+ijPHDdUsgb2pqYtOmTcHbW7duZeXKlcTFxREfH8+8efOYMmUKKSkp7Nq1i4ceeoiKigrOOussAAoKCjj55JO54oorePjhh/F6vVx77bWce+6537nDinTY18dFBQUFjBo1KkQViYiISF+gjPHDdUsg/+KLL5gwYULw9o033gjARRddxMMPP8y6det48skn2bVrF/Hx8YwZM4alS5dyyCGHBJ/z9NNPc+2113LCCSdgs9mYPn06f/zjH7ujfBERERGRg6ZbAvlxxx3Ht7U7Lyoq+q+vERcXxzPPPHMgyxIRERERCbkec1GniIiIiEh/pEAuIiIiIhJCCuQiIiIiEnqjR0N6esfXfqbHtj3sz9RYX0RERHqjrgxTXFwMEPza5T8zjMfjYf78+QDcXlWFUVHRfcX2IArkPdDChQu/dYfROXPmcMcdd3RfQSIiIiLfwX9mmJkzZ+71uDLMvimQ90BqrC8iIiK9UVeG6covgDLMd6BA3gOpsb6IiIj0RsowP4wu6hQRERERCSHNkIuIiIhISNjtdi666KKOG48+GtpiQkiBXERERERCwmazkZ2dHeoyQk5LVkREREREQkgz5CIiIiISEn6/n+XLlwMwBjBCW07IKJCLiIiISEj4/X7+9a9/AR2BvL/SkhURERERkRBSIBcRERERCSEFchERERGREFIgFxEREREJIQVyEREREZEQUiAXEREREQkhtT0UERERkZCw2+2cd955HTcefTS0xYSQArmIiIiIhITNZmPw4MGhLiPkFMh7sKKiImbPng3AjBkzmDdvHtOmTQtxVSIiItJf1dXVUVFRQXNzM3a7ncjISAzDYP369bz//vusXr2auro6Kisrg8858sgjSUpKIiEhgYEDB5KVlcXgwYMpKCggOzubtLQ0YmNjQzeoHkCBvIcqKipi+vTpjBs3DoDY2FimT5/O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EUpT/PRz9Pl8viuuuMI3adIkQ+KR5ikoKPABvnXr1vl8vppjz2q1+l577TX/Ojt27PABvvXr1xsVZtC67777fD179jQ6jHo6Sp7z032zOVRDHqTcbjdbtmxh3Lhx/mVms5lx48axfv16AyOT47Fr1y7S09Pp1asXM2bMIDs72+iQpAWysrLIz8+vd1zGxsYyatQoHZft0EcffURKSgr9+/fnt7/9LUVFRUaHJEdht9sBSEhIAGDLli14PJ56x+OAAQPo3r27jscG2O12/7YLBh0pz/npvtkcSsiD1MGDB6murqZLly71lnfp0oX8/HyDopLjMWrUKJ5//nlWrVrFE088QVZWFmPHjqW0tNTo0KSZ6o49HZft33nnnccLL7zA+++/z1/+8hfWrVvH+eefT3V1tdGhSQO8Xi9z587ltNNO46STTgJqjkebzUZcXFy9dXU8Hmn37t08+uijzJ492+hQ/DpKntPQvtkcIQGMSUQOc/755/t/Hzx4MKNGjaJHjx68+uqrzJo1y8DIROSyyy7z/37yySczePBgevfuzUcffcS5555rYGTSkDlz5rB9+/ZO3w/nj3/8I3/5y1+Ous6OHTvqDSCQk5PDeeedxyWXXMI111zT2iF2OoHaN5WQB6mkpCQsFssRvcUPHDhAamqqQVFJS8TFxdGvXz92795tdCjSTHXH3oEDB0hLS/MvP3DgAEOHDjUoKgmEXr16kZSUxO7du5WQB5nrr7+et99+m48//piuXbv6l6empuJ2uykpKalXS96Rvyd///vfc+WVVx51nV69evl/z83N5eyzz+bUU0/lqaeeauXojk9HyHMa2zebQ01WgpTNZiMzM5P333/fv8zr9fL+++8zZswYAyOT5iorK2PPnj31EjlpX3r27Elqamq949LhcLBx40Ydl+3c/v37KSoq0vEZRHw+H9dffz3/+te/+OCDD+jZs2e91zMzM7FarfWOx507d5Kdnd1hj8fk5GQGDBhw1IfNZgNqasbPOussMjMzee655zCbgyvla895zrH2zeZQDXkQu/HGG7niiisYMWIEI0eO5OGHH6a8vJyrrrrK6NCkCW666SZ+/vOf06NHD3Jzc1mwYAEWi4Xp06cbHZocRVlZWb27GFlZWXzxxRckJCTQvXt35s6dy1133UXfvn3p2bMn8+fPJz09ncmTJxsXtBzhaJ9jQkICd955J9OmTSM1NZU9e/Zwyy230KdPHyZOnGhg1HK4OXPm8M9//pM333yT6Ohof7vi2NhYwsPDiY2NZdasWdx4440kJCQQExPD7373O8aMGcPo0aMNjt5Ydcl4jx49eOCBBygsLPS/Fky1z+01zznWvtksARvzRVrFo48+6uvevbvPZrP5Ro4c6duwYYPRIUkTXXrppb60tDSfzWbzZWRk+C699FLf7t27jQ5LjuHDDz/0AUc8rrjiCp/PVzP04fz5831dunTxhYaG+s4991zfzp07jQ1ajnC0z7GiosI3YcIEX3Jyss9qtfp69Ojhu+aaa3z5+flGhy2HaejzA3zPPfecf53Kykrfdddd54uPj/dFRET4pkyZ4svLyzMu6CDx3HPPNbr9gk17zHOasm8eL1NtwSIiIiIiYoDgalAkIiIiItLJKCEXERERETGQEnIREREREQMpIRcRERERMZASchERERERAykhFxERERExkBJyEREREREDKSEXERERETGQEnIRERERaZYrr7ySyZMnH3Wds846i7lz5wb07y5cuJChQ4cGtEwjhRgdgIiIiIi0T4888gia9L3llJCLiIiIdFJutxubzdbs98fGxgYwms5LTVZEREREOomzzjqL66+/nrlz55KUlMTEiRPZvn07559/PlFRUXTp0oVf/vKXHDx40P+e119/nZNPPpnw8HASExMZN24c5eXlwJFNVsrLy/nVr35FVFQUaWlpPPjgg0fEYDKZeOONN+oti4uL4/nnn/c//8Mf/kC/fv2IiIigV69ezJ8/H4/HE9BtEUyUkIuIiIh0In//+9+x2Wx89tln3HvvvZxzzjkMGzaMzZs3s2rVKg4cOMAvfvELAPLy8pg+fTpXX301O3bs4KOPPmLq1KmNNlO5+eabWbduHW+++SZr1qzho48+YuvWrccdY3R0NM8//zzffvstjzzyCE8//TQPPfRQi/7vYKYmKyIiIiKdSN++fbnvvvsAuOuuuxg2bBj33HOP//Vnn32Wbt268f3331NWVkZVVRVTp06lR48eAJx88skNlltWVsYzzzzD8uXLOffcc4Ga5L9r167HHePtt9/u//2EE07gpptu4uWXX+aWW2457rLaAyXkIiIiIp1IZmam//cvv/ySDz/8kKioqCPW27NnDxMmTODcc8/l5JNPZuLEiUyYMIGLL76Y+Pj4Btd3u92MGjXKvywhIYH+/fsfd4yvvPIKf/3rX9mzZ4//oiAmJua4y2kv1GRFREREpBOJjIz0/15WVsbPf/5zvvjii3qPXbt2ccYZZ2CxWFi7di3vvvsugwYN4tFHH6V///5kZWU1+++bTKYjmrwc3j58/fr1zJgxgwsuuIC3336bbdu2cdttt+F2u5v9N4OdEnIRERGRTmr48OF88803nHDCCfTp06feoy5xN5lMnHbaadx5551s27YNm83Gv/71ryPK6t27N1arlY0bN/qXHTp0iO+//77eesnJyeTl5fmf79q1i4qKCv/zzz//nB49enDbbbcxYsQI+vbty969ewP9rwcVJeQiIiIindScOXMoLi5m+vTpbNq0iT179rB69Wquuuoqqqur2bhxI/fccw+bN28mOzublStXUlhYyMCBA48oKyoqilmzZnHzzTfzwQcfsH37dq688krM5vrp5jnnnMPSpUvZtm0bmzdv5je/+Q1Wq9X/et++fcnOzubll19mz549/PWvf23wAqAjUUIuIiIi0kmlp6fz2WefUV1dzYQJEzj55JOZO3cucXFxmM1mYmJi+Pjjj7ngggvo168ft99+Ow8++CDnn39+g+Xdf//9jB07lp///OeMGzeO008/vV6bdYAHH3yQbt26MXbsWC6//HJuuukmIiIi/K9fdNFFzJs3j+uvv56hQ4fy+eefM3/+/FbdDkYz+TS9koiIiIiIYVRDLiIiIiJiICXkIiIiIiIGUkIuIiIiImIgJeQiIiIiIgZSQi4iIiIiYiAl5CIiIiIiBlJCLiIiIiJiICXkIiIiIiIGUkIuIiIiImIgJeQiIiIiIgZSQi4iIiIiYiAl5CIiIiIiBvp/gPOPLTaAZvoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAYAAACmKP9/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABSDUlEQVR4nO3deVxU9f4/8NfMAAODgODgAjou5YKK1z01l8qtq6jXJXHBvSzNUilDTb9myyXNMutaud3KJSu92VXTaxuW2qJGiCLK4gKK7CrKPjPv3x/+mCRRSIEzc3g9Hw8ewcxhegnMvOZ8zud8jkZEBERERKQqWqUDEBERUeVjwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEJOSgdQE6vVipSUFHh4eECj0Sgdh8iuiAiuXbsGPz8/aLXctyCqaiz4SpSSkoJGjRopHYPIriUnJ6Nhw4ZKxyBSPRZ8JfLw8ABw4wXM09NT4TRUUGTG2JXfAQC2zu0LVxf+uSspJycHjRo1sj1PiKhq8RWvEpUMy3t6erLg7YBLkRlOrgYAN34nLHj7wMNXRNWDB8KIiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrEgiciIlIhFjwREZEKseCJiIhUiAVPRESkQix4IiIiFWLBExERqRALnoiISIVY8ERERCrE62dSjRAVFQUXp9u/nzUajTCZTNWYiIioarHgSbWSky/YPu/ZsycsxYW33dZgMCA2NpYlT0SqwYIn1crKyrR9fvDgwdvuwcfGxiIkJASZmZkseCJSDRY81Qjt27eHqwv/3Imo5uAkOyIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCvH6meSQkpKSkJmZecdtTp0+DaB2teQhIrI3LHhyOElJSQgICEBeXt4dt9M569F38X+qKRURkX1hwZPDyczMRF5eHjZv3oyAgIDbbldktmLJvrRqTEZEZD9Y8OSwAgIC0LFjx9veX1BkBvbtq8ZERET2g5PsiIiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhViwRMREakQC56IiEiFWPBEREQq5KR0ACJ7ERsbW+42RqMRJpOpGtIQEd0bFjzVeEajEQaDASEhIeVuazAYEBsby5InIrvHgqcaz2QyITY2FpmZmXfcLjY2FiEhIcjMzGTBE5HdY8ET4UbJs7SJSE04yY6IiEiFWPBEREQqxIInIiJSIRY8ERGRCrHgiYiIVIgFT0REpEIseCIiIhXiefBkV5KSkiq04AwREd0ZC57sRlJS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Run fit\n", + "f.fit()\n", + "\n", + "# Plot results\n", + "fig = dataprob.plot_summary(f)\n", + "fig = dataprob.plot_corner(f)\n", + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88de7586-6f35-479c-84ad-b204ecb17d59", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/michealis-menten.ipynb b/examples/michealis-menten.ipynb new file mode 100644 index 0000000..28a8e3b --- /dev/null +++ b/examples/michealis-menten.ipynb @@ -0,0 +1,237 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "487b509e-384e-4cde-9cd3-c0514b1e757f", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cb7ab6ad-9dad-42fa-bbe2-fa378d37bc23", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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OIIgoKGhAdHYJBPUvZQL45dffjlaWlpw9913o7GxEVOmTMG77757wkGdRERERERSS7kwDgC33norbr31VqnLICIiIiLqVkqNGSciIiIiSiYM40nstddew1VXXQUAuOqqq/Daa69JXBERERHR4CoqKkJVVRUAoKqqCkVFRRJXdGoYxpPUa6+9hmXLliE9PR0AkJ6ejmXLljGQExER0bBRVFSE+vp6mEwmAIDJZEJ9fX1SBXKG8SR177334rzzzsOjjz4KAHj00Udx7rnn4r777pO4MiIiIhrudDodZPKBj5n19fXIzMzE5ZdfDqB9Io+MjAzU19cP+O/uLwzjSerrr7/GokWLIJPJAAAymQznn38+qqurJa6MiIiIhjO1Wo077rgDRoNhUH5fQUFBQh4qLCwclN/bXxjGk9S4cePw3nvvQRAEAO1zer777ruorKyUuDIiIiKiwdPQ0JCQh5KpVxxI0akNh4Nf/vKXWLZsGZxOJwDglltuwY4dOzhmnIiIiIaNwsJC1NfX46WXXgIAvPTSS3C5XEnVO86e8SS1dOlS/P3vf4fL5QIAuFwuvPbaa7j00kslroyIiIiGs1AohPXr18Pr8w3476qrq0NhYWFCHiosLERdXd2A/+7+wjCexJYuXYrnn38eAPD8888ziBMREZHkBEFATU0NIuHwoPy+uro67N69GwCwe/fupAriAMM4EREREZFkGMaJiIiIiCTCME5EREREJBGGcSIiIiIiiTCMExERERFJhGGciIiIiPqVSqUCYmfFpO4xjBMRERFRv1Gr1fif//kfmIxGqUtJCgzjREREREQSYRgnIiIiIpIIwzgRERER9ZtwOIwXXngBPp9P6lKSglLqAujUWSwWWCwWAEB1dXXCTwDIz89Hfn6+JLURERHR8BaNRnHgwAGEw+EB/T2pkocYxpPQU089hbVr1ybctmLFCvH66tWrsWbNmkGuioiIiGjwpEoeYhhPQj/84Q9x8cUXd7k+Gb4FEhEREfVFquQhhvEklCy7XYiIiIgGSqrkIR7ASUREREQkEYZxIiIiIiKJMIwTEREREUlEJgiCIHURQ4nL5YLZbIbT6YTJZJK6HCIiIqLkVFQE1NcDhYVAXZ3U1QxZPICTiIiIiPpfXl7iT+oUwzgRERER9b9du6SuIClwzDgRERERkUQYxomIiIiIJMIwTkREREQkEYZxIiIiIiKJMIwTEREREUmEYZyIiIiISCIM40REREREEmEYJyIiIiKSCMM4EREREZFEGMaJiIiIiCTCME5EREREJBGGcSIiIiIiiTCMExERERFJhGGciIiIiEgiDONERERERBJhGCciIiIikgjDOBERERGRRBjGiYiIiIgkwjBORERERCQRhnEiIiIiIokwjBMRERERSYRhnIiIiIhIIjJBEASpixhKBEGA2+2G0WiETCaTuhwiIiIiSmEM40REREREEuEwFSIiIiIiiTCMExERERFJhGGciIiIiEgiDONERERERBJhGCciIiIikgjDOBERERGRRBjGiYiIiIgkwjBORERERCQRhnEiIiIiIokwjBMRERERSYRhnIiIiIhIIgzjxxEEAS6XC4IgSF0KEREREaU4hvHjuN1umM1muN1uqUshIiIiohTHME5EREREJBGGcSIiIiIiiTCMExERERFJhGGciIiIiEgiSqkLICIiShUWiwUWi6XL9fn5+cjPzx/Eik4uGWumJDF9OtDYCOTlAbt2SV3NkMUwTkRE1E+eeuoprF27tsv1q1evxpo1awavoB5IxpppaAsGg1i3bh1u/+YbmDg73UkxjCch9mIQEQ1NP/zhD3HxxRcDAKqrq7FixQo8//zzqKysBIAh+d6cjDUTpZKkCuMfffQR7r//fuzevRsWiwWvv/46lixZIq4XBAGrV6/G008/DYfDgTPPPBNPPPEEKioqpCt6ALAXI/nxCxVRaurstVtZWYlp06ZJVNHJJWPNRKkkqcK41+vF5MmTcf3112Pp0qUnrP/d736HRx55BH/+859RVlaGu+66C4sWLcJ//vMfaLVaCSoeGOzFSH4D9YWKIZ+IiCi5JFUYX7x4MRYvXtzpOkEQ8NBDD+FXv/oVLrnkEgDAc889h9zcXLzxxhu44oorBrPUAcVejEQDFUAHMtgO1BeqZNxrkoxfIFhz8uPjQSS92tpaWK3WLtdnZWWhpKRkECuSRlKF8e4cOXIEjY2NWLhwoXib2WzGrFmzsG3bti7DeCAQQCAQEJddLteA1zocDeQH30AF0IEMtgP1hSoZ95ok4xcI1pz8+HgQSau2thaVlZXw+XxdbqPT6VBdXZ3ygTxlwnhjYyMAIDc3N+H23NxccV1n1q1b1+0bMvWPgfzgG6gAmozBNhn3miTj48yakx8fDyJpWa1W+Hw+rFu3DuXl5SesP3z4MO68805YrVaG8VR35513YuXKleKyy+VCcXGxhBWlpoH84BuoAJqMwTYZDeTjPFB7ZFjz4BjIPWrJ+HgQJQu5XI7x48dDqVKddNvy8nKMHz9+EKoaulImjOfl5QEAmpqaEt5gm5qaMGXKlC7vp9FooNFoBrq8pMEgQF1JxjG2yTgUIRlrHqjnRjI+FpQoGd83qO+USiW++93vArffLnUpSSFlwnhZWRny8vKwceNGMXy7XC7s2LEDN998s7TFJRF++FFXkvG5kYxDEZKx5oF6biTjY0GJkvF9g2iwJVUY93g8OHjwoLh85MgR7Nu3D5mZmSgpKcFtt92Ge+65BxUVFeLUhgUFBQlzkVP3+OFHXUnG50Yy7pFJxpoH6rmRjI/FQErGXuZkfN8gGmxJFcZ37dqFc845R1yOj/W+5pprsH79evzsZz+D1+vFTTfdBIfDgTlz5uDdd99NqTnGBxo//KgrfG5QV/jcGBzJ2MvM58bwFAwGsW7dOtzucsEkdTFJIKnC+Lx58yAIQpfrZTIZfv3rX+PXv/71IFZFREQ08NjLTJSakiqMExERDVfsZSZKTXKpCyAiIiIiGq4YxomIiIiIJMIwTkREREQkEYZxIiIiIiKJMIwTERERUb+Ry+WoqKiAUsl5QnqCYZyIiIiI+o1SqcSVV14JnU4ndSlJgWGciIiIiEgiDONERERERBJhGCciIiKifhMMBnHffffB5XZLXUpSYBgnIiIion4VCoUAQZC6jKTAME5EREREJBGGcSIiIiIiiTCMExERERFJhGGciIiIiEgiDONERERERBJhGCciIiKifiOTyVBaWgqFUil1KUmBYZyIiIiI+o1KpcK1114LvU4ndSlJgWGciIiIiEgiDONERERERBLhYB4iIiKiYaq2thZWq7XL9YFAABqNpsv1WVlZKCkpSbgtGAzi4Ycfxo88HhgBBEMhfLlnT8I21dXVfao7lTCMExEREQ1DtbW1qKyshM/n63IbuVyOaDTa5XqdTofq6uoTArnP54MQu19zczOqqqr6p+gUxDBORERENAxZrVb4fD6sW7cO5eXlJ6zfunUrHn300S7XHz58GHfeeSesVusJYbwjk8mEl55+utO2iWGciIiIaFgrLy/H+PHjT7j98OHD3a7vKaVSecL9423TKYTxqVOnQiaT9WjbPceNCyIiIiIiohP1OIwvWbJkAMsgIiIiIhp+ehzGV69ePZB1EBERERENO5xnnIiIiIj6jUwmQ0FBAWRyxsye6NWjFIlE8Pvf/x4zZ85EXl4eMjMzEy5ERERENDypVCrceOON3c5PTt/qVRhfu3YtHnzwQVx++eVwOp1YuXIlli5dCrlcjjVr1vRziUREREREqalXYfyvf/0rnn76afz0pz+FUqnE8uXL8cc//hF33303tm/f3t81EhERERGlpF6F8cbGRkycOBEAYDAY4HQ6AQDf+c538Pbbb/dfdURERESUVEKhEB566CEE/H6pS0kKvQrjRUVFsFgsAIBRo0bh/fffBwDs3LmT44OIiIiIhjFBEOB0OiEIgtSlJIVehfFLL70UGzduBAD85Cc/wV133YWKigpcffXVuP766/u1QCIiIiKiVNXjecY7+s1vfiNev/zyy1FSUoJt27ahoqICF110Ub8VR0RERESUynoVxo83e/ZszJ49uz+aIiIiIiIaNnoVxp977rlu11999dW9KoaIiCgV+P1+2O12AIDdboff74dWq5W4qu45HA4cOnQIAHDo0CGUl5cjPT1d2qKIhoFehfH//u//TlgOhULw+XxQq9XQ6XQM40RENGz5/X78+9//xt69ewEAe/fuhdlsxsSJE4dsIHc4HPjoo4+wb98+AMC+ffug0Whw1llnMZATDbBehfHW1tYTbjtw4ABuvvlm3HHHHX0uioiIKFkdPHgQf//73/H5558DAD788EPYbDakpaVhwoQJElfXuX379uGDDz7A119/DaB9djS32w2TyYR58+ZJWxwlHZlMhuzsbMjkvZonZNjplzHjAFBRUYHf/OY3WLFihfhiJhpM3C1MREPB66+/jldffRX19fUAgM2bN+PAgQPQ6/VDNoz/85//xL/+9S80NDQAAD7++GMcPnwYarWaYZxOmUqlwo9//GME166VupSk0K9fWZRKpfhCJurM8eHT4XD0S7t+vx8HDhzAgQMHAEC87u+HEw40NjZiz549AIA9e/agsbGxz20C7Y/Fm2++iTfeeAMA8MYbb+DNN9/sl8dkoGomopN75plncOjQIfG8GxqNBocOHcIzzzwjcWVde/nllzut+eWXX5a4MqLU16ue8X/84x8Jy4IgwGKx4NFHH8WZZ57ZL4XRyRUVFYk9L1VVVSgsLERd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nrxHxGmCQVyzeLE4nWa85qysLIwePRobN278tt2TvEd09rqvKC5Gc3PzCe8buQYDGmM1n+w9IuF1H9vWrNGgsKAAlZWV+OCDD7DwrLNQXV2N+vp6CLF2e/IeIV7tsG3hiBHweDzISEtDq98v/jQYDHDX1fXoPaK795O9e/fi9NNPx/bNmzFz5sxTfo8ATnzd79ixA2+++Sa++OILbNiwAeeefjqmTp2KJUuWYObMmT16jwC6ft3Ha965cSOmT5/e7bZxCe8nnbw+J40Zg5qaGpjNZjidTvFnaVYWvvnmm67b7fha7u51r+bkeUONTCaD2WyWfDae2traLicvyMrKQklJySBX1LlehfFLL70U1113HR544IH2Nxi0v0HccccdfZofua/UajWqqqqwceNGcS70aDSKjRs34tZbb+30Ph170QarxoHYVqVS9Xj7juN7O+P1epGeno558+bhjTfewPz587F582a43e5uf8fJ2i0pKcGRI0cSZkVwu90oLy/vtl2l8uRP0+XLlyMajYpTkkUiEUyePBlXXnlll233pN25c+ciHA6jrq4OW7duxYwZM1BUVIR58+Z12a5CoRB7s7szcuRILF68GKWlpdi6dSuWLl2K8ePHo6KiotO2e9rulClT4Ha78Z///Ac7d+7EWWedhfHjx2P69Ol9ahdo74HMyMjA2Wefjddffx1nn302Nm/eDKfTeULbcrm8x8/JG2+8EX/605/EL9KRSASlpaW47rrr+tSuTCaDTCaDPba3AGjvEbTZbJDJZAl/d7z3vKft3nTTTXjiiSeQmZmJvXv3YuzYsRgxYgRuuummhOfWqbQLtL/u4732mZmZAIDMzExkZ2eLPdsdtz2Vdm+55RY8+uijMBqN+Oqrr1BWVoacnBzccsstCdue7LXc2bYtLS0wGo2YNGkSPv74Y0yaNAmff/55wkxWvWkXQMJ7j1qtPqHTpyev5c62nT17Ng4dOnTCgZajRo3qU7vH/w0qlSohlJzKa+74bd977z288cYbJ5y2XqVSYfbs2b1u9/iaO+5pPZV6O3t91tXVwWQyYfz48di2bRvGjx+PL7/8EnV1dT1+Dp/K656kp1KpcNtttyG4bl2vhiX1h9raWlRWVsLXxR5anU6H6urqIRHIexXGn3zySaxatQpXXnklQrEeH6VSiRtuuAH3339/vxZ4qlauXIlr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ZQnrq6qqoFKpEl6H+/fvR21tbVK/DrOzszFu3LhuL2q1WuoyRcwnp44940ls5cqVuOaaazB9+nTMnDkTDz30ELxeL6677jqpS6MeWLVqFS666CKUlpaioaEBq1evhkKhwPLly6UujTrh8XgS9locOXIE+/btQ2ZmJkpKSnDbbbfhnnvuQUVFBcrKynDXXXehoKAAS5Yska5oStDd/zAzMxNr167FsmXLkJeXh0OHDuFnP/sZRo8ejUWLFklYNcXdcssteOGFF/Dmm2/CaDSK44/NZjPS0tJgNptxww03YOXKlcjMzITJZMJPfvITzJ49G6effrrE1Q+O2tpa2O121NbWIhKJYN++fQCA0aNHw2AwDFodQzGfnOw9XFJST+dCffOHP/xBKCkpEdRqtTBz5kxh+/btUpdEPXT55ZcL+fn5glqtFgoLC4XLL79cOHjwoNRlURc2bdokADjhcs011wiC0D694V133SXk5uYKGo1GWLBggbB//35pi6YE3f0PfT6fcN555wnZ2dmCSqUSSktLhRtvvFFobGyUumyK6ex/B0D405/+JG7T1tYm/PjHPxYyMjIEnU4nXHrppYLFYpGu6EF2zTXXdPoYbdq0adBrGWr55GTv4VKSCYIgDFbwJyIiIiKib3HMOBERERGRRBjGiYiIiIgkwjBORERERCQRhnEiIiIiIokwjBMRERERSYRhnIiIiIhIIgzjREREREQSYRgnIiIiIpIIwzgRERER9dq1116LJUuWdLvNvHnzcNttt/Xr712zZg2mTJnSr21KQSl1AURERESUvB5++GHwhO69xzBORERENIwFg0Go1epe399sNvdjNcMPh6kQERERDSPz5s3Drbfeittuuw1ZWVlYtGgRvvzySyxevBgGgwG5ubn4/ve/D6vVKt7n1VdfxcSJE5GWloYRI0Zg4cKF8Hq9AE4cpuL1enH11VfDYDAgPz8fDzzwwAk1yGQyvPHGGwm3paenY/369eLyz3/+c4wZMwY6nQ7l5eW46667EAqF+vWxGAoYxomIiIiGmT//+c9Qq9X45JNP8Jvf/Abz58/H1KlTsWvXLrz77rtoamrC9773PQCAxWLB8uXLcf3116O6uhqbN2/G0qVLuxyacscdd2DLli1488038f7772Pz5s3Ys2fPKddoNBqxfv16/Oc//8HDDz+Mp59+Gv/7v//bp797KOIwFSIiIqJhpqKiAr/73e8AAPfccw+mTp2K++67T1z/7LPPori4GN988w08Hg/C4TCWLl2K0tJSAMDEiRM7bdfj8eCZZ57B888/jwULFgBoD/5FRUWnXOOvfvUr8frIkSOxatUq/O1vf8PPfvazU25rKGMYJyIiIhpmqqqqxOuff/45Nm3aBIPBcMJ2hw4dwnnnnYcFCxZg4sSJWLRoEc477zxcdtllyMjI6HT7YDCIWbNmibdlZmZi7Nixp1zjSy+9hEceeQSHDh0SvxCYTKZTbmeo4zAVIiIiomFGr9eL1z0eDy666CLs27cv4XLgwAGcddZZUCgU2LBhA9555x2MHz8ef/jDHzB27FgcOXKk179fJpOdMMyl43jwbdu24aqrrsIFF1yAf/7zn9i7dy9++ctfIhgM9vp3DlUM40RERETD2LRp0/DVV19h5MiRGD16dMIlHtplMhnOPPNMrF27Fnv37oVarcbrr79+QlujRo2CSqXCjh07xNtaW1vxzTffJGyXnZ0Ni8UiLh84cAA+n09c/vTTT1FaWopf/vKXmD59OioqKlBTU9Pff/qQwDBORERENIzdcsstsNvtWL58OXbu3IlDhw7hvffew3XXXYdIJIIdO3bgvvvuw65du1BbW4vXXnsNLS0tqKysPKEtg8GAG264AXfccQc+/PBDfPnll7j22mshlydGzvnz5+PRRx/F3r17sWvXLvzoRz+CSqUS11dUVKC2thZ/+9vfcOjQITzyyCOdhv9UwDBORERENIwVFBTgk08+QSQSwXnnnYeJEyfitttuQ3p6OuRyOUwmEz766CNccMEFGDNmDH71q1/hgQcewOLFiztt7/7778fcuXNx0UUXYeHChZgzZ07CGHUAeOCBB1BcXIy5c+fiyiuvxKpVq6DT6cT1F198MW6//XbceuutmDJlCj799FPcddddA/o4SEUm8JRJRERERESSYM84EREREZFEGMaJiIiIiCTCME5EREREJBGGcSIiIiIiiTCMExERERFJhGGciIiIiEgiDONERERERBJhGCciIiIikgjDOBERERGRRBjGiYiIiIgkwjBORERERCQRhnEiIiIiIon8f2Bp7dd9qo1yAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "\n", + "def michaelis_menten(vmax=100,km=30,s0=None): \n", + " return s0/(s0 + km)*vmax\n", + "\n", + "gen_params = {\"vmax\":300,\n", + " \"km\":10}\n", + "\n", + "err = 5\n", + "num_points = 20\n", + "\n", + "s0 = np.linspace(0,100,num_points)\n", + "y_obs = michaelis_menten(s0=s0,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = 2*err\n", + "\n", + "non_fit_kwargs = {\"s0\":s0}\n", + "\n", + "f = dataprob.setup(some_function=michaelis_menten,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "23cb3f1a-26a6-4965-98de-71d7e3c0b4a3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2bJly1h+fn7W51auXMn+7//+jw999/X0QU+OPfZYds899zDGdv/irampYSeddBI79dRTB8QinWQyyV577TU2a9Ystnr1avbGG28wnU6XFfTde40XXHAB02q1fRpuh9P69euZIAisqqqKFRYWZi1S6snatWvZrFmz2JgxY/o0gGpqapjVamWXX345+8Mf/sB+9rOfseHDh7Nf//rX/JrModmBYtu2bWzRokXs0ksvZY8//njWzUbmPHGmW265hc2YMYMvcuwLO3fuZI8++ihbuHDhXofdU6lU1vvB5/OxtrY21tXV1VfNZIylX9Pf/va37Oc//zm77777sqbaJIfrNaWQH8ROPvlkVlRUxE499VSm0WjYxx9/zB9bunQpKysrGxDh2dbWxgoLC9n8+fNZXV0d++qrr5ggCGzp0qWMMcaOPPJIdv/99/drGwOBADv55JPZr371K8ZY+s5fWp2+ZcsWVlpayq6//vr+bCLX2NjI3nvvPf7x66+/vkfQZ/5y++9//5szC+3Wr1/PdDodu/3225nL5WJjxoxhDzzwAEulUvyXZE/rE1auXMmampr6rJ2RSIRddNFFWT8z4XCYTZw4kclkMjZnzpys65cvXz4gFgNu2bKFmc1mdvrpp7PzzjuPmc3/v717D2riav8A/t2ECEVBBAHHK9YotQoqSqtVES9VW7U63rCCVrFWZaxai4iKYvHCqMi01Etvam2LwRHaOmhlWkdAwHpBUQoR67XeRXEsA8plk+f3h5P9EQVe+xZ2k7zP5x/N7gG+Wdg8m3POnjSnYcOGmU36Mp0XRGR2gSXnBMH8/Hxq27YtDR06lN544w1SqVS0cePGOtv/pwvBxmSaOzVx4kSaM2cONWnShFavXm3WpubfbEMfUy7yVqKsrIxKS0ufuwLNzs6mn3/+mXr37k0PHjyQTsBjx46RVquVfay4rqw//fQTtWvXjjw8PMjV1VXqZiUiGjBgAEVGRsqes6SkhM6fPy8do9TUVBIEgVJSUojo6Ylnmri1Z88eatGihWIXTSUlJaTX62v9fYqiSElJSWaFXhRF2r17N50/f17uqI3m3LlzZG9vT8uXLyeip7+fiRMnkr+/f63tExISaMeOHXJGNDN06FDpxdy02mRERARNmDCB/Pz8aNOmTUT0dE5H586dKSQk5B915za0yspKCgkJodmzZ0vbLl68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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0b1f8fd9-1191-42b7-9707-cd809c6b837d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
vmaxvmax299.8434254.195276290.992166308.694685100.0False-infinfNaNNaN
kmkm10.3963440.7156118.88653711.90615230.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "vmax vmax 299.843425 4.195276 290.992166 308.694685 100.0 False \n", + "km km 10.396344 0.715611 8.886537 11.906152 30.0 False \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "vmax -inf inf NaN NaN \n", + "km -inf inf NaN NaN " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0438d7b1-584e-41cf-87cd-2823de55b402", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/multi-gaussian.ipynb b/examples/multi-gaussian.ipynb new file mode 100644 index 0000000..7a20a70 --- /dev/null +++ b/examples/multi-gaussian.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bf2a4de6-f4ae-4138-9fc9-b204f9698ad9", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "48faf78d-d972-4f14-a66a-6c8db1e7639e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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pAYREal9CuMiUlOMsjCedLkqMjIOYJatl1sYH69IDSIiUvsUxkWkpmTKpqnkAgGcZRdSnlCNjVZTYVxERI6VwriI1IxisUh2ZMTq54PBioVxV2ur1XZo0x8RETlGFQnjixYtwmazHfBz2223HfTx99133wGPrdRX0yJSOcVikeLk5Bv9SASHw1GRWjwdHVbblUxWpAYRkVrgcrm44447CJVN75M3VGRI6dlnn8Us28765Zdf5oorruDGG2885HPC4TBbt261+id6kw8RqTzTNLFHo2/c0NBQsTAeWLDAavsymYrUICJSC2w2G+6yFahktoqE8dayr3cB/uIv/oIlS5bwzne+85DPsdlsdJSNRInIycc0zVmj0I7m5or9YR5euNBqK4yLiMixqvic8Vwux/33389v//ZvH/ZDNZFI0NvbS09PD9deey2vvPLKCaxSRKqBaZp4y4Kvo7kZu70yp7HmU0+12qF8nmKxWJE6RESqXT6f54EHHiCtgYuDqngYf+CBB5iamuKDH/zgIR+zbNkyvv71r/Pggw9y//33UygUuOiii9i7d+9hXzubzRKLxWb9iEjtMk0TXy5n9b0dHRUL4w2trSRK7XChQKFQqEgdIiLVrlAo8MILL2CUnb/lDRUP41/72te45ppr6OrqOuRjLrzwQt7//vdz1lln8c53vpMNGzbQ2trK+vXrD/va9957L5FIxPrp6emZ6/JF5ATKZDIEDcPqu9raKhbGg8EgU6V2Q6FAIpE43MNFREQOqqJhfPfu3Tz88MPccsstR/U8l8vF2Wefzfbt2w/7uDvuuINoNGr97Nmz53jKFZEKMwyDUOni7wIQ6Oio2Jxxv99PtHTsCBCPxytSh4iI1LaKhvFvfOMbtLW18e53v/uonmeaJi+99BKdnZ2HfZzH4yEcDs/6EZHalclkiJSmg0SBYDhcsTDucrmIlkbl/cDE0FBF6hARkdpWsTBeKBT4xje+wQc+8IEDNu14//vfzx133GH1P/vZz/KTn/yE119/nY0bN7Ju3Tp279591CPqIlLb0uk04dKFklEgEAhUrBan00msbFnFhL55ExGRY1ChfaTh4YcfZmBggN/+7d8+4L6BgYFZ80AnJyf58Ic/zPDwMI2NjfT39/PEE0+wYsWKE1myiFRYMpGgodSO2u0V3fzLbreTdLmgdEFSXGFcRESOQcXC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "from scipy import stats\n", + "\n", + "def multi_gaussian(params,num_gaussians,x):\n", + " \"\"\"\n", + " Generate a multi-guassian.\n", + "\n", + " Parameters\n", + " ----------\n", + " params : numpy.ndarray\n", + " float numpy array that is num_gaussians*3 long. this encodes the\n", + " gaussian [mean1,std1,area1,mean2,std2,area2,...meanN,stdN,areaN]\n", + " shape parameters\n", + " num_gaussians : int\n", + " number of gaussians in the params array\n", + " x : numpy.ndarray\n", + " calculate guassians over the values in x \n", + "\n", + " Returns\n", + " -------\n", + " out : numpy.ndarray\n", + " sum of the pdfs for the gaussians in params calculated over x\n", + " \"\"\"\n", + "\n", + " # Create output array\n", + " out = np.zeros(len(x),dtype=float)\n", + "\n", + " # For each gaussian\n", + " for i in range(num_gaussians):\n", + "\n", + " # Grab the shape parameters\n", + " mean = params[i*3]\n", + " std = params[i*3 + 1]\n", + " area = params[i*3 + 2]\n", + "\n", + " # Add this to out\n", + " out += area*stats.norm(loc=mean,scale=std).pdf(x)\n", + "\n", + " return out\n", + " \n", + "gen_params = {\"params\":np.array([5,0.3,10,6,1.5,10]),\n", + " \"num_gaussians\":2}\n", + "\n", + "err = 0.25\n", + "num_points = 50\n", + "\n", + "x = np.linspace(0,10,num_points)\n", + "y_obs = multi_gaussian(x=x,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = 2*err\n", + "\n", + "test_fcn = multi_gaussian\n", + "non_fit_kwargs = {\"x\":x,\n", + " \"num_gaussians\":2}\n", + "\n", + "f = dataprob.setup(some_function=test_fcn,\n", + " method=\"ml\",\n", + " fit_parameters=[\"m0\",\"s0\",\"a0\",\"m1\",\"s1\",\"a1\"],\n", + " non_fit_kwargs=non_fit_kwargs,\n", + " vector_first_arg=True)\n", + "\n", + "f.param_df.loc[[\"m0\",\"s0\",\"a0\",\"m1\",\"s1\",\"a1\"],\"guess\"] = [5,1,1,7,1,1]\n", + "f.param_df.loc[\"s0\",\"lower_bound\"] = 0\n", + "f.param_df.loc[\"s1\",\"lower_bound\"] = 0\n", + "f.param_df.loc[\"a0\",\"lower_bound\"] = 0\n", + "f.param_df.loc[\"a1\",\"lower_bound\"] = 0\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "\n", + "fig = dataprob.plot_summary(f)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "038040b9-4167-449d-abdd-292812870580", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "not doing corner plot for parameter a0\n", + "not doing corner plot for parameter a1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6YAAAOcCAYAAABdY6wgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADhvElEQVR4nOzdeXxU9b3/8ffsyUxWEsKaEHYDiIBYBQWlVC3iXsViUe9Faxe5VigqtOJWK5Rr21us2p+ttaXeWuttVSy17lgUrAVFQUJQICSQhMkAySQzyey/P2LGRBIIkORkJq/n45GHmXPOjJ8sX3Le891MsVgsJgAAAAAADGI2ugAAAAAAQO9GMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIayGl1AMolGo6qoqFB6erpMJpPR5QA9SiwWU11dnQYOHCizmffEAAAA8DmCaSeqqKhQfn6+0WUAPVp5ebkGDx5sdBkAAADoQQimnSg9PV1S0413RkaGwdX0bo3BsOb+/HVJ0tMLZyrFzq+60bxer/Lz8+PtBAAAAGjG3Xonah6+m5GRQTA1mD0YljXFKanp50Ew7TkY5g4AAIAvYqIXAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYymp0AcCJKCsrk8fjafd8MBztxmoAAAAAnAyCKRJOWVmZioqK5Pf7273GYnNo5rK/SJLKy/dp5PDCbqoOAAAAwPEimCLheDwe+f1+PfXUUyoqKmrzmmA4qntePiBJOnjQQzAFAAAAejCCKRJWUVGRJk2a1Oa5xmBYevnlbq4IAAAAwIlg8SMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAzF4kdIejtKSmS3Hv09mNzcXBUUFHRTRQAAAABaIpgi6d10442KhAJHvcbpdKq4uJhwCgAAABiAYIqk9/bbbx+1x7S4uFjz5s2Tx+MhmAIAAAAGIJgi6U2YMEEpdn7VAQAAgJ6KxY8AAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADAUwRQAAAAAYCiCKQAAAADAUARTAAAAAIChCKYAAAAAAEMRTAEAAAAAhiKYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADGU1uoBkEovFJEnvvPOOXC6XwdUkr5KSEklSfX29vF5vm9c0BsMKN/olSV6vV0F7+7/q9fX1kqTNmzfHP0fn8/l8kj5vJwAAAEAzU4y7xE6zb98+5efnG10G0KOVl5dr8ODBRpcBAACAHoRg2omi0agqKiqUnp4uk8kkr9er/Px8lZeXKyMjw+jyjgu1GyOZa4/FYqqrq9PAgQNlNjOLAAAAAJ9jKG8nMpvNbfYEZWRkJFzIaEbtxkjW2jMzM7u5GgAAACQCui0AAAAAAIYimAIAAAAADEUw7UIOh0P33HOPHA6H0aUcN2o3BrUDAACgN2LxIwAAAACAoegxBQAAAAAYimAKAAAAADAU28V0oi/uYwrgcx3dx5R2BLSP/YABAMmKYNqJKioqlJ+fb3QZQI9WXl7e5n6/zWhHwLEdqx0BAJBoCKadKD09XVLTDUNGRobB1fRujcGw5v78dUnS0wtnKsXOr7rRvF6v8vPz4+2kPbSjnoN21PN0tB0BAJBouMvoRM3DDjMyMrihNpg9GJY1xSmp6efBDXXPcazhubSjnoN21HMxzB0AkGyYoAIAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwVK8PptFo1OgSAAAAAKBX67XBdO/evdq/f7/M5l77LQAAAACAHqFXprItW7bo9NNP1/r1640uBQAAAAB6PavRBXS3Dz/8UFOnTtV3v/tdff3rX291LhaLyWQydfi1AoGAAoFA/LHX6+20OgEAAACgt+hVPaYlJSU688wzdeedd+qhhx5SJBLRO++8o+eee05bt2497vmmy5cvV2ZmZvwjPz+/iyoHAAAAgOTVa3pMGxsbdf/998vlcmn27NmSpCuuuEK7d+/WgQMHdPjwYS1atEjf+c53NHTo0A695tKlS7Vo0aL4Y6/XSzgFkJS2bNkiu/Xo72Xm5uaqoKCgmyoCAADJpNcE05SUFN14440KhUJavHix9u/fr9GjR+vJJ5/UiBEj9Le//U233nqr0tLSdPfdd3doWK/D4ZDD4eimrwAAjHPOOecoEgoc9Rqn06ni4mLCKQAAOG5JH0w//fRT/fWvf9Udd9yhL3/5y7Lb7frxj3+sESNGaNWqVRo2bJgk6brrrlNFRYVWrFihBQsWqE+fPgZXDgA9x2+eeELjxxa1e764uFjz5s2Tx+MhmAIAgOOW1MH0o48+0owZM5Senq758+crNzdX55xzjh544AFVVlbGb56i0ajMZrMyMzNVUFCg9PR0gysHgJ7llNGjNWnSJKPLAAAASSppFz/68MMPddZZZ+mSSy5RbW2t/vSnP8XPnX766broootktTbl8ua9TIuLizVixAiFw2HFYjFD6gYAAACA3iYpg+mWLVs0ZcoUfe9739Pvfvc7XXvttXr66adVUVERv6Y5jEpSeXm5li1bpt///ve6//77lZqaelzbxgAAAAAATlzSBdM9e/bovPPO0/e+9z0tX75ckjRz5kxt27ZNJSUlktRqW5gPP/xQ119/vf73f/9X69at09ixYw2pGwAAAAB6q6QLpiaTSatWrYqHUkm68sorde655+ree+9VIBBo1Vt62mmnacmSJXrttdc0YcIEAyoGAAAAgN4tqYJpNBpVYWGhrr/++vix5rmiV155pfbv36+tW7fGr2124YUXxlfnBQAAAAB0r6QKpi17Qps1zxWdO3euYrGYHnvssXavBQAAAAB0v16RziKRiBwOh+644w69/fbb2rx5s9ElAQAAAAA+k9DBNBqNKhKJHHHsiywWiyRp+vTpKi0t1TvvvNMt9QEAAAAAjs1qdAEnavv27XrwwQdVVVWlkSNH6uKLL9bs2bNlNpsViUTiYbSloqIi3X///Zo5c6YBFQMAAAAA2pKQPaYlJSWaOnWqIpGIzjjjDG3cuFH33nuvFi5cKKmphzQYDLZ6TnPP6p133smWMAAAAADQgyRcMI3FYlq9erUuvPBCPf3001q+fLnWr1+vyy+/XOvWrdPNN98sSbLb7ZKkNWvWqLq6us0eVAAAAACA8RIumJpMJlVUVKiqqip+LD09XbfeeqvmzZunDz74QCtWrJAkrV27Vrfccot+8YtftDn3FAAAAABgvIQKps17kk6aNEmRSEQlJSXxc+np6Zo/f74mTpyoF198UcFgULNnz9b8+fM1f/58tocBAAAAgB4qodJa856kF110kUpKSrRy5UrV19dLagqt2dnZWrZsmTZu3KhXXnlFknTfffdp2LBhhtUMAAAAADi6hFyVd/jw4frzn/+sWbNmKTU1Vffee69yc3MlSTabTePHj1dOTo7BVQIAAAAAOiIhg6kkzZgxQ88++6yuvvpqVVZWas6cORo/frxWr14tt9ut/Px8o0sEAAAAAHRAwgZTSbrkkku0YcMGLVq0SHfeeaesVqssFovWrl2rwYMHG10eAAAAAKADEjqYSk0LIa1Zs0aHDh1SXV2dBgwYEB/WCwAAAADo+RI+mEpSRkaGMjIyjC4DAAAAAHACEmpVXgAAAABA8iGYAgAAAAAMRTAFAAAAABiKYAoAAAAAMBTBFAAAAABgKIIpAAAAAMBQBFMAAAAAgKEIpgAAAAAAQxFMAQAAAACGIpgCAAAAAAxFMAUAAAAAGIpgCgAAAAAwFMEUAAAAAGAogikAAAAAwFAEUwAAAACAoQimAAAAAABDEUwBAAAAAIYimAIAAAAADEUwBQAAAAAYimAKAAAAADCU1egCjPDpp5/qxRdfVGVlpWbMmKFJkyapX79+RpcFAAAAAL1Srwum27Zt0/Tp0zV27FiFQiGtWrVKV155pa677jrNmjXruF4rEAgoEAjEH3u93s4uFwAAAACSXq8aytvQ0KClS5dq3rx5Wrdund599109//zzOnjwoFauXKnnnnvuuF5v+fLlyszMjH/k5+d3UeUAAAAAkLx6VY+p3W7X/v37ddZZZ8lisUiSvvrVryorK0vLly/X448/roEDB+rMM8/s0OstXbpUixYtij/2er2EUwAJo6ysTB6Pp93zwXC0G6sBAAC9Wa8JpuFwWMFgUAMGDIjfiEUiEVksFp111llavHixvv3tb+v555/XmWeeqVgsJpPJdNTXdDgccjgc3VE+AHSqsrIyFRUVye/3t3uNxebQzGV/kSTl5OR2V2kAAKAXSvpgevjwYWVnZ8tqtcpqteqSSy7R9773Pc2aNUsXXHCBotGozGazpk2bpgULFujOO+/UokWL1LdvX6NLB4Au4/F45Pf79dRTT6moqKjNa4LhqO55+YAkKT9/cHeWBwAAepmkDqYffPCBJk+erE2bNum0006T2WzWt7/9bW3evFlXXXWVXnrpJZ199tnx60eMGKHCwsL4MF8ASHZFRUWaNGlSm+cag2Hp5Ze7uSIAANAbJe3iRx9++KHOPfdc3XbbbZo4caLM5s+/1BUrVujiiy/WBRdcoNWrV6u0tFSRSEQvv/yyzGZzq2sBAAAAAF0rKXtMt23bpilTpmjx4sW6//77JUlut1tVVVUaO3ascnJy9Mc//lG33367Fi5cqLS0NOXl5WnPnj169dVXlZWVZewXAAAAAAC9SNIF0/r6ei1YsEAOhyMeSr/2ta9pz5492rJli84991xdeeWV+q//+i/993//t6644gpVVFQoGAxq6tSpKiwsNPYLAAAAAIBeJumCqcVi0Te/+U3de++9uuKKK9TQ0CCbzaYf/OAHGjBggB577DH94Q9/UEZGhm644QZNnTrV6JIBAAAAoFdLumCampqqr33ta3I4HLrjjjvUv39//fWvf1X//v0lNS30cemll+rVV1/VDTfcYHC1AAAAAICkC6aSlJKSotmzZys1NVUWiyW+9UskElGfPn00YcIEbd26Nb5VDAAAAADAOEkZTKWmntPzzz9fZrM5vv1L8389Ho8mTJhAKAUAAACAHiChg2k0GlUsFmu172jLXlC73d7q+oaGBj3wwAP65z//qTfffLNbawUAAAAAtC1hg+n27dv14IMPqqqqSiNHjtTFF1+s2bNny2w2KxKJtAqrkvTcc8/p2Wef1bp167R27VqNHj3aoMoBAAAAAC0l5FjWkpISTZ06VZFIRGeccYY2btyoe++9VwsXLpTUNGQ3GAy2es7EiRM1ZswYvfXWW5o4caIRZQMAAAAA2pBwwTQW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b98+0ul0td6w+gN/PvaXw1/buj+3cz7mTevAgQMUHR1NAwcOpC5dupDRaKRXXnmFiHzjBjAzM5MSEhJozpw5XtvtdrvwtdjnnoqKCurbty9NmzaNnE4n5efn08qVK6lNmzbUrVs3qqysJCLfOJ6LFy+m66+/nmbMmEHJycm0evVq4TWx/0ZLSkqoV69eNGvWLCIiqqyspAcffJAWL14salzV5efnU6dOnWju3LlEVBXzkCFDhDbj4Qv/1tUdPHiQwsPD6a677qL+/ftTUlISzZw5kyorK0VvP3XJzs6mVq1a0ezZs722l5eXixRR/UpKSqhz5840c+ZMKikpoTNnztCSJUuoQ4cONHToULHDu6gHH3yQrrvuOrrrrrto4MCBtH79+ivyvpyYNgGn00ldu3alp59+2mv7jh07aPjw4TR48GD6888/RYqublarle655x4KDg6mv//+m4iIbr/9dmrfvj2ZTCaSyWQ0Z84cOnXqlMiR1m7RokV0xx13eG179tlnqXfv3jRp0iTKyckRJ7CLOHXqFOn1epo6dSoRVd1Qvf766zR79mz6v//7Pzpy5AjZbDaRo6yfvx77y+WPbb2ystKv27k/HnN/Pbemp6dTq1at6PHHHyeHw0FERM8//zyZTCYqLCwUOboqX3/9Nd1yyy1ERORwOGjBggV011130bhx42jlypXCfmLeXBcVFVHHjh3pu+++E7Y5HA76+++/qW3bttSnTx9hu9hJwKZNm+jhhx+m1NRUGj9+PLVr147Wr19PTz/9NG3btk3U+E6cOEFt27al3bt3C9umTJlCffr0ocGDB9Pw4cPp7NmzRCTecdy9eze1bduW0tLShG333XcfjRgxgu655x6aNm2asN1XktOsrCxq164dzZs3T9j2ySefUFBQEJ0+fVq8wC7it99+o969e5PT6SSn00kPP/wwpaSk0I033kivv/662OHVkJGRQa1bt6bt27cL28rLy+nLL7+kNm3a0N133y1idBe3cuVKeu655+ivv/6iQYMGUUpKCu3du5eef/55ysjIuOT35QHuV5nT6YTNZkNkZCQKCgoAnJ+U3bt3b8yePRuZmZn49ttvAfjW/Du1Wo37778fAwYMwOzZs9GqVSu43W58/PHHOH78OD7++GN88MEH+OyzzwD4VuwAYLVakZOT4zU5+/HHH8fo0aNx+PBhLF++HHa7XcQIa/fbb7/BZDJBr9cjNzcXw4YNw6pVq7Br1y789NNPGDp0KL7++mufntzvr8f+crjdbr9s6yqVCv/617/8sp376/nVH8+tLpcL3377Lbp164aZM2cK8+PGjRuHgIAAn5nTm5qaCpVKBQDo378//v77b4SGhoKIMH78eLz00ksAquZDicVoNMLtdmPjxo3CNrlcju7du+P9999HYWEh5s+fD0DcOAFAqVTit99+Q1xcHB577DH069cPo0ePxsKFC9GqVStR55wGBATAZrPh7bffRmFhIRYvXoxPPvkEQ4YMQUpKCs6dO4eBAwfC4XCIdhx1Oh0sFgtWrFgBp9OJJUuW4LPPPkOrVq0QFhaGjRs34sYbbwTgG3NOiQgbN25EcnIypkyZIsx3Hjt2LCIjI5Geni5ugPXIysqCTCaDTCbDwIEDceLECfTq1Qu9evXCzJkzMXv2bLFD9GIwGOBwOIT55QCg1+sxfPhwzJ8/H6mpqXjvvfdEjLB+BoMB33//PXr16oU5c+ZAp9Nh2LBhmDdvnnAOvqRzw2WnzKxWnrl0Hu+88w4plUr65ZdfiMj7ydjbb79NBoOB8vLymjTGupw4ccJrXuMff/xBgwcPpsGDB9PJkye99n3uuecoMDDQZ56WE50/tq+++iq1adNGeFLpecJPRPTwww9TYmIilZSUiBLjxSxbtoz69OlDISEhNHjwYMrOzhaGTY0YMYJatGhBZWVlIkdZk2e43Guvvea3x/5yvfnmm37T1qvbsmWL37Rzfz2/+vu59YsvvqjRM11aWkphYWFec4zE9OOPP1JiYiItW7aMUlJSKDs7m4iIzGYzLVu2jEJCQmjHjh2ixefpuXvyySepb9++NeZBOxwOmjlzJt16661ew4/FUlxcTNdff71w/Rk6dCjpdDpKTEykb7/9VtTY7HY7vfPOOxQTE0MpKSmk0Wi8hhqfOnWKAgMDvebGNrXS0lKaO3cuRUdH06233kpyuZy++uor4fWNGzdSREQEbd68WbQYL/TLL7/QsmXLvLZZrVZKSEigVatWiRNUA2zfvp0CAwPppZdeottuu02YNkRUNZJCKpXSjz/+KGKE3iorK2nixIk0ePBgOnDggNdrZrOZhg8fTmPGjBEpuotLTU2l6667Tvh+4MCBpNVqqXfv3vTHH39c8vtyYnoV7Nmzh6RSKe3Zs8frBmny5MlkMBho69atXvuvX7+eOnbs6BM3IJ6iEfHx8ZSfny9s37VrF/3www9CguH5XO+88w516tTJJy6gF3K5XNSqVSu69dZbhYuqJ36n00l6vZ4+//xzMUOs14svvkgjR46kXbt2EdH5Y15cXEwymczr4ia2Y8eOef39ulwuatu2rd8e+4bKysqin3/+mb788kuvYZcTJ0706baem5tLu3btovXr13vNv/n77799vp376/m1OZ1bic4nWGazmVq2bEm///678NpPP/0kWqGUY8eO0aBBg+j666+ngQMHer12+vRpatGiBX355ZeixFbdyZMnqXfv3nTbbbfRpk2bvF5bvnw5tW7dWvS/WY9+/frRjh07aOLEiRQVFUWrVq2iqVOnUnh4uOjJqcPhoMLCQjp06BC1b9+eMjMziajq7zM1NZWSk5NrHN+mVlZWRqdOnaItW7ZQhw4darT/li1beg1H9iWedu52u6lr16703//+V3ht5cqVwlQEsbndbiouLqYJEyZQ165dqVOnTl6vlZeXU9euXemNN94QMcqaPHN5R40a5TXcm4jo5Zdfpm7dupHZbBYpuvq5XC666aabKDMzk8aPH09RUVH09ttv05133kk9e/akLVu2XNL7ij9uoJnZv38/br75ZsycORNdu3b1Gprx3HPPYdiwYUhJScGnn36K9PR0uFwu/PLLL5BKpaIP49i/fz969+6N22+/HaWlpVi9erXwWvfu3XHbbbdBLpcDOD/k5OjRo2jZsiWcTqeow81SU1OxYMECjB07Fh9//DH+/PNPSKVSrFmzBvv378cdd9yB8vJyIf6ioiK0aNECoaGhosXscfr0abz55pt4+OGH8csvvyAvLw8AMHv2bMyZMwcdOnQAUHXMiQinT59Gq1atkJSUJGbYgv379yM5ORkrVqwAUDXkTyqVYvXq1Th06JBPH/vLcfDgQfTo0QMLFy7E2LFjMWrUKMyYMQMA8OGHHwrDyXytrR88eBD9+vXD/fffj0GDBmH06NE4cOAAAKBHjx4+3c799fzqz+dWjwtj8AzhlEql0Gq10Gq1AIB58+Zh4sSJUKvVYoSJNm3aYPjw4di1axf++usv7Nq1S3gtOjoakZGRkMlkosTmQURo0aIF3n//fWRmZuKFF17A8uXLAVQNT9+7dy+ioqJEO4YenmGcJpMJQ4YMwZYtW7B2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f,filter_params=[\"a\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "36816627-7212-40e3-b150-00b521a0266d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
m0m05.0093450.0073424.9945395.0241525.0False-infinfNaNNaN
s0s00.2976260.0085820.2803180.3149331.0False0.0infNaNNaN
a0a09.8137710.3308709.14650810.4810341.0False0.0infNaNNaN
m1m15.9488580.1074005.7322656.1654527.0False-infinfNaNNaN
s1s11.5185250.0866391.3438011.6932491.0False0.0infNaNNaN
a1a19.6043180.5678658.45910810.7495281.0False0.0infNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed lower_bound \\\n", + "name \n", + "m0 m0 5.009345 0.007342 4.994539 5.024152 5.0 False -inf \n", + "s0 s0 0.297626 0.008582 0.280318 0.314933 1.0 False 0.0 \n", + "a0 a0 9.813771 0.330870 9.146508 10.481034 1.0 False 0.0 \n", + "m1 m1 5.948858 0.107400 5.732265 6.165452 7.0 False -inf \n", + "s1 s1 1.518525 0.086639 1.343801 1.693249 1.0 False 0.0 \n", + "a1 a1 9.604318 0.567865 8.459108 10.749528 1.0 False 0.0 \n", + "\n", + " upper_bound prior_mean prior_std \n", + "name \n", + "m0 inf NaN NaN \n", + "s0 inf NaN NaN \n", + "a0 inf NaN NaN \n", + "m1 inf NaN NaN \n", + "s1 inf NaN NaN \n", + "a1 inf NaN NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "f.fit_df\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91578f50-a289-4830-922e-0a134cde76a3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/periodic.ipynb b/examples/periodic.ipynb new file mode 100644 index 0000000..b7aee28 --- /dev/null +++ b/examples/periodic.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0ee00796-bd34-475d-acdd-e2e878bfae47", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "76af5cec-aa8c-412c-a99d-9da0da40b61b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "### NOTE: it would likely be better to reformulate this as a fourier transform\n", + "# because this regression is not particularly well-behaved. The poor behavior, \n", + "# however, lets us show a \"real life\" example of setting parameter bounds, etc.\n", + "\n", + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "\n", + "def periodic(amplitude,phase,freq,theta):\n", + " return amplitude*np.sin(freq*theta + phase)\n", + "\n", + "gen_params = {\"amplitude\":5,\n", + " \"phase\":np.pi/2,\n", + " \"freq\":2}\n", + "\n", + "err = 0.2\n", + "num_points = 50\n", + "\n", + "theta = np.linspace(0,4*np.pi,num_points)\n", + "y_obs = periodic(theta=theta,**gen_params) + np.random.normal(0,err,num_points)\n", + "y_std = err*2\n", + "\n", + "non_fit_kwargs={\"theta\":theta}\n", + "\n", + "f = dataprob.setup(periodic,\n", + " method=\"ml\",\n", + " non_fit_kwargs=non_fit_kwargs)\n", + "\n", + "# Set the guesses and bounds. Because of the periodicity, this is not\n", + "# particularly well behaved. Fix frequency at right value. \n", + "f.param_df.loc[\"amplitude\",\"guess\"] = 1\n", + "f.param_df.loc[\"phase\",\"guess\"] = np.pi/2\n", + "\n", + "f.param_df.loc[\"freq\",\"guess\"] = 2.0\n", + "f.param_df.loc[\"freq\",\"fixed\"] = True\n", + "\n", + "f.param_df.loc[\"phase\",\"lower_bound\"] = np.pi/2.5\n", + "f.param_df.loc[\"phase\",\"upper_bound\"] = np.pi/1.5\n", + "\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7ae52733-b40b-4ccf-8117-26999eb4b8a5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "image/png": "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27ZtM02aNDHbt2/3YMIChc/bqlWrTL169Ypsrp8zZ45Zs2aNx7I5nU6Tm5trunTpYlasWGGMMWb48OEmPDzcXH/99WbChAnm7NmzHstnde+//7657777zDfffGOM+fUN3OVyGX9/f7No0SJPxjN79+41e/fuLTKtY8eOpnXr1hctxIiICLNgwYLyindJP/zwg2nevLlZu3ate9oHH3zg1c91cnKy+eyzz8wHH3xQ5LkdPXq0CQsLMxs3biwy/xdffGFatmxpUlNTSzWHb+ltC4C3MMYU2awWFBSkXr16yW63y8fHR5Lc/6akpKh169blvun7txnDwsIUFhYml8ulgIAAJSYmujfLr1q1SqGhobrmmmvKNePFFD5P/fr1kySNGzdOkpSWlqZPPvlE27Zt82g2u92u2267TdnZ2br77ru1bt06/fe//9WGDRv05ptvytfXV3//+9+9arNrRXPw4EEtW7ZM33//vXr37q24uDg1a9ZMgwYNUmxsrKKjoyXJfQbD4cOH1axZMzVr1sxjmXft2qXWrVvr73//u2JiYuR0OuXj46NPPvlEN954o4YOHarFixcrNjZWkuRwOBQdHa3atWt7LLMkxcfHq1u3bsrIyNCuXbvUvXt3SdLAgQPVvHlzr3yud+/erV69eql+/frasWOH2rRpow4dOugf//iHFi9erKysLPXu3VuvvvqqunbtqqioKH3++efu5bdUlerHBXjM8ePHf9eBXw6HwzzxxBOmTp065ocffijDZL8qTsZffvnFtG/f3vTq1csMGjTI3H333aZatWpm586d5ZKxcA39cgcWnX/f8uXLjc1mM1WrVjU7duwo83zGXDnjnDlzjM1mM/Xq1TPbtm0zxhiTm5trXnjhBXPkyJFyyWhVu3fvNrVq1TL9+/c3t9xyi2ncuLEZP368yczMvOTPTJ8+3bRq1cr89NNP5Zj0V/Hx8SYoKMg89thjF70/OTnZNGvWzMTExJjnnnvOrFy50kyePNlUr17dHDp0qJzT/qow9/PPP2+mT59uatasWWTL3sV4+rlOS0sz119/vRk/frxJS0szP/74o3nmmWdMbGys6du3r3u+v/71r6Z69eqmfv36pn379iYiIqJM3j8oeAv48ccfTUREhOnfv7/ZunXrFedfvny5GTp0qKlTp065lVJxMhYW1t69e81f/vIX06dPH/PAAw9csFmxrOzcudP07dv3sm/WhVwul8nOzjaPPvqoqVq1arkdVV+cjJmZmeapp55yl7und79YRXJysmnevLl5/PHH3dPefvttU61atYt+cPr444/NhAkTTJUqVcrtA+pv7d+/39hsNvO3v/3NGFPw4fDDDz80f/vb38z777/v3u2Vn59v7rnnHhMXF2caNWpkOnToUG7vDRcTHx9vfH19zdSpU40xBR+smjVr5t5l8NvXtDc818YYc+zYMdO0aVOzadMm97SMjAzzwQcfmKZNm5qBAwe6p3/zzTfmww8/NEuXLi2zD94UvAWsW7fO+Pr6mltuucWMGjWqyL7qwv2y5zty5Ih55plnzP79+70uY+GC63A4jDHmguxl5VJrOZdbk9+1a5epXr26+e6778o6njGmeBkLvy9cy0fpcLlc5p133jF33nmnOXLkiPt1mpOTY5o3b27WrVt3wc88/vjjplOnTmbXrl3lnLaAy+Uyb775prHZbOa9994zxhhz8803m9atW5smTZqYxo0bm/bt25sPP/zQ/TNnz541J06c8OixGunp6aZXr17mySefdE/Ly8szffv2NR07drzoz3j6uS50+vRp07BhQzNv3rwi07Ozs80777xjWrZsaf75z3+WWx4K3gJSU1NNv379zGuvvWbatm1rhg8f7j66+/xPuqtWrXIfRV/eBVDcjCtXrixyVGx5nIObkJBgQkJCzOTJk4tMz8nJcX9/qbXg8nojLGlG1t5Lz+eff27mz59fZFpWVpZp0KCBu0B/q7QPmvq9MjIyzLx584zNZjPXXHONufPOO82+ffuMMcZ89913ZujQoaZ79+4e26R9KYUZjfn1vSohIcGEh4ebt99+233f+e8Pnn6ujSko8tGjR5s+ffpc8GEjMzPT9OvXzwwZMqTc8lDwFVx+fr45efKkadq0qfnxxx/N8uXLzQ033GDuu+8+07FjR3PnnXcaY3496vuJJ54wTqezXAev+L0Zn3zyyXIrphMnTpjatWubW2+91Z11/Pjx5o9//KNp1qyZmT9/fpFjFF5++WXz1ltvlUu2ipSxsilcflwul2nTpo3597//7b7vf//3f8tk0JKSysrKMi+88ILp0qWLe7dNoRUrVpjAwED3aZWedrn3pZSUFNOzZ08zZsyYIvN624fYwuM0Bg0adMFphi+88IJp27ZtsXYDlgaOoq/g7Ha7atSooRtuuEF79uxR//79FRAQoNGjRysnJ0f33XefpIKjvrdt26YxY8aU+xHz3p4xLi5OycnJWrVqlf7nf/5HeXl5at26tRo0aKCXX35Ze/bs0fTp0+Xn56d//etfioyM1IABAxQeHk7GSqrwLASbzaaQkBAFBQVJkqZOnapXX31V27dv92S8IgIDA3XvvfeqR48eiomJkVQw+IrdbletWrXUqFEjr3mdXO7sjoiICI0ePVpjxozRgw8+qBtvvFGSd12QyuVyqUWLFlq1apV69Oghl8ulsWPHuo/+/+GHH1SvXj35+pZT9ZbLxwiUuVGjRrkP/rnnnntMtWrVTPPmzc3dd999wTmXnuKtGY8fP25GjRplgoKCTK9evUxKSor7vqVLl5qqVauajz/+2BhT8On82LFjZIQxpuAYkZiYGLNixQrzzDPPmKCgoGId6OotJk+ebOLi4syZM2c8HaVY0tLSTO/evc19991nsrKyPB3nolscCncpbNu2zbRu3dq0bdvWXH/99eaOO+4w4eHhJj4+vtzy2Yzx4svv4IrM/z+f/J133tGRI0d08uRJrVy5Ut98843i4+M1efJk9erVS/Pnz1dAQIBHzn+uCBmPHz+uV155RT179tQtt9xS5Dz96Oho/elPf9LcuXPLPVdFy2gFheeIF0d+fr66deumM2fO6OjRo/rqq6/Uvn37Mk54od+TWZL27dun1157TW+//bbWr1+vVq1alWG6S/u9uSXpL3/5i7766itt27ZNwcHBZZTs0jIzM+VyuWSMueSWj8K/KykpSdu3b9fatWsVFRWlfv36le85+uX2UQJlasOGDcZms5natWsX2c+2YsUKrxm20dsznj17tshBay6Xy6SkpJi4uDizdOlSDyb7VUXIWJHt27fPzJs3zxw/fvyS85y/1uZwOEzHjh1NZGSkx/Zj/97Mu3fvNg888IBp06ZNua5N/tbvzV24ZpyXl+ex8Ry+//5707t3b9OmTRtTt25ds2TJEmNM0Zznj6rnaRS8ReTm5prFixe732S84cX1WxUh429Nnz7dREdHm6NHj3o6yiVVhIwVwYEDB0z16tWNzWYzU6dOveigKhd7zb7zzjtFjvouTyXNvH379iLXpShvJc1dXqfNXsz3339vIiIizIQJE8zSpUvNxIkTjZ+f3yXPu//tGUGeQMFbiLcdTXoxFSGjMca899575v777zfVqlXz6IAfl1MRMlYU586dM3fffbcZM2aM+ec//2lsNpuZPHnyJUdOe/75583MmTPLOWVRFTGzMSXLXThQj6ekpqaa3r17m0ceeaTI9Jtvvtk8/PDDxpiiH0j+85//lPsZQRfDUfQW4k1Hk15KRcgoSc2bN9eSJUv09ddfu8fn9jYVIWNFYbfb1a5dO0VERGjw4MGKjIzUkCFDJElTpkxRZGSke97Tp09r+/btOnr0qMaNG6eIiAgy/w4lzf3QQw+pevXqHsmcl5entLQ03XXXXZJ+PQuhYcOGOn36tKSiZwD07dtXW7Zs8chZS0V47KMF4OXO39ftrSpCxori3LlzRW4vW7bM2Gw2M2nSJPdZC/n5+ebMmTMmNTX1svuOy0tFzGxMxcx9/sifhbsKnnrqKTNy5Mgi83nTGQmswQOX4O/v7+kIV1QRMlYUISEhkgqOgLbb7Ro8eLCMMRo2bJhsNpvGjx+vuXPn6ujRo1q2bJnH1ibPVxEzSxUzd+GV61wul/z8/CQVnCF08uRJ9zyzZ89WQECAHnnkkfI71/0yPJ8AALyIj4+PjDFyuVwaMmSIbDabRo4cqY8++kiHDh3Sli1bFBAQ4OmYRVTEzFLFzG2324ucolq4CX769OmaNWuWdu7c6RXlLkmcBw8AF1H41miz2dSjRw/Fx8dr/fr1atmypYeTXVpFzCxVvNyF++BnzpypEydOKDo6Wk899ZQ2bdqktm3bejqem3d8zAAAL2Oz2eR0OjV58mStW7dO8fHxXls4hSpiZqni5S5ca/fz89OiRYsUHh6ujRs3elW5S1LFOKQZADwkNjZWO3bs8NhobyVRETNLFS/3rbfeKknatGmTR0YwvBI20QPAZZy/v7WiqIiZpYqZOzMz033QoLeh4AEAsCA20QMAYEEUPAAAFkTBAwBgQRQ8AAAWRMEDAGBBFDwAABZEwQMAYEEUPAAAFkTBAwBgQRQ8AAAWRMEDAGBBFDwAABZEwQMAYEEUPAAAFkTBAwBgQRQ8AAAWRMEDAGBBFDwAABZEwQMAYEEUPCzn5ptv1vjx4923GzRooAULFpTL7wIqgrJcJuA9fD0dAChrW7duVUhIiPu2zWbTihUr9Kc//clzoQCgjFHwsLwaNWp4OgIAlDs20aPMfPbZZ+rcubOqVq2qiIgI9e3bV4cOHZIkHT16VDabTR988IG6dOmioKAg3XDDDdq/f7+2bt2q9u3bKzQ0VLfddptOnTrlfswxY8boT3/6k55++mnVqFFD4eHh+stf/qLc3NxL5jh/c2SDBg0kSf3795fNZnPfLnzc840fP14333yz+3ZmZqZGjRql0NBQ1alTRy+88MIFvysnJ0eTJk3SNddco5CQEN10001av379737ugKtx8803a9y4cRo3bpyqVKmiyMhITZs2TcYY9zwOh0N33323wsLCVL9+fb3++utFHuOxxx5T06ZNFRwcrEaNGmnatGnKy8tz35+QkKDu3bsrLCxM4eHhateunbZt2+a+f+PGje5lOyoqSo888ogyMzPL/o+HGwWPMpOZmamJEydq27ZtWrNmjex2u/r37y+Xy+WeZ8aMGXrqqae0Y8cO+fr6atiwYZoyZYpeeuklff311zp48KCmT59e5HHXrFmjxMRErV+/Xu+9956WL1+up59+uliZtm7dKkl66623dOLECfft4pg8ebI2bNigVatW6YsvvtD69eu1Y8eOIvOMGzdO3377rZYtW6Zdu3Zp4MCB6tOnjw4cOFDs3wOUhnfeeUe+vr7asmWLXnrpJb344ot644033Pe/8MILat++vXbu3KmxY8fqwQcf1L59+9z3h4WF6e2339bevXv10ksvadGiRZo/f777/uHDh6tevXraunWrtm/frscff1x+fn6SpEOHDqlPnz668847tWvXLr3//vvauHGjxo0bV35PACQDlJNTp04ZSWb37t3myJEjRpJ544033Pe/9957RpJZs2aNe9rs2bPNdddd5749evRoU716dZOZmeme9uqrr5rQ0FDjdDqNMcZ069bNPProo+77r732WjN//nz3bUlmxYoVRbKNHj3a3HHHHUWmPfroo6Zbt27GGGMyMjKMv7+/+eCDD9z3p6ammqCgIPfvOnbsmPHx8TE//fRTkcfp0aOHmTp16hWfH6C0dOvWzcTExBiXy+We9thjj5mYmBhjTMEyMWLECPd9LpfL1KxZ07z66quXfMy5c+eadu3auW+HhYWZt99++6Lz3nPPPeb+++8vMu3rr782drvdZGVllehvwu/HGjzKzIEDBzR06FA1atRI4eHh7s3hSUlJ7nlatWrl/r5WrVqSpJYtWxaZdvLkySKPe/311ys4ONh9Oy4uTufOnVNycnJZ/BmSCtZIcnNzddNNN7mnVa9eXdddd5379u7du+V0OtW0aVOFhoa6vzZs2ODeNQGUlw4dOshms7lvx8XF6cCBA3I6nZKKLns2m021a9cusqy9//776tSpk2rXrq3Q0FA99dRTRZbdiRMn6t5771XPnj01Z86cIq/xhIQEvf3220WWg1tvvVUul0tHjhwpyz8b5+EgO5SZ22+/Xddee60WLVqkunXryuVyqUWLFkX2lxdu0pPkfjP67bTzN+mXFbvdXmT/pKQi+xuL49y5c/Lx8dH27dvl4+NT5L7Q0NCrzgiUpvOXM6nosvbtt99q+PDhevrpp3XrrbeqSpUqWrZsWZHjTmbOnKlhw4Zp9erV+vTTTzVjxgwtW7ZM/fv317lz5/TAAw/okUceueD31q9fv2z/MLhR8CgTqamp2rdvnxYtWqQuXbpIKjjopjQkJCQoKytLQUFBkqTNmzcrNDRUUVFRxfp5Pz8/91pMoRo1amjPnj1FpsXHx7vfBBs3biw/Pz9999137jeoM2fOaP/+/erWrZskqU2bNnI6nTp58qT7bwY85bvvvitye/PmzYqOjr7gw+fFbNq0Sddee62efPJJ97Rjx45dMF/Tpk3VtGlTTZgwQUOHDtVbb72l/v37q23bttq7d6+aNGly9X8ISoxN9CgT1apVU0REhF5//XUdPHhQa9eu1cSJE0vlsXNzc3XPPfdo7969+uSTTzRjxgyNGzdOdnvxXs4NGjTQmjVr9PPPP+vMmTOSpFtuuUXbtm3Tv/71Lx04cEAzZswoUvihoaG65557NHnyZK1du1Z79uzRmDFjivzOpk2bavjw4Ro1apSWL1+uI0eOaMuWLZo9e7ZWr15dKn87UFxJSUmaOHGi9u3bp/fee0//+Mc/9OijjxbrZ6Ojo5WUlKRly5bp0KFDevnll7VixQr3/VlZWRo3bpzWr1+vY8eO6ZtvvtHWrVsVExMjqeAI/E2bNmncuHGKj4/XgQMHtGrVKg6yK2cUPMqE3W7XsmXLtH37drVo0UITJkzQ3LlzS+Wxe/TooejoaHXt2lWDBw9Wv379NHPmzGL//AsvvKD//ve/ioqKUps2bSRJt956q6ZNm6YpU6bohhtuUEZGhkaNGlXk5+bOnasuXbro9ttvV8+ePdW5c2e1a9euyDxvvfWWRo0apb/+9a+67rrr9Kc//Ulbt25lsyTK3ahRo5SVlaUbb7xRDz30kB599FHdf//9xfrZfv36acKECRo3bpxat26tTZs2adq0ae77fXx8lJqaqlGjRqlp06YaNGiQbrvtNvfZLK1atdKGDRu0f/9+denSRW3atNH06dNVt27dMvlbcXE289sdj4AXGzNmjNLS0rRy5UpPRwG81s0336zWrVszHG0lxxo8AAAWRMEDAGBBbKIHAMCCWIMHAMCCKHgAACyIggcAwIIoeAAALIiCBwDAgih4AAAsiIIHAMCCKHgAACyIggcAwIL+Hw3ToEYFEMWBAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "61510676-f158-44e6-9e37-c65b2e0694bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
amplitudeamplitude4.9642530.0560114.8515735.0769331.000000False-infinfNaNNaN
phasephase1.5671280.0115111.5439711.5902851.570796False1.2566372.094395NaNNaN
freqfreq2.000000NaNNaNNaN2.000000True-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed \\\n", + "name \n", + "amplitude amplitude 4.964253 0.056011 4.851573 5.076933 1.000000 False \n", + "phase phase 1.567128 0.011511 1.543971 1.590285 1.570796 False \n", + "freq freq 2.000000 NaN NaN NaN 2.000000 True \n", + "\n", + " lower_bound upper_bound prior_mean prior_std \n", + "name \n", + "amplitude -inf inf NaN NaN \n", + "phase 1.256637 2.094395 NaN NaN \n", + "freq -inf inf NaN NaN " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.fit_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf4f7a3e-97fc-471b-a143-261831c884e3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/polynomial.ipynb b/examples/polynomial.ipynb new file mode 100644 index 0000000..a4a9dad --- /dev/null +++ b/examples/polynomial.ipynb @@ -0,0 +1,443 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "acc6b83c-becd-4487-b7e2-fee81ba57d1c", + "metadata": {}, + "outputs": [], + "source": [ + "### THIS CELL SETS UP THE GOOGLE COLAB ENVIRONMENT. \n", + "### IF RUNNING THIS NOTEBOOK LOCALLY, IT MAY BE SAFELY DELETED.\n", + "\n", + "#@title Install software\n", + "\n", + "#@markdown #### Installation requires two steps.\n", + "\n", + "#@markdown 1. Install the software by pressing the _Play_ button on the left.\n", + "\n", + "try:\n", + " import google.colab\n", + " RUNNING_IN_COLAB = True\n", + "except ImportError:\n", + " RUNNING_IN_COLAB = False\n", + "except Exception as e: \n", + " err = \"Could not figure out if runnning in a colab notebook\\n\"\n", + " raise Exception(err) from e\n", + "\n", + "if RUNNING_IN_COLAB:\n", + " !pip install dataprob\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5c31f6b5-4869-4d84-aac9-5f23a2670895", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
aa5.1650790.3753524.4086075.9215501.0False-infinfNaNNaN
bb0.0581790.085007-0.1131410.2294981.0False-infinfNaNNaN
cc0.1836730.0226400.1380460.2293011.0False-infinfNaNNaN
dd0.0293600.0012490.0268440.0318771.0False-infinfNaNNaN
ee0.0012290.0002440.0007380.0017191.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed lower_bound \\\n", + "name \n", + "a a 5.165079 0.375352 4.408607 5.921550 1.0 False -inf \n", + "b b 0.058179 0.085007 -0.113141 0.229498 1.0 False -inf \n", + "c c 0.183673 0.022640 0.138046 0.229301 1.0 False -inf \n", + "d d 0.029360 0.001249 0.026844 0.031877 1.0 False -inf \n", + "e e 0.001229 0.000244 0.000738 0.001719 1.0 False -inf \n", + "\n", + " upper_bound prior_mean prior_std \n", + "name \n", + "a inf NaN NaN \n", + "b inf NaN NaN \n", + "c inf NaN NaN \n", + "d inf NaN NaN \n", + "e inf NaN NaN " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "import dataprob\n", + "import numpy as np\n", + "\n", + "\n", + "def fourth_order_polynomial(a=1,b=1,c=1,d=1,e=1,x=None): \n", + " return a + b*x + c*(x**2) + d*(x**3) + e*(x**4)\n", + "\n", + "gen_params = {\"a\":5,\n", + " \"b\":0.01,\n", + " \"c\":0.2,\n", + " \"d\":0.03,\n", + " \"e\":0.001}\n", + "\n", + "err = 1\n", + "num_points = 50\n", + "x = np.linspace(-10,10,num_points)\n", + "y_obs = fourth_order_polynomial(x=x,**gen_params) + np.random.normal(loc=0,scale=err,size=num_points)\n", + "y_std = err*2\n", + "\n", + "f = dataprob.setup(fourth_order_polynomial,\n", + " method=\"ml\",\n", + " non_fit_kwargs={\"x\":x})\n", + "f.fit(y_obs=y_obs,\n", + " y_std=y_std)\n", + "\n", + "fig = dataprob.plot_summary(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "052b2b48-d72e-47f2-bd89-bc36d1745db9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Too few points to create valid contours\n", + "WARNING:root:Too few points to create valid contours\n", + "WARNING:root:Too few points to create valid contours\n", + "WARNING:root:Too few points to create valid contours\n", + "WARNING:root:Too few points to create valid contours\n" + ] + }, + { + "data": { + "image/png": "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GjVqaO/evdr62WiVi45RZFR5+cXdLklqEbxPFcpFKjS0tIL9AxV+deHOBgKAkuqiLsYMDAxU/fr1L1Utl9SGDRt0ww03KDY2VqtXr9aVV16pq6++WpMnT9b777+vtLQ0dezYUW+//bbatGmjmJgY/fDDD3K73d5LGPDX3HvvvWratKneeecdff311/r111/166+/Kjo6WjfffLO6dOmikJAQ+fn5acqUKUpISNCuXbu0e/dubdq0Sfv379ehQ4eUlpam7du357vv4OBgVahQQbGxsapcubKio6MVHR2tKlWqKKJslCavyn0RvfQ/s/TDd996ByiWpDZt2ujuu+9Wp06diuwyMsDXjRgxQl27dtXbb7+tWbNmad26dd7B+Lt0u0lb/7veGy+O1u4d2/L9brVq1dSuXTu1a9dOTZo0kb8/1/MD51IhIlgVIoKVnvm/oLSMf5b8XX967gygxPH399dLL70kY4z3NXmWR/r4vy8Jm10WqwA/hmAAgMJy5Cv2xMRE3X333brjjjv07LPPKiUlRR9++KE+//xzde/eXbNnz9a///1vDRkyRE8++aRCQ0NVoUIF7dq1S//5z39UpkwZqzfB9ho1aqT/+7//05gxY/TBBx/o/fff18GDB/V///d/+te//qWuXbuqQ4cOqlChgqpWraqYmBi1adNG+/fvlyRlZ2fr4MGD2r9/v4wxqlChgipWrKjQ0FC5XC5VrFgx3//n8Xi0YtUaSY0kSZ99+qlysjJUtmxZ3X777erbt69PDzIOFKdGjRrprbfe0vXXX6/vvvtOCxYs0M6dO/X222+p/Zj2kqR9e/fK5XKpbt266tq1q9q1a6caNWpYXDkAoCQozEypAIDCcWzokzc9e0REhCIiIjRo0CDVq1dPo0ePVp8+fTR9+nS9+uqruvnmm5WQkKDMzEy1atXqrBnJcHEqVaqkp59+Wh07dtS8efP05Zdfat++fZo+fbqmT8+dNSgwMFDlypVTuXLlFBISorJly6ps2bKKjIxUVFSU3G63kpOTlZCQoKSkJCUnJysrK0uJiYlKTEzUqVOnlJiYqKwco/Zjcqf8rF+/vrp27qSHHnronANIA5AqVqyo++67T71799a8efP0n/k/e2974MEHFdekkcLDw9WwYUPrigQAAADwlzky9AkLC1NWVpaWLl2qli1bSsodO6ZHjx5KS0vT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VGhoqKpUqVJs9f1RvXr11KNHDw0ePFiBgYFauXKlmjVrJkmqUqWKoqOj5efnZ1l9Uu7j7Ha7Va5cOXXu3FllypTRnDlzdMUVV6hu3boKCAhQw4YNi72uPz7WeZeYud1uhYSEKCQkRJI0YsQIffDBB1q1alWx11gUypUrp0WLFql///76/vvvtXz5cpUrV06VK1fWsGHD9O2333ovRbKCLx4XCsMYo+zsbBlj1LJlS7ndbu/zvFq1apo6daqqV69udZln8fVj3KWwdetWvfbaazp06JACAgL09ttvq3z58vL399e0adOUkZGRb323263q1aurWrVqks4+VlwqGzZs0A033KDY2FitXr1aV155pa6++mpNnjxZ77//vtLS0tSxY0e9/fbbatOmjWJiYvTDDz/I7XYX2+V2GzZs0G233abAwECtX79enTt31rhx49S4cWM1a9bMe3yX/ncJYHx8vGrXrq3s7Gz5+/sXy2UD69atU9u2bTVo0CBdeeWV+W4bP368Tp8+bfm+zKuzZcuW6tOnj2bOnKnPP/9cAwcOlCQ1bdrUZ/ZnUfLVfiyIHXq1MOzSzwWxS69bwY69JdFf9Je4vMspEhISzMaNG895W14SvXLlSnPFFVeYuLg406RJE3PTTTeZ8PDwYplWuqD68hw+fNg0a9bM3HDDDaZPnz6mf//+pmzZsmbNmjVFXp8x/9tPZw60dub3kydPNhUqVDCtWrUys2fPNps2bTIjR440MTExZu/evUVe3+nTp01GRkaB68yfP99cddVV3sHM8pw5g0BR2rdvX6HOZElOTjaxsbHml19+Mc8884wJCQkxv/32WzFUWDw2b95sqlSpYmrVqpVvf5w6dcps27at2OrIyck5a9aCvE8UfOG4cC4F1Zxn2rRppkWLFmblypX5lqekpBR5fedTmLqtPsYVlQ0bNpioqCgzYMAA89BDD5nWrVub2rVrF/h4jB492tSoUaNIB98+3yx1DRo0MN26dfOu99RTT5nIyEgTGxtrmjVrZqKioortjLytW7ea6OhoM3r0aLNz506zefNmU7VqVTNo0KBzrr93714zevRoExERYX7//fdiqdGY3Mc4ODjYewajMbnP53Xr1uV73g8ZMsSyfWmMMWvWrDHBwcHewVMfffRR06pVK3PgwIFzrm/V/ixKvtqPBbFDrxaGXfq5IHbpdSvY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ffnll5Kka6+9VsOGDdNzzz1XbLOJZWRkaNiwYXrxxRe9I+a/8MIL2rp1q95+++186x48eFAff/yxvvzyy2Ldh5dCUFCQUlJSFB0dLSl3FrIKFSpo0aJFKl26tMaOHasdO3Z4169atao+/PBDpaamFmudxhhJUlxcnHJycrRlyxbvbWFhYerfv7+uvPJKzZ49W5mZmeratav69+9f7H1n95ol+9ZdlNxut3e/5OTkeGfIGDt2rAYPHlzs233mLHVz5szRiBEjtGDBAu/tvjRL3Zn7JjMzU8nJyfL399czzzyjCRMm6MUXX1RERISFFUrBwcG64YYb1KFDB+/fmLx/jx07piuuuMLnnts5OTkKCgrSsGHDtGTJEsfMEFkYvtaPBbFTrxaGHfq5IHbs9eJkp96S6C9fY1l/XfIYCZbo16+fd/DCAQMGmLJly5r69eub/v37myVLllhcne/Wl5CQYPr162eCg4PNDTfcYI4dO+a97ZNPPjFlypTxDsq6YcOGYh993+PxmNtvv90MHDjQdOvWzcydO9d72759+0zfvn3Nww8/bNmlRH/k8XjMqVOnTM+ePU2fPn1MdnZ2vsu8fv/9d0tnMPircnJyTLt27fINdpe3z9PS0kz16tXNbbfdlu93zhxouLht377dlCtXzvTv398kJycbY/53qcPevXuNy+Uys2fPtqy+c7FjzcbYt+6iknepY/v27c2kSZPMG2+8YUqVKpVvLLdLzQ6z1BVmdrc8y5YtM82bNzdDhgwp9oHu/0ydxuR+Yvn000+b6Ojos8a6KEp/ts5NmzaZwMBA88YbbxR1aT7Fin4siB16tTDs0s8FsUuv+ypf6y1j6C/6q2CEPjaX9+biX//6l3nmmWfMI488YqKjo83OnTvNjBkzTK1atczDDz9s0tLSLBk/wtfrM8aYAwcOmJEjR5qffvopX83GGFO7dm0zZMgQS+rKs2LFClO6dGnjcrnMrFmz8t321FNPmTZt2vjc2CBfffWVcblc3kDvzODHbvLqnj9/vildurR5/fXXvbflDcg7e/ZsU6VKFbN582af2c758+eboKAg89hjj5mjR496lx88eNA0adIk3ywOvsKONRtj37qL0q233mqCgoJMaGio+e2334rs/7HDLHWFnZUuzy+//GJcLpeJjIws1jcQf7bOGTNmmDvuuMNER0cX67S+f7bO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acyYMTLGWF0WYCsej0cTJkxQ7dq1FRQUpNjYWL344otWlwXYxunTp9WvXz+FhoYqOjpar732mtUlAbbj8Xg0btw41ahRQ8HBwWrSpIm+/PJLq8tCMSH0gSOdPn1agwcP1sqVK/XTTz/J7XarV69e8ng8VpcG2MZHH30kf39//fbbb3rjjTf0+uuva8qUKVaXBdjKyJEjNX78eI0ZM0abNm3Sp59+qooVK1pdFmAbQ4cO1cKFCzVz5kzNmzdPP//8s1avXm11WYCtjBs3TlOnTtU777yjjRs36sknn1Tfvn21cOFCq0tDMXAZPrZFCXDs2DGVL19eGzZsUMOGDa0uB/B51113nY4cOaKNGzfK5XJJkkaMGKFZs2Zp06ZNFlcH2ENycrLKly+vN998U/fff7/V5QC2k5KSoqioKE2bNk233nqrJOnEiROqWrWqHnzwQf3jH/+wtkDABjIyMhQZGakff/xRLVu29C6///77lZqaqk8//dTC6lAcONMHjrRt2zbdcccdqlmzpsLDw1W9enVJ0t69e60tDLCRq6++2hv4SFLLli21bds25eTkWFgVYB/x8fHKyMhQ+/btrS4FsKUdO3YoMzNTLVq08C6LjIxUvXr1LKwKsJft27crNTVVN9xwg0JDQ71fU6dOZfiLEsLf6gKAotC9e3dVq1ZN7733nipXriyPx6OGDRsqMzPT6tIAACVEcHCw1SUAAEq4lJQUSdKcOXNUpUqVfLcFBQVZURKKGWf6wHGOHz+uLVu2aPTo0Wrfvr0uv/xynTx50uqyANv59ddf8/28fPly1alTR35+fhZVBNhLnTp1FBwcrJ9++snqUgBbqlWrlgICAvL9PTp58qS2bt1qYVWAvdSvX19BQUHau3evateune8rJibG6vJQDDjTB45TtmxZRUVF6Z///Keio6O1d+9ejRgxwuqyANvZu3evBg8erIceekirV6/W5MmTmTUF+BNKlSql4cOHa9iwYQoMDFTr1q119OhRbdy4UQMGDLC6PMDnhYaGasCAARo6dKiioqJUoUIFjRo1Sm43n1sDhRUWFqYhQ4boySeflMfj0TXXXKPExET98ssvCg8P1z333GN1iShihD5wHLfbrc8//1xPPPGEGjZsqHr16mnSpEm67rrrrC4NsJV+/fopLS1NV111lfz8/PS3v/1NDz74oNVlAbYyZswY+fv7a+zYsUpISFB0dLQefvhhq8sCbOOVV15RSkqKunfvrrCwMD311FNKTEy0uizAVp5//nmVL19e48aN086dO1WmTBnFxcXp6aeftro0FANm7wIAAAAAAHAgzo0EAAAAAABwIEIfAAAAAAAAByL0AQAAAAAAcCBCHwAAAAAAAAci9AEAAAAAAHAgQh8AAAAAAAAHIvQBAAAAAABwIEIfAAAAAAAAByL0AQAAAAAAcCBCHwAAAAAAAAci9AEAAAAAAHCg/wc2y7wnqXjEzQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = dataprob.plot_corner(f)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c685baac-93d0-43e1-b6d0-aa725a5e4c95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameestimatestdlow_95high_95guessfixedlower_boundupper_boundprior_meanprior_std
name
aa5.1650790.3753524.4086075.9215501.0False-infinfNaNNaN
bb0.0581790.085007-0.1131410.2294981.0False-infinfNaNNaN
cc0.1836730.0226400.1380460.2293011.0False-infinfNaNNaN
dd0.0293600.0012490.0268440.0318771.0False-infinfNaNNaN
ee0.0012290.0002440.0007380.0017191.0False-infinfNaNNaN
\n", + "
" + ], + "text/plain": [ + " name estimate std low_95 high_95 guess fixed lower_bound \\\n", + "name \n", + "a a 5.165079 0.375352 4.408607 5.921550 1.0 False -inf \n", + "b b 0.058179 0.085007 -0.113141 0.229498 1.0 False -inf \n", + "c c 0.183673 0.022640 0.138046 0.229301 1.0 False -inf \n", + "d d 0.029360 0.001249 0.026844 0.031877 1.0 False -inf \n", + "e e 0.001229 0.000244 0.000738 0.001719 1.0 False -inf \n", + "\n", + " upper_bound prior_mean prior_std \n", + "name \n", + "a inf NaN NaN \n", + "b inf NaN NaN \n", + "c inf NaN NaN \n", + "d inf NaN NaN \n", + "e inf NaN NaN " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "f.fit_df\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01c14db9-c671-4ba0-8929-5276681fd341", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index eafbe8f..267a530 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,8 @@ version = {attr = "dataprob.__version__.__version__"} [tool.setuptools.package-data] "*" = [ "src/dataprob/data/*.txt", - "src/dataprob/data/*.csv" + "src/dataprob/data/*.csv", + "tests/dataprob/test_data/*" ] [project] @@ -20,10 +21,12 @@ dynamic = ["version"] dependencies = [ "numpy", "pandas", + "openpyxl", "matplotlib", "scipy", "emcee", - "corner" + "corner", + "tqdm" ] requires-python = ">=3.10" @@ -34,7 +37,7 @@ maintainers = [ {name = "Mike Harms", email = "harms@uoregon.edu"} ] description = "Do likelihood based parameter estimation using maximum likeihood and bayesian methods" -readme = "README.md" +readme = "README.rst" license = {file = "LICENSE"} keywords = ["likelihood", "maximum likelihood", "ML", "Bayesian", "MCMC", "monte carlo", "regression", "estimator"] classifiers = [ diff --git a/reports/flake.txt b/reports/flake.txt index a01c555..d781abe 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1,2106 +1,6116 @@ ./build/lib/dataprob/__init__.py:2:1: E122 continuation line missing indentation or outdented -./build/lib/dataprob/__init__.py:8:1: F401 '.fitters.MLFitter' imported but unused -./build/lib/dataprob/__init__.py:9:1: F401 '.fitters.BootstrapFitter' imported but unused -./build/lib/dataprob/__init__.py:10:1: F401 '.fitters.BayesianFitter' imported but unused -./build/lib/dataprob/__init__.py:11:1: F401 '.model_wrapper.ModelWrapper' imported but unused -./build/lib/dataprob/__init__.py:12:1: F401 '.fit_param.FitParameter' imported but unused -./build/lib/dataprob/check.py:10:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/check.py:10:21: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:32:33: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:38:25: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:42:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:47:42: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:47:51: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:53:27: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:58:22: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:71:1: C901 'check_float' is too complex (17) -./build/lib/dataprob/check.py:109:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:113:25: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:117:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:139:23: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:167:1: C901 'check_int' is too complex (19) -./build/lib/dataprob/check.py:167:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/check.py:203:5: E303 too many blank lines (2) -./build/lib/dataprob/check.py:206:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:210:25: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:214:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:241:23: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:241:33: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:269:1: C901 'check_array' is too complex (12) -./build/lib/dataprob/check.py:269:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/check.py:284:74: W291 trailing whitespace -./build/lib/dataprob/check.py:288:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:294:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:299:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:305:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:308:25: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:312:31: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:315:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:320:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:325:1: W293 blank line contains whitespace -./build/lib/dataprob/check.py:330:1: E303 too many blank lines (3) -./build/lib/dataprob/check.py:330:26: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:365:43: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:366:44: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:368:34: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:372:36: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:376:36: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:380:36: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:381:54: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:382:40: E231 missing whitespace after ',' -./build/lib/dataprob/check.py:390:22: F541 f-string is missing placeholders -./build/lib/dataprob/check.py:396:37: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fit_param.py:22:59: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:31:29: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:36:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:39:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:44:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:53:71: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:106:22: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:106:27: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:106:38: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:106:50: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:106:62: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:108:26: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:114:33: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:115:74: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:134:46: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:149:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:164:18: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:168:5: E303 too many blank lines (2) -./build/lib/dataprob/fit_param.py:168:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:171:5: E301 expected 1 blank line, found 0 -./build/lib/dataprob/fit_param.py:183:19: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:186:78: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:190:82: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:191:76: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:192:44: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:206:68: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:212:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:224:19: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:233:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:248:5: C901 'FitParameter.bounds' is too complex (11) -./build/lib/dataprob/fit_param.py:248:20: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:254:9: E122 continuation line missing indentation or outdented -./build/lib/dataprob/fit_param.py:256:76: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:258:23: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:259:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:260:63: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:261:69: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:262:56: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:267:39: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:270:37: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:273:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:276:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:280:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:293:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:306:32: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:312:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:325:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:327:19: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:333:9: E122 continuation line missing indentation or outdented -./build/lib/dataprob/fit_param.py:335:75: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:337:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:338:76: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:341:56: W291 trailing whitespace -./build/lib/dataprob/fit_param.py:346:37: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:350:35: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:353:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:366:1: W293 blank line contains whitespace -./build/lib/dataprob/fit_param.py:371:5: E303 too many blank lines (2) -./build/lib/dataprob/fit_param.py:371:5: E265 block comment should start with '# ' -./build/lib/dataprob/fit_param.py:374:5: E301 expected 1 blank line, found 0 -./build/lib/dataprob/fit_param.py:386:5: E303 too many blank lines (2) -./build/lib/dataprob/fit_param.py:417:5: E303 too many blank lines (2) -./build/lib/dataprob/fit_param.py:417:29: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:417:36: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:434:65: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:435:65: E231 missing whitespace after ',' -./build/lib/dataprob/fit_param.py:437:52: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/__init__.py:2:1: F401 '.ml.MLFitter' imported but unused -./build/lib/dataprob/fitters/__init__.py:3:1: F401 '.bootstrap.BootstrapFitter' imported but unused -./build/lib/dataprob/fitters/__init__.py:4:1: F401 '.bayesian.BayesianFitter' imported but unused -./build/lib/dataprob/fitters/base.py:18:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/base.py:42:27: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:42:39: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:62:5: C901 'Fitter.fit' is too complex (17) -./build/lib/dataprob/fitters/base.py:90:76: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:92:60: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:124:43: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:131:48: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:132:49: E127 continuation line over-indented for visual indent -./build/lib/dataprob/fitters/base.py:154:55: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:159:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:159:54: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:159:62: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:174:18: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:187:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:188:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:189:5: E303 too many blank lines (2) -./build/lib/dataprob/fitters/base.py:189:35: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:191:71: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:207:34: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:222:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:222:54: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:228:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:235:33: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:254:32: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:270:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:270:54: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:270:62: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:276:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:283:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:295:27: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:302:21: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:317:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:317:54: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:317:62: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:323:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:333:75: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:336:36: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:348:5: C901 'Fitter.model' is too complex (12) -./build/lib/dataprob/fitters/base.py:348:19: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:352:28: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:414:21: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:420:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:428:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:450:32: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:463:20: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:466:31: E127 continuation line over-indented for visual indent -./build/lib/dataprob/fitters/base.py:467:31: E127 continuation line over-indented for visual indent -./build/lib/dataprob/fitters/base.py:467:48: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:468:31: E127 continuation line over-indented for visual indent -./build/lib/dataprob/fitters/base.py:469:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:483:64: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:499:50: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:512:20: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:516:47: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:518:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:537:63: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:547:20: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:560:19: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:563:34: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:567:31: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:568:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:577:128: E501 line too long (129 > 127 characters) -./build/lib/dataprob/fitters/base.py:592:77: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:593:55: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:602:19: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:603:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:608:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:625:77: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:634:21: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:640:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:654:5: E303 too many blank lines (2) -./build/lib/dataprob/fitters/base.py:756:18: W291 trailing whitespace -./build/lib/dataprob/fitters/base.py:769:28: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:770:31: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:771:28: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:772:29: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:773:30: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:774:28: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:775:33: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:776:32: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:777:34: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:778:34: E231 missing whitespace after ':' -./build/lib/dataprob/fitters/base.py:791:40: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:791:49: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:791:59: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:792:46: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:793:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:820:64: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:821:65: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:827:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:828:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:829:60: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:830:59: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:835:5: E303 too many blank lines (2) -./build/lib/dataprob/fitters/base.py:835:25: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:835:57: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:835:63: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:874:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:879:50: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:879:58: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:879:69: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:883:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:883:44: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:885:36: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:885:49: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:886:46: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:886:52: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:890:27: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:907:34: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:908:41: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:910:5: C901 'Fitter.append_samples' is too complex (12) -./build/lib/dataprob/fitters/base.py:910:28: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:910:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:943:60: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:953:49: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/base.py:957:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/base.py:967:53: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:20:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/bayesian.py:20:30: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:20:33: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:22:71: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:23:50: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:37:69: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:47:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:57:70: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:59:42: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:61:70: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:64:50: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:74:52: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:82:27: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:82:39: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:88:43: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:97:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:99:39: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:101:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:104:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/bayesian.py:104:40: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:106:79: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:113:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:117:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:118:76: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:119:32: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:129:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:135:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:136:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:137:20: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:138:36: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:142:20: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:155:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/bayesian.py:157:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:158:19: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:163:75: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:164:71: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:165:25: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:166:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:168:79: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:169:79: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:174:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:178:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:182:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:183:74: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:185:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:187:64: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:188:38: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:192:31: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:210:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:221:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:228:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:230:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:232:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:236:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:243:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:252:49: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:279:77: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:292:75: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:308:51: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:315:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:328:49: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:332:50: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:341:35: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:342:35: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:357:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:360:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:361:59: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:362:65: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:363:59: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:365:23: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:367:73: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:371:40: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:371:80: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:381:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:383:37: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:396:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:396:55: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:396:66: W291 trailing whitespace -./build/lib/dataprob/fitters/bayesian.py:402:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:410:5: E303 too many blank lines (2) -./build/lib/dataprob/fitters/bayesian.py:410:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:425:21: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:440:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:440:54: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:440:62: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:440:72: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:440:81: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:441:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:446:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/bayesian.py:453:18: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:468:13: E731 do not assign a lambda expression, use a def -./build/lib/dataprob/fitters/bayesian.py:469:47: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:469:63: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:489:55: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:492:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:493:63: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:493:65: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:493:80: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:500:58: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:502:57: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:512:47: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:513:43: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:517:55: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:518:55: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:519:31: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:521:41: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bayesian.py:541:60: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/bootstrap.py:17:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:17:40: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:17:57: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:17:71: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:36:30: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:45:18: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:52:60: W291 trailing whitespace -./build/lib/dataprob/fitters/bootstrap.py:57:48: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:57:67: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:65:52: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:69:63: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:78:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:87:58: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:99:47: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:102:43: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:105:31: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:107:50: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:108:50: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/bootstrap.py:108:53: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/fitters/ml.py:23:22: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:33:23: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:38:18: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:50:9: E731 do not assign a lambda expression, use a def -./build/lib/dataprob/fitters/ml.py:64:1: W293 blank line contains whitespace -./build/lib/dataprob/fitters/ml.py:73:45: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:75:52: E261 at least two spaces before inline comment -./build/lib/dataprob/fitters/ml.py:75:53: E262 inline comment should start with '# ' -./build/lib/dataprob/fitters/ml.py:82:35: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:94:61: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:95:50: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:95:71: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:98:5: E303 too many blank lines (2) -./build/lib/dataprob/fitters/ml.py:125:49: E231 missing whitespace after ',' -./build/lib/dataprob/fitters/ml.py:138:53: E127 continuation line over-indented for visual indent -./build/lib/dataprob/model_wrapper.py:2:62: W291 trailing whitespace -./build/lib/dataprob/model_wrapper.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/model_wrapper.py:29:22: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:29:35: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:48:5: C901 'ModelWrapper._mw_load_model' is too complex (14) -./build/lib/dataprob/model_wrapper.py:48:28: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:57:38: W291 trailing whitespace -./build/lib/dataprob/model_wrapper.py:79:30: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:118:65: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:126:19: F541 f-string is missing placeholders -./build/lib/dataprob/model_wrapper.py:146:30: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:146:40: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:146:48: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:155:25: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:171:31: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:190:28: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:215:29: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:221:58: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:265:21: E231 missing whitespace after ',' -./build/lib/dataprob/model_wrapper.py:283:21: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:4:1: E303 too many blank lines (3) -./build/lib/dataprob/prior.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/prior.py:9:30: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:9:33: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:11:71: W291 trailing whitespace -./build/lib/dataprob/prior.py:12:50: W291 trailing whitespace -./build/lib/dataprob/prior.py:27:21: W291 trailing whitespace -./build/lib/dataprob/prior.py:29:81: W291 trailing whitespace -./build/lib/dataprob/prior.py:32:50: W291 trailing whitespace -./build/lib/dataprob/prior.py:42:52: W291 trailing whitespace -./build/lib/dataprob/prior.py:49:64: W291 trailing whitespace -./build/lib/dataprob/prior.py:53:27: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:53:39: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:59:43: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:68:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:70:39: W291 trailing whitespace -./build/lib/dataprob/prior.py:72:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:75:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/prior.py:75:27: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:82:9: W291 trailing whitespace -./build/lib/dataprob/prior.py:99:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:100:77: W291 trailing whitespace -./build/lib/dataprob/prior.py:101:20: W291 trailing whitespace -./build/lib/dataprob/prior.py:102:36: W291 trailing whitespace -./build/lib/dataprob/prior.py:106:20: W291 trailing whitespace -./build/lib/dataprob/prior.py:118:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:121:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:129:43: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:132:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:133:34: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:133:46: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:133:56: W291 trailing whitespace -./build/lib/dataprob/prior.py:134:49: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:134:52: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:136:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:137:22: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:141:1: E302 expected 2 blank lines, found 1 -./build/lib/dataprob/prior.py:143:22: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:145:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:146:9: E303 too many blank lines (2) -./build/lib/dataprob/prior.py:148:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:154:22: E231 missing whitespace after ',' -./build/lib/dataprob/prior.py:157:1: W293 blank line contains whitespace -./build/lib/dataprob/prior.py:158:1: W293 blank line contains whitespace -./docs/conf.py:55:31: W292 no newline at end of file +./build/lib/dataprob/__init__.py:6:1: F401 '.fitters.setup.setup' imported but unused +./build/lib/dataprob/__init__.py:7:1: F401 '.plot.plot_corner.plot_corner' imported but unused +./build/lib/dataprob/__init__.py:8:1: F401 '.plot.plot_summary.plot_summary' imported but unused +./build/lib/dataprob/__init__.py:10:1: F401 '.__version__.__version__' imported but unused +./build/lib/dataprob/__init__.py:10:37: W292 no newline at end of file +./build/lib/dataprob/__version__.py:2:16: W291 trailing whitespace +./build/lib/dataprob/fitters/__init__.py:3:4: W292 no newline at end of file +./build/lib/dataprob/fitters/base.py:6:1: F401 'dataprob.util.check.check_float' imported but unused +./build/lib/dataprob/fitters/base.py:20:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/base.py:29:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/base.py:47:26: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:49:82: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:50:24: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:53:67: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:55:80: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:56:83: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:58:33: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:62:26: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:63:42: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:65:14: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:70:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:79:27: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:79:39: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:98:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:111:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:116:78: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:117:21: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:120:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:131:25: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:135:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:136:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/base.py:147:77: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:148:76: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:149:41: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:153:29: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:162:48: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:163:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:163:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:163:62: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:164:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:176:18: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:178:63: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:180:76: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:181:74: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:188:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/base.py:188:35: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:190:71: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:206:34: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:221:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:221:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:227:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:230:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:249:32: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:265:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:265:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:265:62: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:271:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:274:22: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:286:27: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:293:21: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:308:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:308:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:308:62: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:314:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:317:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:318:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/base.py:321:62: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:326:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:327:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/base.py:330:35: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:339:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/base.py:342:59: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:353:48: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:357:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:359:22: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:361:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:366:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:376:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:378:60: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:386:21: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:392:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:396:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:398:26: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:407:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:414:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:436:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:441:34: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/base.py:458:69: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:459:22: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:471:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:475:78: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:476:79: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:477:28: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:485:27: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:502:34: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:503:41: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:505:5: C901 'Fitter.append_samples' is too complex (12) +./build/lib/dataprob/fitters/base.py:505:28: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:505:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:538:60: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:548:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:552:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:562:53: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:566:27: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:572:70: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:574:37: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:579:39: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:585:21: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:594:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:607:56: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:612:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:616:29: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:616:31: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/base.py:619:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:625:79: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:634:77: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:657:74: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:658:20: W291 trailing whitespace +./build/lib/dataprob/fitters/base.py:662:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/base.py:672:24: W292 no newline at end of file +./build/lib/dataprob/fitters/bayesian/__init__.py:3:4: W292 no newline at end of file +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:9:29: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:9:32: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:11:71: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:12:50: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:26:69: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:36:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:46:70: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:48:42: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:50:70: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:53:50: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:63:52: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:71:27: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:71:39: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:77:43: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:86:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:88:39: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:90:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:93:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:93:39: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:95:79: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:102:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:106:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:107:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:108:32: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:118:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:124:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:125:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:126:20: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:127:36: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:131:20: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:144:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:146:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:147:19: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:152:75: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:153:71: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:154:25: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:155:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:157:79: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:158:79: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:163:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:167:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:171:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:172:74: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:174:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:176:64: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:177:38: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:181:31: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:199:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:210:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:217:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:219:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:221:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:225:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:232:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:238:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:245:74: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:246:74: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:247:51: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:249:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:250:48: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:254:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:259:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:262:65: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:263:47: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:269:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:278:28: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:282:30: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:289:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:296:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:297:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:297:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:301:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:306:35: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:307:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:314:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:317:23: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:325:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:325:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:333:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:333:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:348:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:352:72: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:353:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:359:78: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:362:39: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:365:67: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:371:48: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:378:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:380:26: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:384:36: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:385:35: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:386:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:387:37: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:389:51: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:407:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/_prior_processing.py:410:19: W292 no newline at end of file +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:25:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:27:49: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:36:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:40:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:51:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:53:39: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:56:38: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:57:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:58:48: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:61:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:62:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:63:43: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:65:69: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:69:60: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:72:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:83:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:88:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:91:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:92:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:93:9: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:95:61: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:96:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:97:65: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:98:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:101:72: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:103:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:105:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:108:23: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:110:73: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:116:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:127:22: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:129:37: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:143:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:144:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:152:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:156:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:156:22: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:171:21: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:186:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:186:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:186:62: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:188:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:193:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:206:60: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:212:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:213:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:214:41: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:218:29: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:229:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:231:25: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:232:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:235:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:239:57: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:255:51: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:262:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:267:36: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:270:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:270:18: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:286:22: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:292:68: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:295:55: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:299:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:310:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:312:61: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:313:58: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:313:60: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:314:41: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:317:55: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:324:58: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:325:56: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:337:41: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:338:35: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:341:55: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:342:55: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:345:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:346:23: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:353:53: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:357:75: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:358:58: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:359:28: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:359:36: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:359:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:359:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:363:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:366:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:367:31: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:367:68: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:368:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:369:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:370:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:372:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:373:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:381:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:383:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:384:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:386:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:387:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:389:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:390:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:394:9: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:400:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:401:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:405:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:408:72: W291 trailing whitespace +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:421:24: F541 f-string is missing placeholders +./build/lib/dataprob/fitters/bayesian/bayesian_sampler.py:429:30: W292 no newline at end of file +./build/lib/dataprob/fitters/bootstrap.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/bootstrap.py:25:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:26:56: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:32:77: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:33:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:34:41: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:38:29: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:41:33: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:45:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:52:44: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:54:5: C901 'BootstrapFitter._fit' is too complex (12) +./build/lib/dataprob/fitters/bootstrap.py:54:18: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:61:60: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:67:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:68:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:69:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:72:48: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:72:62: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:79:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:83:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:85:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:95:26: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:100:26: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:102:26: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:108:19: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:114:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:115:43: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:117:52: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:119:44: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/bootstrap.py:120:42: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/bootstrap.py:121:41: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/bootstrap.py:126:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:133:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:149:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:151:54: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:152:36: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:154:19: F541 f-string is missing placeholders +./build/lib/dataprob/fitters/bootstrap.py:159:35: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:160:29: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:163:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:164:49: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:167:76: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:168:23: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:175:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:179:75: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:180:58: W291 trailing whitespace +./build/lib/dataprob/fitters/bootstrap.py:181:28: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:181:36: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:181:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:181:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:185:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:188:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:189:31: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:189:68: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:190:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:191:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:192:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:194:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:195:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/bootstrap.py:203:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/bootstrap.py:207:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:209:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/bootstrap.py:219:24: F541 f-string is missing placeholders +./build/lib/dataprob/fitters/ml.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/ml.py:20:14: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:22:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:35:77: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:36:76: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:37:41: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:41:29: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:44:33: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:48:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:55:44: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:57:18: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:69:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:70:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:71:59: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:80:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:82:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:84:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:91:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:100:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:102:44: E261 at least two spaces before inline comment +./build/lib/dataprob/fitters/ml.py:102:45: E262 inline comment should start with '# ' +./build/lib/dataprob/fitters/ml.py:120:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:121:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:122:51: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:124:75: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:125:58: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:126:28: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:126:36: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:126:50: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:126:64: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:130:47: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:133:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:134:31: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:134:68: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:135:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:136:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:137:33: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:140:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/ml.py:157:24: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:160:46: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:163:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:166:45: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:176:63: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:177:52: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:180:49: E127 continuation line over-indented for visual indent +./build/lib/dataprob/fitters/ml.py:181:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:183:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/ml.py:188:55: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:188:70: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:189:57: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:193:55: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:193:70: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:194:57: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:196:77: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:198:46: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:200:50: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:201:48: E231 missing whitespace after ',' +./build/lib/dataprob/fitters/ml.py:206:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/ml.py:208:72: W291 trailing whitespace +./build/lib/dataprob/fitters/ml.py:216:24: F541 f-string is missing placeholders +./build/lib/dataprob/fitters/setup.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/fitters/setup.py:15:32: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:22:15: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:25:77: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:26:54: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:28:78: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:32:63: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:34:76: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:35:79: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:37:29: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:46:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:61:32: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:78:83: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:81:67: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:82:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:93:18: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:94:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:95:73: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:99:83: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:101:26: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:103:74: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:107:74: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:108:36: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:109:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:115:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:116:86: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:117:74: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:119:24: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:123:77: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:124:75: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:125:20: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:126:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:127:79: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:131:76: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:133:77: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:136:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:143:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:145:13: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:147:80: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:148:62: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:149:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:150:78: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:171:77: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:175:75: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:176:70: W291 trailing whitespace +./build/lib/dataprob/fitters/setup.py:179:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:180:5: E303 too many blank lines (2) +./build/lib/dataprob/fitters/setup.py:180:23: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/setup.py:181:30: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/setup.py:182:25: E231 missing whitespace after ':' +./build/lib/dataprob/fitters/setup.py:183:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:189:1: W293 blank line contains whitespace +./build/lib/dataprob/fitters/setup.py:193:65: W292 no newline at end of file +./build/lib/dataprob/model_wrapper/__init__.py:2:63: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/__init__.py:3:4: W292 no newline at end of file +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:8:25: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:17:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:34:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:50:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:53:43: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:57:1: C901 '_build_columns' is too complex (13) +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:57:28: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:82:35: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:83:34: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:93:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:96:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:109:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:117:33: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:118:33: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:124:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:125:45: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:126:60: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:127:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:130:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:138:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:142:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:149:54: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:152:42: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:152:50: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:153:57: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:162:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:164:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:165:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:171:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:176:25: E127 continuation line over-indented for visual indent +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:178:25: E127 continuation line over-indented for visual indent +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:182:38: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:182:46: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:182:59: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:188:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:193:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:194:52: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:198:44: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:198:52: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:204:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:210:49: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:212:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:213:44: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:213:52: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:213:65: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:226:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:230:15: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:236:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:254:38: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:265:77: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:267:68: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:268:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:277:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:283:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:285:37: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:292:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:295:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:303:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:306:1: C901 'param_into_existing' is too complex (12) +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:309:63: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:316:52: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:318:60: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:319:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:326:62: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:329:50: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:331:78: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:332:59: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:333:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:334:34: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:336:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:338:36: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:342:40: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:345:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:352:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:357:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:358:47: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:370:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:372:27: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:373:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:383:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:391:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:393:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_dataframe_processing.py:394:20: W292 no newline at end of file +./build/lib/dataprob/model_wrapper/_function_processing.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/_function_processing.py:65:27: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_function_processing.py:71:33: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:76:40: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_function_processing.py:79:26: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/_function_processing.py:85:1: C901 'reconcile_fittable' is too complex (17) +./build/lib/dataprob/model_wrapper/_function_processing.py:92:65: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:99:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:121:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:138:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:150:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:154:20: F541 f-string is missing placeholders +./build/lib/dataprob/model_wrapper/_function_processing.py:157:45: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:165:78: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:166:26: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:175:24: E127 continuation line over-indented for visual indent +./build/lib/dataprob/model_wrapper/_function_processing.py:177:69: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:181:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:182:72: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:183:16: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:189:79: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:191:29: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:213:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:214:66: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:233:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:246:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:247:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/_function_processing.py:251:1: W391 blank line at end of file +./build/lib/dataprob/model_wrapper/model_wrapper.py:2:65: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:17:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/model_wrapper.py:32:37: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/model_wrapper.py:49:67: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:55:36: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:61:42: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:61:89: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:64:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:67:51: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:78:46: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/model_wrapper.py:80:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:84:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:86:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/model_wrapper.py:86:25: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:86:38: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:86:53: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:96:38: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:99:67: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:144:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:146:40: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/model_wrapper.py:147:41: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/model_wrapper.py:154:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:155:77: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:156:35: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:159:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:169:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:173:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:174:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:184:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:195:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:199:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:203:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:207:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/model_wrapper.py:210:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:211:28: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:213:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:214:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:219:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:221:65: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:222:83: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:225:18: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:228:54: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:231:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:234:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:235:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/model_wrapper.py:235:27: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:237:39: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:253:68: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:258:79: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:260:57: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:264:40: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:270:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:276:19: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:278:81: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:279:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:280:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:281:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:282:17: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:288:63: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:296:54: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:303:33: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:305:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:306:36: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:309:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:327:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/model_wrapper.py:327:24: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:330:70: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:336:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:346:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:350:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/model_wrapper.py:353:80: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:354:73: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:356:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:359:55: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:362:72: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:386:77: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:390:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:391:70: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:393:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:395:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:397:22: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/model_wrapper.py:402:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:406:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:407:19: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:411:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:419:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:424:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/model_wrapper.py:434:20: F541 f-string is missing placeholders +./build/lib/dataprob/model_wrapper/model_wrapper.py:453:20: F541 f-string is missing placeholders +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:3:28: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:17:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:19:71: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:23:5: C901 'VectorModelWrapper._load_model' is too complex (15) +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:29:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:39:67: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:51:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:58:19: F541 f-string is missing placeholders +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:69:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:77:37: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:84:47: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:87:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:91:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:95:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:98:40: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:99:41: E231 missing whitespace after ':' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:118:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:119:67: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:124:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:126:55: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:128:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:129:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:138:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:139:46: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:144:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:145:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:146:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:155:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:156:28: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:158:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:159:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:164:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:166:78: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:167:83: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:168:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:170:66: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:171:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:176:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:176:19: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:178:81: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:179:75: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:180:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:181:74: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:182:17: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:188:63: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:190:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:195:59: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:201:33: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:222:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:223:24: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/vector_model_wrapper.py:225:60: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:3:26: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/model_wrapper/wrap_function.py:19:57: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:26:15: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:28:78: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:32:63: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:34:76: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:35:79: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:37:29: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:42:69: W291 trailing whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:44:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:47:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:53:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:59:33: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/wrap_function.py:62:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:63:35: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/wrap_function.py:66:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:67:35: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/wrap_function.py:67:78: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/wrap_function.py:74:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:78:32: E231 missing whitespace after ',' +./build/lib/dataprob/model_wrapper/wrap_function.py:89:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:90:5: E303 too many blank lines (2) +./build/lib/dataprob/model_wrapper/wrap_function.py:94:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:100:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:101:1: W293 blank line contains whitespace +./build/lib/dataprob/model_wrapper/wrap_function.py:101:9: W292 no newline at end of file +./build/lib/dataprob/plot/_plot_utils.py:3:47: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/_plot_utils.py:38:36: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:40:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:51:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:55:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:59:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:67:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/_plot_utils.py:67:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:70:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:79:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:94:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:97:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:98:39: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:101:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:104:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:108:18: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:111:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:128:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:129:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:130:42: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:131:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:134:38: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:141:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:142:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/_plot_utils.py:142:27: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:145:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:170:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:176:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/_plot_utils.py:181:34: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:182:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:191:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:195:70: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:197:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:198:42: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:199:42: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:200:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:204:18: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:204:22: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:206:75: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:207:76: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:208:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/_plot_utils.py:214:57: W291 trailing whitespace +./build/lib/dataprob/plot/_plot_utils.py:225:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:226:17: E127 continuation line over-indented for visual indent +./build/lib/dataprob/plot/_plot_utils.py:226:32: E231 missing whitespace after ',' +./build/lib/dataprob/plot/_plot_utils.py:230:42: W292 no newline at end of file +./build/lib/dataprob/plot/appearance.py:7:13: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:8:20: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:9:16: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:10:13: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:11:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:13:12: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:14:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:15:26: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:16:26: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:17:21: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:18:13: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:19:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:21:12: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:22:13: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:23:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:24:21: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:25:18: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:26:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:28:18: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:29:20: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:30:16: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:31:16: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:32:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:34:19: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:35:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:36:16: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:37:21: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:38:26: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:39:26: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:40:20: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:41:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:43:15: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:44:13: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:45:20: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:46:20: E231 missing whitespace after ':' +./build/lib/dataprob/plot/appearance.py:47:17: E231 missing whitespace after ':' +./build/lib/dataprob/plot/plot_corner.py:2:76: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:3:31: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:11:1: C901 'plot_corner' is too complex (11) +./build/lib/dataprob/plot/plot_corner.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/plot_corner.py:11:18: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:11:37: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:13:72: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:14:72: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:15:27: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:23:50: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:24:15: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:25:73: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:27:33: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:39:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_corner.py:62:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_corner.py:71:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_corner.py:73:32: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:74:36: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:78:57: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:85:57: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:86:57: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:96:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:96:48: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:99:74: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:100:23: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:108:18: W291 trailing whitespace +./build/lib/dataprob/plot/plot_corner.py:109:32: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_corner.py:111:15: W292 no newline at end of file +./build/lib/dataprob/plot/plot_fit.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/plot_fit.py:38:66: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:41:33: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:44:37: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:47:34: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:49:78: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:50:39: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:67:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_fit.py:69:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:70:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:71:42: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:72:52: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:74:47: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:75:49: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:79:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:79:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:81:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:84:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_fit.py:86:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:86:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:86:39: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:87:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:87:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:87:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:88:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:88:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:88:41: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:89:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_fit.py:99:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_fit.py:105:32: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:107:26: W291 trailing whitespace +./build/lib/dataprob/plot/plot_fit.py:108:27: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:108:29: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:108:41: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_fit.py:121:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_fit.py:124:19: W292 no newline at end of file +./build/lib/dataprob/plot/plot_residuals.py:15:1: C901 'plot_residuals' is too complex (14) +./build/lib/dataprob/plot/plot_residuals.py:15:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/plot_residuals.py:28:28: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:42:66: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:45:33: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:48:37: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:51:34: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:53:79: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:54:40: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:56:77: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:73:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:75:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:76:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:77:42: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:78:54: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:79:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:80:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:84:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:92:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:99:27: E701 multiple statements on one line (colon) +./build/lib/dataprob/plot/plot_residuals.py:99:37: E261 at least two spaces before inline comment +./build/lib/dataprob/plot/plot_residuals.py:99:56: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:102:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:103:5: E303 too many blank lines (2) +./build/lib/dataprob/plot/plot_residuals.py:107:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:107:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:109:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:118:66: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:125:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:126:27: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:127:20: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:128:27: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:129:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:134:5: E303 too many blank lines (3) +./build/lib/dataprob/plot/plot_residuals.py:138:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:139:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:140:25: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:141:20: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:143:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:145:5: E303 too many blank lines (2) +./build/lib/dataprob/plot/plot_residuals.py:145:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:145:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:150:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:150:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:151:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:151:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:151:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:151:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:154:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:157:27: E701 multiple statements on one line (colon) +./build/lib/dataprob/plot/plot_residuals.py:157:37: E261 at least two spaces before inline comment +./build/lib/dataprob/plot/plot_residuals.py:157:56: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:164:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:166:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:166:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:168:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:168:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals.py:168:55: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals.py:170:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:171:5: E303 too many blank lines (2) +./build/lib/dataprob/plot/plot_residuals.py:173:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:177:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals.py:177:5: W292 no newline at end of file +./build/lib/dataprob/plot/plot_residuals_hist.py:2:43: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/plot_residuals_hist.py:23:35: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:33:31: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:35:52: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:38:34: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:41:61: W291 trailing whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:54:5: E303 too many blank lines (2) +./build/lib/dataprob/plot/plot_residuals_hist.py:59:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:62:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:67:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:73:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:73:44: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:75:31: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:87:46: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:93:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:94:26: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:94:35: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:94:46: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:95:19: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:95:29: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:95:39: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:96:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:97:22: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:97:28: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:98:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:100:65: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:104:15: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:104:18: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:104:28: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:104:35: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:15: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:18: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:28: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:35: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:40: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:105:53: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_residuals_hist.py:110:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_residuals_hist.py:113:19: W292 no newline at end of file +./build/lib/dataprob/plot/plot_summary.py:8:1: F401 'dataprob.plot._plot_utils.get_vectors' imported but unused +./build/lib/dataprob/plot/plot_summary.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/plot/plot_summary.py:17:33: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:26:66: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:27:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:40:66: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:43:33: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:46:37: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:49:34: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:51:78: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:52:39: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:54:79: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:55:40: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:58:61: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:68:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:69:5: E303 too many blank lines (2) +./build/lib/dataprob/plot/plot_summary.py:69:33: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_summary.py:70:34: E231 missing whitespace after ',' +./build/lib/dataprob/plot/plot_summary.py:71:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:77:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:87:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:98:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:108:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:114:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:119:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:124:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:129:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:136:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:141:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:143:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:150:23: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:152:15: W291 trailing whitespace +./build/lib/dataprob/plot/plot_summary.py:153:1: W293 blank line contains whitespace +./build/lib/dataprob/plot/plot_summary.py:153:5: W292 no newline at end of file +./build/lib/dataprob/util/__init__.py:4:4: W292 no newline at end of file +./build/lib/dataprob/util/check.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/util/check.py:9:21: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:31:33: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:37:25: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:41:34: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:46:42: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:46:51: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:52:27: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:57:22: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:70:1: C901 'check_float' is too complex (18) +./build/lib/dataprob/util/check.py:108:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:109:5: E303 too many blank lines (2) +./build/lib/dataprob/util/check.py:112:34: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:116:25: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:118:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:120:34: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:122:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:146:23: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:174:1: C901 'check_int' is too complex (19) +./build/lib/dataprob/util/check.py:174:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/util/check.py:210:5: E303 too many blank lines (2) +./build/lib/dataprob/util/check.py:213:34: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:217:25: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:221:34: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:248:23: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:248:33: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:276:1: C901 'check_array' is too complex (14) +./build/lib/dataprob/util/check.py:276:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/util/check.py:292:74: W291 trailing whitespace +./build/lib/dataprob/util/check.py:298:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:304:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:309:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:315:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:318:25: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:321:76: W291 trailing whitespace +./build/lib/dataprob/util/check.py:322:63: W291 trailing whitespace +./build/lib/dataprob/util/check.py:323:27: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:325:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:328:31: E231 missing whitespace after ',' +./build/lib/dataprob/util/check.py:332:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:338:1: W293 blank line contains whitespace +./build/lib/dataprob/util/check.py:343:1: W293 blank line contains whitespace +./build/lib/dataprob/util/read_spreadsheet.py:2:59: W291 trailing whitespace +./build/lib/dataprob/util/read_spreadsheet.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/dataprob/util/read_spreadsheet.py:9:73: W291 trailing whitespace +./build/lib/dataprob/util/read_spreadsheet.py:10:72: W291 trailing whitespace +./build/lib/dataprob/util/read_spreadsheet.py:11:1: W293 blank line contains whitespace +./build/lib/dataprob/util/read_spreadsheet.py:16:1: W293 blank line contains whitespace +./build/lib/dataprob/util/read_spreadsheet.py:24:36: E231 missing whitespace after ',' +./build/lib/dataprob/util/read_spreadsheet.py:30:26: E231 missing whitespace after ',' +./build/lib/dataprob/util/read_spreadsheet.py:33:38: E231 missing whitespace after ',' +./build/lib/dataprob/util/read_spreadsheet.py:35:38: E231 missing whitespace after ',' +./build/lib/dataprob/util/read_spreadsheet.py:44:38: E231 missing whitespace after ',' +./build/lib/dataprob/util/read_spreadsheet.py:52:1: W293 blank line contains whitespace +./docs/source/conf.py:24:1: E303 too many blank lines (3) ./src/dataprob/__init__.py:2:1: E122 continuation line missing indentation or outdented -./src/dataprob/__init__.py:8:1: F401 '.fitters.MLFitter' imported but unused -./src/dataprob/__init__.py:9:1: F401 '.fitters.BootstrapFitter' imported but unused -./src/dataprob/__init__.py:10:1: F401 '.fitters.BayesianFitter' imported but unused -./src/dataprob/__init__.py:11:1: F401 '.model_wrapper.ModelWrapper' imported but unused -./src/dataprob/__init__.py:12:1: F401 '.fit_param.FitParameter' imported but unused -./src/dataprob/check.py:10:1: E302 expected 2 blank lines, found 1 -./src/dataprob/check.py:10:21: E231 missing whitespace after ',' -./src/dataprob/check.py:32:33: E231 missing whitespace after ',' -./src/dataprob/check.py:38:25: E231 missing whitespace after ',' -./src/dataprob/check.py:42:34: E231 missing whitespace after ',' -./src/dataprob/check.py:47:42: E231 missing whitespace after ',' -./src/dataprob/check.py:47:51: E231 missing whitespace after ',' -./src/dataprob/check.py:53:27: E231 missing whitespace after ',' -./src/dataprob/check.py:58:22: E231 missing whitespace after ',' -./src/dataprob/check.py:71:1: C901 'check_float' is too complex (17) -./src/dataprob/check.py:109:34: E231 missing whitespace after ',' -./src/dataprob/check.py:113:25: E231 missing whitespace after ',' -./src/dataprob/check.py:117:34: E231 missing whitespace after ',' -./src/dataprob/check.py:139:23: E231 missing whitespace after ',' -./src/dataprob/check.py:167:1: C901 'check_int' is too complex (19) -./src/dataprob/check.py:167:1: E302 expected 2 blank lines, found 1 -./src/dataprob/check.py:203:5: E303 too many blank lines (2) -./src/dataprob/check.py:206:34: E231 missing whitespace after ',' -./src/dataprob/check.py:210:25: E231 missing whitespace after ',' -./src/dataprob/check.py:214:34: E231 missing whitespace after ',' -./src/dataprob/check.py:241:23: E231 missing whitespace after ',' -./src/dataprob/check.py:241:33: E231 missing whitespace after ',' -./src/dataprob/check.py:269:1: C901 'check_array' is too complex (12) -./src/dataprob/check.py:269:1: E302 expected 2 blank lines, found 1 -./src/dataprob/check.py:284:74: W291 trailing whitespace -./src/dataprob/check.py:288:1: W293 blank line contains whitespace -./src/dataprob/check.py:294:1: W293 blank line contains whitespace -./src/dataprob/check.py:299:1: W293 blank line contains whitespace -./src/dataprob/check.py:305:1: W293 blank line contains whitespace -./src/dataprob/check.py:308:25: E231 missing whitespace after ',' -./src/dataprob/check.py:312:31: E231 missing whitespace after ',' -./src/dataprob/check.py:315:1: W293 blank line contains whitespace -./src/dataprob/check.py:320:1: W293 blank line contains whitespace -./src/dataprob/check.py:325:1: W293 blank line contains whitespace -./src/dataprob/check.py:330:1: E303 too many blank lines (3) -./src/dataprob/check.py:330:26: E231 missing whitespace after ',' -./src/dataprob/check.py:365:43: E231 missing whitespace after ',' -./src/dataprob/check.py:366:44: E231 missing whitespace after ',' -./src/dataprob/check.py:368:34: E231 missing whitespace after ',' -./src/dataprob/check.py:372:36: E231 missing whitespace after ',' -./src/dataprob/check.py:376:36: E231 missing whitespace after ',' -./src/dataprob/check.py:380:36: E231 missing whitespace after ',' -./src/dataprob/check.py:381:54: E231 missing whitespace after ',' -./src/dataprob/check.py:382:40: E231 missing whitespace after ',' -./src/dataprob/check.py:390:22: F541 f-string is missing placeholders -./src/dataprob/check.py:396:37: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:14:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fit_param.py:22:59: W291 trailing whitespace -./src/dataprob/fit_param.py:31:29: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:36:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:39:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:44:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:53:71: W291 trailing whitespace -./src/dataprob/fit_param.py:106:22: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:106:27: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:106:38: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:106:50: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:106:62: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:108:26: W291 trailing whitespace -./src/dataprob/fit_param.py:114:33: W291 trailing whitespace -./src/dataprob/fit_param.py:115:74: W291 trailing whitespace -./src/dataprob/fit_param.py:134:46: W291 trailing whitespace -./src/dataprob/fit_param.py:149:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:164:18: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:168:5: E303 too many blank lines (2) -./src/dataprob/fit_param.py:168:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:171:5: E301 expected 1 blank line, found 0 -./src/dataprob/fit_param.py:183:19: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:186:78: W291 trailing whitespace -./src/dataprob/fit_param.py:190:82: W291 trailing whitespace -./src/dataprob/fit_param.py:191:76: W291 trailing whitespace -./src/dataprob/fit_param.py:192:44: W291 trailing whitespace -./src/dataprob/fit_param.py:206:68: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:212:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:224:19: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:233:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:248:5: C901 'FitParameter.bounds' is too complex (11) -./src/dataprob/fit_param.py:248:20: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:254:9: E122 continuation line missing indentation or outdented -./src/dataprob/fit_param.py:256:76: W291 trailing whitespace -./src/dataprob/fit_param.py:258:23: W291 trailing whitespace -./src/dataprob/fit_param.py:259:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:260:63: W291 trailing whitespace -./src/dataprob/fit_param.py:261:69: W291 trailing whitespace -./src/dataprob/fit_param.py:262:56: W291 trailing whitespace -./src/dataprob/fit_param.py:267:39: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:270:37: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:273:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:276:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:280:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:293:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:306:32: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:312:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:325:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:327:19: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:333:9: E122 continuation line missing indentation or outdented -./src/dataprob/fit_param.py:335:75: W291 trailing whitespace -./src/dataprob/fit_param.py:337:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:338:76: W291 trailing whitespace -./src/dataprob/fit_param.py:341:56: W291 trailing whitespace -./src/dataprob/fit_param.py:346:37: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:350:35: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:353:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:366:1: W293 blank line contains whitespace -./src/dataprob/fit_param.py:371:5: E303 too many blank lines (2) -./src/dataprob/fit_param.py:371:5: E265 block comment should start with '# ' -./src/dataprob/fit_param.py:374:5: E301 expected 1 blank line, found 0 -./src/dataprob/fit_param.py:386:5: E303 too many blank lines (2) -./src/dataprob/fit_param.py:417:5: E303 too many blank lines (2) -./src/dataprob/fit_param.py:417:29: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:417:36: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:434:65: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:435:65: E231 missing whitespace after ',' -./src/dataprob/fit_param.py:437:52: E231 missing whitespace after ',' -./src/dataprob/fitters/__init__.py:2:1: F401 '.ml.MLFitter' imported but unused -./src/dataprob/fitters/__init__.py:3:1: F401 '.bootstrap.BootstrapFitter' imported but unused -./src/dataprob/fitters/__init__.py:4:1: F401 '.bayesian.BayesianFitter' imported but unused -./src/dataprob/fitters/base.py:18:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/base.py:42:27: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:42:39: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:62:5: C901 'Fitter.fit' is too complex (17) -./src/dataprob/fitters/base.py:90:76: W291 trailing whitespace -./src/dataprob/fitters/base.py:92:60: W291 trailing whitespace -./src/dataprob/fitters/base.py:124:43: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:131:48: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:132:49: E127 continuation line over-indented for visual indent -./src/dataprob/fitters/base.py:154:55: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:159:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:159:54: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:159:62: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:174:18: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:187:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:188:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:189:5: E303 too many blank lines (2) -./src/dataprob/fitters/base.py:189:35: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:191:71: W291 trailing whitespace -./src/dataprob/fitters/base.py:207:34: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:222:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:222:54: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:228:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:235:33: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:254:32: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:270:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:270:54: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:270:62: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:276:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:283:22: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:295:27: W291 trailing whitespace -./src/dataprob/fitters/base.py:302:21: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:317:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:317:54: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:317:62: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:323:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:333:75: W291 trailing whitespace -./src/dataprob/fitters/base.py:336:36: W291 trailing whitespace -./src/dataprob/fitters/base.py:348:5: C901 'Fitter.model' is too complex (12) -./src/dataprob/fitters/base.py:348:19: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:352:28: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:414:21: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:420:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:428:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:450:32: W291 trailing whitespace -./src/dataprob/fitters/base.py:463:20: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:466:31: E127 continuation line over-indented for visual indent -./src/dataprob/fitters/base.py:467:31: E127 continuation line over-indented for visual indent -./src/dataprob/fitters/base.py:467:48: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:468:31: E127 continuation line over-indented for visual indent -./src/dataprob/fitters/base.py:469:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:483:64: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:499:50: W291 trailing whitespace -./src/dataprob/fitters/base.py:512:20: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:516:47: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:518:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:537:63: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:547:20: W291 trailing whitespace -./src/dataprob/fitters/base.py:560:19: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:563:34: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:567:31: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:568:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:577:128: E501 line too long (129 > 127 characters) -./src/dataprob/fitters/base.py:592:77: W291 trailing whitespace -./src/dataprob/fitters/base.py:593:55: W291 trailing whitespace -./src/dataprob/fitters/base.py:602:19: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:603:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:608:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:625:77: W291 trailing whitespace -./src/dataprob/fitters/base.py:634:21: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:640:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:654:5: E303 too many blank lines (2) -./src/dataprob/fitters/base.py:756:18: W291 trailing whitespace -./src/dataprob/fitters/base.py:769:28: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:770:31: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:771:28: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:772:29: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:773:30: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:774:28: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:775:33: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:776:32: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:777:34: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:778:34: E231 missing whitespace after ':' -./src/dataprob/fitters/base.py:791:40: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:791:49: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:791:59: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:792:46: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:793:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:820:64: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:821:65: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:827:61: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:828:61: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:829:60: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:830:59: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:835:5: E303 too many blank lines (2) -./src/dataprob/fitters/base.py:835:25: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:835:57: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:835:63: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:874:61: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:879:50: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:879:58: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:879:69: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:883:22: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:883:44: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:885:36: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:885:49: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:886:46: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:886:52: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:890:27: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:907:34: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:908:41: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:910:5: C901 'Fitter.append_samples' is too complex (12) -./src/dataprob/fitters/base.py:910:28: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:910:45: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:943:60: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:953:49: E231 missing whitespace after ',' -./src/dataprob/fitters/base.py:957:1: W293 blank line contains whitespace -./src/dataprob/fitters/base.py:967:53: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:20:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/bayesian.py:20:30: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:20:33: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:22:71: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:23:50: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:37:69: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:47:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:57:70: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:59:42: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:61:70: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:64:50: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:74:52: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:82:27: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:82:39: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:88:43: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:97:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:99:39: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:101:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:104:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/bayesian.py:104:40: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:106:79: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:113:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:117:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:118:76: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:119:32: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:129:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:135:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:136:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:137:20: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:138:36: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:142:20: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:155:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/bayesian.py:157:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:158:19: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:163:75: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:164:71: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:165:25: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:166:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:168:79: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:169:79: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:174:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:178:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:182:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:183:74: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:185:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:187:64: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:188:38: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:192:31: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:210:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:221:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:228:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:230:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:232:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:236:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:243:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:252:49: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:279:77: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:292:75: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:308:51: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:315:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:328:49: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:332:50: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:341:35: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:342:35: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:357:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:360:61: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:361:59: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:362:65: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:363:59: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:365:23: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:367:73: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:371:40: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:371:80: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:381:22: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:383:37: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:396:45: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:396:55: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:396:66: W291 trailing whitespace -./src/dataprob/fitters/bayesian.py:402:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:410:5: E303 too many blank lines (2) -./src/dataprob/fitters/bayesian.py:410:22: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:425:21: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:440:45: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:440:54: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:440:62: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:440:72: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:440:81: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:441:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:446:1: W293 blank line contains whitespace -./src/dataprob/fitters/bayesian.py:453:18: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:468:13: E731 do not assign a lambda expression, use a def -./src/dataprob/fitters/bayesian.py:469:47: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:469:63: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:489:55: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:492:61: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:493:63: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:493:65: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:493:80: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:500:58: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:502:57: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:512:47: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:513:43: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:517:55: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:518:55: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:519:31: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:521:41: E231 missing whitespace after ',' -./src/dataprob/fitters/bayesian.py:541:60: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:12:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/bootstrap.py:17:22: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:17:40: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:17:57: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:17:71: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:36:30: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:45:18: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:52:60: W291 trailing whitespace -./src/dataprob/fitters/bootstrap.py:57:48: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:57:67: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:65:52: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:69:63: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:78:22: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:87:58: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:99:47: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:102:43: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:105:31: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:107:50: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:108:50: E231 missing whitespace after ',' -./src/dataprob/fitters/bootstrap.py:108:53: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:13:1: E302 expected 2 blank lines, found 1 -./src/dataprob/fitters/ml.py:23:22: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:33:23: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:38:18: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:50:9: E731 do not assign a lambda expression, use a def -./src/dataprob/fitters/ml.py:64:1: W293 blank line contains whitespace -./src/dataprob/fitters/ml.py:73:45: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:75:52: E261 at least two spaces before inline comment -./src/dataprob/fitters/ml.py:75:53: E262 inline comment should start with '# ' -./src/dataprob/fitters/ml.py:82:35: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:94:61: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:95:50: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:95:71: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:98:5: E303 too many blank lines (2) -./src/dataprob/fitters/ml.py:125:49: E231 missing whitespace after ',' -./src/dataprob/fitters/ml.py:138:53: E127 continuation line over-indented for visual indent -./src/dataprob/model_wrapper.py:2:62: W291 trailing whitespace -./src/dataprob/model_wrapper.py:11:1: E302 expected 2 blank lines, found 1 -./src/dataprob/model_wrapper.py:29:22: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:29:35: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:48:5: C901 'ModelWrapper._mw_load_model' is too complex (14) -./src/dataprob/model_wrapper.py:48:28: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:57:38: W291 trailing whitespace -./src/dataprob/model_wrapper.py:79:30: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:118:65: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:126:19: F541 f-string is missing placeholders -./src/dataprob/model_wrapper.py:146:30: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:146:40: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:146:48: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:155:25: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:171:31: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:190:28: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:215:29: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:221:58: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:265:21: E231 missing whitespace after ',' -./src/dataprob/model_wrapper.py:283:21: E231 missing whitespace after ',' -./tests/completeness_crawler.py:6:10: E401 multiple imports on one line -./tests/completeness_crawler.py:8:1: C901 'code_loader' is too complex (13) -./tests/completeness_crawler.py:8:1: E302 expected 2 blank lines, found 1 -./tests/completeness_crawler.py:8:25: E231 missing whitespace after ',' -./tests/completeness_crawler.py:42:47: E231 missing whitespace after ',' -./tests/completeness_crawler.py:81:55: E231 missing whitespace after ',' -./tests/completeness_crawler.py:84:55: E231 missing whitespace after ',' -./tests/completeness_crawler.py:90:27: E231 missing whitespace after ',' -./tests/completeness_crawler.py:107:44: E231 missing whitespace after ',' -./tests/completeness_crawler.py:108:50: E231 missing whitespace after ',' -./tests/completeness_crawler.py:113:1: E302 expected 2 blank lines, found 1 -./tests/completeness_crawler.py:121:1: C901 'completeness_crawler' is too complex (26) -./tests/completeness_crawler.py:121:1: E302 expected 2 blank lines, found 1 -./tests/completeness_crawler.py:121:34: E231 missing whitespace after ',' -./tests/completeness_crawler.py:121:43: E231 missing whitespace after ',' -./tests/completeness_crawler.py:134:31: E231 missing whitespace after ',' -./tests/completeness_crawler.py:134:39: E231 missing whitespace after ',' -./tests/completeness_crawler.py:137:36: E231 missing whitespace after ',' -./tests/completeness_crawler.py:140:38: E231 missing whitespace after ',' -./tests/completeness_crawler.py:141:38: E231 missing whitespace after ',' -./tests/completeness_crawler.py:149:34: E231 missing whitespace after ',' -./tests/completeness_crawler.py:149:38: E231 missing whitespace after ',' -./tests/completeness_crawler.py:176:39: E231 missing whitespace after ',' -./tests/completeness_crawler.py:204:56: E231 missing whitespace after ',' -./tests/completeness_crawler.py:226:34: E231 missing whitespace after ',' -./tests/completeness_crawler.py:226:38: E231 missing whitespace after ',' -./tests/completeness_crawler.py:274:39: E231 missing whitespace after ',' -./tests/completeness_crawler.py:279:5: F841 local variable 'extra_fake_tests' is assigned to but never used -./tests/completeness_crawler.py:280:5: F841 local variable 'missing_fake_tests' is assigned to but never used -./tests/completeness_crawler.py:285:22: E231 missing whitespace after ',' -./tests/completeness_crawler.py:290:36: E231 missing whitespace after ',' -./tests/completeness_crawler.py:295:21: E231 missing whitespace after ',' -./tests/completeness_crawler.py:300:24: E231 missing whitespace after ',' -./tests/completeness_crawler.py:305:30: E231 missing whitespace after ',' -./tests/completeness_crawler.py:309:1: E302 expected 2 blank lines, found 1 -./tests/completeness_crawler.py:309:29: E231 missing whitespace after ',' -./tests/completeness_crawler.py:317:47: E231 missing whitespace after ',' -./tests/completeness_crawler.py:317:50: E231 missing whitespace after ',' -./tests/completeness_crawler.py:329:26: E231 missing whitespace after ',' -./tests/completeness_crawler.py:333:22: E231 missing whitespace after ',' -./tests/completeness_crawler.py:348:56: E231 missing whitespace after ',' -./tests/completeness_crawler.py:381:50: E231 missing whitespace after ',' -./tests/completeness_crawler.py:381:59: E231 missing whitespace after ',' -./tests/conftest.py:6:1: F401 'numpy as np' imported but unused -./tests/conftest.py:7:1: F401 'pickle' imported but unused -./tests/conftest.py:7:10: E401 multiple imports on one line -./tests/conftest.py:18:56: E231 missing whitespace after ',' -./tests/conftest.py:21:41: E231 missing whitespace after ',' -./tests/conftest.py:22:41: E231 missing whitespace after ',' -./tests/conftest.py:26:33: E231 missing whitespace after ',' -./tests/conftest.py:27:36: E231 missing whitespace after ',' -./tests/conftest.py:37:26: E231 missing whitespace after ',' -./tests/conftest.py:39:9: E306 expected 1 blank line before a nested definition, found 0 -./tests/conftest.py:39:28: E231 missing whitespace after ',' -./tests/conftest.py:49:28: E231 missing whitespace after ',' -./tests/conftest.py:57:30: E231 missing whitespace after ',' -./tests/conftest.py:57:36: E231 missing whitespace after ',' -./tests/conftest.py:57:55: E231 missing whitespace after ',' -./tests/conftest.py:69:1: E302 expected 2 blank lines, found 1 -./tests/conftest.py:76:1: E302 expected 2 blank lines, found 1 -./tests/conftest.py:105:1: W293 blank line contains whitespace -./tests/conftest.py:112:1: W293 blank line contains whitespace -./tests/conftest.py:114:5: E303 too many blank lines (2) -./tests/conftest.py:117:1: W293 blank line contains whitespace -./tests/conftest.py:124:5: E303 too many blank lines (2) -./tests/conftest.py:126:1: E266 too many leading '#' for block comment -./tests/conftest.py:128:1: E302 expected 2 blank lines, found 1 -./tests/conftest.py:134:1: E302 expected 2 blank lines, found 1 -./tests/conftest.py:137:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:15:16: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:18:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:24:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:31:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:32:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:34:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:36:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:41:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:44:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:45:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:46:20: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:46:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:46:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:50:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:53:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:54:13: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:55:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:58:77: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:59:36: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:63:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:64:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:65:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:66:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:66:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:69:18: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:70:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:71:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:72:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:73:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:74:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:75:23: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:75:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:76:23: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:76:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:78:77: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:82:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:85:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:86:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:87:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:88:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:89:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:90:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:90:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:91:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:101:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:102:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:108:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:109:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:115:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:120:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:120:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:122:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:127:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:129:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:136:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:143:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:149:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:151:66: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:156:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:158:76: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:165:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:167:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:168:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:168:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:168:57: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:169:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:170:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:173:74: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:179:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:185:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:186:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:187:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:187:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:187:57: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:188:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:189:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:201:18: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:203:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:208:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:213:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:216:73: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:217:14: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:227:25: E231 missing whitespace after ',' +./src/dataprob/__init__.py:6:1: F401 '.fitters.setup.setup' imported but unused +./src/dataprob/__init__.py:7:1: F401 '.plot.plot_corner.plot_corner' imported but unused +./src/dataprob/__init__.py:8:1: F401 '.plot.plot_summary.plot_summary' imported but unused +./src/dataprob/__init__.py:10:1: F401 '.__version__.__version__' imported but unused +./src/dataprob/__init__.py:10:37: W292 no newline at end of file +./src/dataprob/__version__.py:2:16: W291 trailing whitespace +./src/dataprob/fitters/__init__.py:3:4: W292 no newline at end of file +./src/dataprob/fitters/base.py:6:1: F401 'dataprob.util.check.check_float' imported but unused +./src/dataprob/fitters/base.py:20:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/base.py:29:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/base.py:47:26: W291 trailing whitespace +./src/dataprob/fitters/base.py:49:82: W291 trailing whitespace +./src/dataprob/fitters/base.py:50:24: W291 trailing whitespace +./src/dataprob/fitters/base.py:53:67: W291 trailing whitespace +./src/dataprob/fitters/base.py:55:80: W291 trailing whitespace +./src/dataprob/fitters/base.py:56:83: W291 trailing whitespace +./src/dataprob/fitters/base.py:58:33: W291 trailing whitespace +./src/dataprob/fitters/base.py:62:26: W291 trailing whitespace +./src/dataprob/fitters/base.py:63:42: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:65:14: W291 trailing whitespace +./src/dataprob/fitters/base.py:70:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:79:27: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:79:39: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:98:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:111:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:116:78: W291 trailing whitespace +./src/dataprob/fitters/base.py:117:21: W291 trailing whitespace +./src/dataprob/fitters/base.py:120:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:131:25: W291 trailing whitespace +./src/dataprob/fitters/base.py:135:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:136:5: E303 too many blank lines (2) +./src/dataprob/fitters/base.py:147:77: W291 trailing whitespace +./src/dataprob/fitters/base.py:148:76: W291 trailing whitespace +./src/dataprob/fitters/base.py:149:41: W291 trailing whitespace +./src/dataprob/fitters/base.py:153:29: W291 trailing whitespace +./src/dataprob/fitters/base.py:162:48: W291 trailing whitespace +./src/dataprob/fitters/base.py:163:45: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:163:54: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:163:62: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:164:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:176:18: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:178:63: W291 trailing whitespace +./src/dataprob/fitters/base.py:180:76: W291 trailing whitespace +./src/dataprob/fitters/base.py:181:74: W291 trailing whitespace +./src/dataprob/fitters/base.py:188:5: E303 too many blank lines (2) +./src/dataprob/fitters/base.py:188:35: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:190:71: W291 trailing whitespace +./src/dataprob/fitters/base.py:206:34: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:221:45: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:221:54: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:227:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:230:33: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:249:32: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:265:45: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:265:54: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:265:62: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:271:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:274:22: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:286:27: W291 trailing whitespace +./src/dataprob/fitters/base.py:293:21: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:308:45: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:308:54: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:308:62: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:314:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:317:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:318:5: E303 too many blank lines (2) +./src/dataprob/fitters/base.py:321:62: W291 trailing whitespace +./src/dataprob/fitters/base.py:326:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:327:5: E303 too many blank lines (2) +./src/dataprob/fitters/base.py:330:35: W291 trailing whitespace +./src/dataprob/fitters/base.py:339:5: E303 too many blank lines (2) +./src/dataprob/fitters/base.py:342:59: W291 trailing whitespace +./src/dataprob/fitters/base.py:353:48: W291 trailing whitespace +./src/dataprob/fitters/base.py:357:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:359:22: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:361:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:366:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:376:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:378:60: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:386:21: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:392:59: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:396:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:398:26: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:407:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:414:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:436:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:441:34: E231 missing whitespace after ':' +./src/dataprob/fitters/base.py:458:69: W291 trailing whitespace +./src/dataprob/fitters/base.py:459:22: W291 trailing whitespace +./src/dataprob/fitters/base.py:471:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:475:78: W291 trailing whitespace +./src/dataprob/fitters/base.py:476:79: W291 trailing whitespace +./src/dataprob/fitters/base.py:477:28: W291 trailing whitespace +./src/dataprob/fitters/base.py:485:27: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:502:34: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:503:41: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:505:5: C901 'Fitter.append_samples' is too complex (12) +./src/dataprob/fitters/base.py:505:28: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:505:45: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:538:60: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:548:49: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:552:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:562:53: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:566:27: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:572:70: W291 trailing whitespace +./src/dataprob/fitters/base.py:574:37: W291 trailing whitespace +./src/dataprob/fitters/base.py:579:39: W291 trailing whitespace +./src/dataprob/fitters/base.py:585:21: W291 trailing whitespace +./src/dataprob/fitters/base.py:594:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:607:56: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:612:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:616:29: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:616:31: E231 missing whitespace after ',' +./src/dataprob/fitters/base.py:619:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:625:79: W291 trailing whitespace +./src/dataprob/fitters/base.py:634:77: W291 trailing whitespace +./src/dataprob/fitters/base.py:657:74: W291 trailing whitespace +./src/dataprob/fitters/base.py:658:20: W291 trailing whitespace +./src/dataprob/fitters/base.py:662:1: W293 blank line contains whitespace +./src/dataprob/fitters/base.py:672:24: W292 no newline at end of file +./src/dataprob/fitters/bayesian/__init__.py:3:4: W292 no newline at end of file +./src/dataprob/fitters/bayesian/_prior_processing.py:9:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:9:29: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:9:32: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:11:71: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:12:50: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:26:69: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:36:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:46:70: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:48:42: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:50:70: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:53:50: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:63:52: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:71:27: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:71:39: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:77:43: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:86:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:88:39: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:90:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:93:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:93:39: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:95:79: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:102:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:106:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:107:76: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:108:32: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:118:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:124:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:125:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:126:20: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:127:36: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:131:20: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:144:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:146:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:147:19: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:152:75: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:153:71: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:154:25: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:155:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:157:79: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:158:79: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:163:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:167:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:171:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:172:74: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:174:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:176:64: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:177:38: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:181:31: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:199:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:210:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:217:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:219:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:221:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:225:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:232:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:238:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:245:74: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:246:74: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:247:51: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:249:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:250:48: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:254:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:259:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:262:65: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:263:47: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:269:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:278:28: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:282:30: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:289:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:296:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:297:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:297:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:301:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:306:35: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:307:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:314:50: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:317:23: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:325:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:325:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:333:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:333:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:348:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/_prior_processing.py:352:72: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:353:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:359:78: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:362:39: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:365:67: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:371:48: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:378:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:380:26: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:384:36: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:385:35: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:386:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:387:37: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/_prior_processing.py:389:51: W291 trailing whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:407:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/_prior_processing.py:410:19: W292 no newline at end of file +./src/dataprob/fitters/bayesian/bayesian_sampler.py:25:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bayesian/bayesian_sampler.py:27:49: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:36:49: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:40:49: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:51:76: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:53:39: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:56:38: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:57:49: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:58:48: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:61:50: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:62:50: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:63:43: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:65:69: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:69:60: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:72:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:83:76: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:88:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:91:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:92:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:93:9: E303 too many blank lines (2) +./src/dataprob/fitters/bayesian/bayesian_sampler.py:95:61: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:96:59: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:97:65: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:98:59: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:101:72: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:103:64: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:105:64: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:108:23: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:110:73: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:116:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:127:22: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:129:37: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:143:45: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:144:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:152:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:156:5: E303 too many blank lines (2) +./src/dataprob/fitters/bayesian/bayesian_sampler.py:156:22: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:171:21: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:186:45: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:186:54: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:186:62: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:188:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:193:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:206:60: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:212:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:213:76: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:214:41: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:218:29: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:229:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:231:25: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:232:77: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:235:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:239:57: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:255:51: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:262:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:267:36: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:270:5: E303 too many blank lines (2) +./src/dataprob/fitters/bayesian/bayesian_sampler.py:270:18: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:286:22: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:292:68: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:295:55: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:299:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:310:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:312:61: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:313:58: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:313:60: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:314:41: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:317:55: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:324:58: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:325:56: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:337:41: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:338:35: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:341:55: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:342:55: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:345:76: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:346:23: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:353:53: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:357:75: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:358:58: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:359:28: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:359:36: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:359:50: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:359:64: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:363:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:366:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:367:31: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:367:68: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:368:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:369:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:370:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:372:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:373:5: E303 too many blank lines (2) +./src/dataprob/fitters/bayesian/bayesian_sampler.py:381:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:383:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:384:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:386:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:387:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:389:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:390:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:394:9: E303 too many blank lines (2) +./src/dataprob/fitters/bayesian/bayesian_sampler.py:400:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:401:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bayesian/bayesian_sampler.py:405:1: W293 blank line contains whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:408:72: W291 trailing whitespace +./src/dataprob/fitters/bayesian/bayesian_sampler.py:421:24: F541 f-string is missing placeholders +./src/dataprob/fitters/bayesian/bayesian_sampler.py:429:30: W292 no newline at end of file +./src/dataprob/fitters/bootstrap.py:14:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/bootstrap.py:25:77: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:26:56: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:32:77: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:33:76: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:34:41: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:38:29: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:41:33: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:45:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:52:44: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:54:5: C901 'BootstrapFitter._fit' is too complex (12) +./src/dataprob/fitters/bootstrap.py:54:18: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:61:60: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:67:59: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:68:59: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:69:59: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:72:48: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:72:62: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:79:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:83:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:85:64: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:95:26: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:100:26: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:102:26: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:108:19: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:114:76: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:115:43: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:117:52: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:119:44: E231 missing whitespace after ':' +./src/dataprob/fitters/bootstrap.py:120:42: E231 missing whitespace after ':' +./src/dataprob/fitters/bootstrap.py:121:41: E231 missing whitespace after ':' +./src/dataprob/fitters/bootstrap.py:126:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:133:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:149:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:151:54: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:152:36: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:154:19: F541 f-string is missing placeholders +./src/dataprob/fitters/bootstrap.py:159:35: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:160:29: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:163:49: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:164:49: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:167:76: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:168:23: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:175:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:179:75: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:180:58: W291 trailing whitespace +./src/dataprob/fitters/bootstrap.py:181:28: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:181:36: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:181:50: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:181:64: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:185:47: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:188:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:189:31: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:189:68: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:190:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:191:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:192:33: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:194:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:195:5: E303 too many blank lines (2) +./src/dataprob/fitters/bootstrap.py:203:24: E231 missing whitespace after ',' +./src/dataprob/fitters/bootstrap.py:207:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:209:1: W293 blank line contains whitespace +./src/dataprob/fitters/bootstrap.py:219:24: F541 f-string is missing placeholders +./src/dataprob/fitters/ml.py:14:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/ml.py:20:14: W291 trailing whitespace +./src/dataprob/fitters/ml.py:22:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:35:77: W291 trailing whitespace +./src/dataprob/fitters/ml.py:36:76: W291 trailing whitespace +./src/dataprob/fitters/ml.py:37:41: W291 trailing whitespace +./src/dataprob/fitters/ml.py:41:29: W291 trailing whitespace +./src/dataprob/fitters/ml.py:44:33: W291 trailing whitespace +./src/dataprob/fitters/ml.py:48:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:55:44: W291 trailing whitespace +./src/dataprob/fitters/ml.py:57:18: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:69:59: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:70:59: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:71:59: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:80:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:82:24: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:84:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:91:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:100:45: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:102:44: E261 at least two spaces before inline comment +./src/dataprob/fitters/ml.py:102:45: E262 inline comment should start with '# ' +./src/dataprob/fitters/ml.py:120:47: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:121:50: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:122:51: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:124:75: W291 trailing whitespace +./src/dataprob/fitters/ml.py:125:58: W291 trailing whitespace +./src/dataprob/fitters/ml.py:126:28: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:126:36: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:126:50: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:126:64: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:130:47: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:133:33: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:134:31: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:134:68: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:135:33: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:136:33: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:137:33: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:140:5: E303 too many blank lines (2) +./src/dataprob/fitters/ml.py:157:24: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:160:46: W291 trailing whitespace +./src/dataprob/fitters/ml.py:163:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:166:45: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:176:63: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:177:52: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:180:49: E127 continuation line over-indented for visual indent +./src/dataprob/fitters/ml.py:181:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:183:1: W293 blank line contains whitespace +./src/dataprob/fitters/ml.py:188:55: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:188:70: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:189:57: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:193:55: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:193:70: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:194:57: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:196:77: W291 trailing whitespace +./src/dataprob/fitters/ml.py:198:46: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:200:50: W291 trailing whitespace +./src/dataprob/fitters/ml.py:201:48: E231 missing whitespace after ',' +./src/dataprob/fitters/ml.py:206:5: E303 too many blank lines (2) +./src/dataprob/fitters/ml.py:208:72: W291 trailing whitespace +./src/dataprob/fitters/ml.py:216:24: F541 f-string is missing placeholders +./src/dataprob/fitters/setup.py:9:1: E302 expected 2 blank lines, found 1 +./src/dataprob/fitters/setup.py:15:32: W291 trailing whitespace +./src/dataprob/fitters/setup.py:22:15: W291 trailing whitespace +./src/dataprob/fitters/setup.py:25:77: W291 trailing whitespace +./src/dataprob/fitters/setup.py:26:54: W291 trailing whitespace +./src/dataprob/fitters/setup.py:28:78: W291 trailing whitespace +./src/dataprob/fitters/setup.py:32:63: W291 trailing whitespace +./src/dataprob/fitters/setup.py:34:76: W291 trailing whitespace +./src/dataprob/fitters/setup.py:35:79: W291 trailing whitespace +./src/dataprob/fitters/setup.py:37:29: W291 trailing whitespace +./src/dataprob/fitters/setup.py:46:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:61:32: W291 trailing whitespace +./src/dataprob/fitters/setup.py:78:83: W291 trailing whitespace +./src/dataprob/fitters/setup.py:81:67: W291 trailing whitespace +./src/dataprob/fitters/setup.py:82:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:93:18: W291 trailing whitespace +./src/dataprob/fitters/setup.py:94:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:95:73: W291 trailing whitespace +./src/dataprob/fitters/setup.py:99:83: W291 trailing whitespace +./src/dataprob/fitters/setup.py:101:26: W291 trailing whitespace +./src/dataprob/fitters/setup.py:103:74: W291 trailing whitespace +./src/dataprob/fitters/setup.py:107:74: W291 trailing whitespace +./src/dataprob/fitters/setup.py:108:36: W291 trailing whitespace +./src/dataprob/fitters/setup.py:109:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:115:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:116:86: W291 trailing whitespace +./src/dataprob/fitters/setup.py:117:74: W291 trailing whitespace +./src/dataprob/fitters/setup.py:119:24: W291 trailing whitespace +./src/dataprob/fitters/setup.py:123:77: W291 trailing whitespace +./src/dataprob/fitters/setup.py:124:75: W291 trailing whitespace +./src/dataprob/fitters/setup.py:125:20: W291 trailing whitespace +./src/dataprob/fitters/setup.py:126:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:127:79: W291 trailing whitespace +./src/dataprob/fitters/setup.py:131:76: W291 trailing whitespace +./src/dataprob/fitters/setup.py:133:77: W291 trailing whitespace +./src/dataprob/fitters/setup.py:136:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:143:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:145:13: W291 trailing whitespace +./src/dataprob/fitters/setup.py:147:80: W291 trailing whitespace +./src/dataprob/fitters/setup.py:148:62: W291 trailing whitespace +./src/dataprob/fitters/setup.py:149:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:150:78: W291 trailing whitespace +./src/dataprob/fitters/setup.py:171:77: W291 trailing whitespace +./src/dataprob/fitters/setup.py:175:75: W291 trailing whitespace +./src/dataprob/fitters/setup.py:176:70: W291 trailing whitespace +./src/dataprob/fitters/setup.py:179:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:180:5: E303 too many blank lines (2) +./src/dataprob/fitters/setup.py:180:23: E231 missing whitespace after ':' +./src/dataprob/fitters/setup.py:181:30: E231 missing whitespace after ':' +./src/dataprob/fitters/setup.py:182:25: E231 missing whitespace after ':' +./src/dataprob/fitters/setup.py:183:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:189:1: W293 blank line contains whitespace +./src/dataprob/fitters/setup.py:193:65: W292 no newline at end of file +./src/dataprob/model_wrapper/__init__.py:2:63: W291 trailing whitespace +./src/dataprob/model_wrapper/__init__.py:3:4: W292 no newline at end of file +./src/dataprob/model_wrapper/_dataframe_processing.py:8:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:8:25: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:17:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:34:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:50:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:53:43: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:57:1: C901 '_build_columns' is too complex (13) +./src/dataprob/model_wrapper/_dataframe_processing.py:57:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:57:28: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:82:35: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:83:34: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:93:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:96:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:109:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:117:33: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:118:33: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:124:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:125:45: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:126:60: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:127:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:130:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:138:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:142:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:149:54: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:152:42: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:152:50: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:153:57: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:162:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:164:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:165:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:171:74: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:176:25: E127 continuation line over-indented for visual indent +./src/dataprob/model_wrapper/_dataframe_processing.py:178:25: E127 continuation line over-indented for visual indent +./src/dataprob/model_wrapper/_dataframe_processing.py:182:38: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:182:46: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:182:59: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:188:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:193:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:194:52: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:198:44: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:198:52: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:204:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:210:49: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:212:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:213:44: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:213:52: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:213:65: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:226:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_dataframe_processing.py:230:15: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:236:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:254:38: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:265:77: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:267:68: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:268:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:277:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:283:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:285:37: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:292:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:295:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:303:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/_dataframe_processing.py:306:1: C901 'param_into_existing' is too complex (12) +./src/dataprob/model_wrapper/_dataframe_processing.py:309:63: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:316:52: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:318:60: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:319:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:326:62: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:329:50: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:331:78: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:332:59: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:333:76: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:334:34: W291 trailing whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:336:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:338:36: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:342:40: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:345:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:352:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:357:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:358:47: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:370:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:372:27: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_dataframe_processing.py:373:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:383:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:391:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:393:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_dataframe_processing.py:394:20: W292 no newline at end of file +./src/dataprob/model_wrapper/_function_processing.py:12:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/_function_processing.py:65:27: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_function_processing.py:71:33: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:76:40: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_function_processing.py:79:26: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/_function_processing.py:85:1: C901 'reconcile_fittable' is too complex (17) +./src/dataprob/model_wrapper/_function_processing.py:92:65: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:99:75: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:121:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:138:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:150:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:154:20: F541 f-string is missing placeholders +./src/dataprob/model_wrapper/_function_processing.py:157:45: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:165:78: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:166:26: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:175:24: E127 continuation line over-indented for visual indent +./src/dataprob/model_wrapper/_function_processing.py:177:69: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:181:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:182:72: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:183:16: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:189:79: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:191:29: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:213:75: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:214:66: W291 trailing whitespace +./src/dataprob/model_wrapper/_function_processing.py:233:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:246:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:247:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/_function_processing.py:251:1: W391 blank line at end of file +./src/dataprob/model_wrapper/model_wrapper.py:2:65: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:17:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/model_wrapper.py:32:37: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/model_wrapper.py:49:67: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:55:36: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:61:42: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:61:89: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:64:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:67:51: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:78:46: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/model_wrapper.py:80:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:84:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:86:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/model_wrapper.py:86:25: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:86:38: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:86:53: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:96:38: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:99:67: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:144:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:146:40: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/model_wrapper.py:147:41: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/model_wrapper.py:154:76: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:155:77: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:156:35: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:159:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:169:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:173:76: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:174:75: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:184:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:195:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:199:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:203:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:207:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/model_wrapper.py:210:74: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:211:28: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:213:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:214:76: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:219:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:221:65: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:222:83: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:225:18: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:228:54: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:231:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:234:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:235:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/model_wrapper.py:235:27: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:237:39: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:253:68: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:258:79: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:260:57: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:264:40: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:270:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:276:19: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:278:81: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:279:75: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:280:74: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:281:74: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:282:17: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:288:63: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:296:54: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:303:33: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:305:74: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:306:36: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:309:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:327:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/model_wrapper.py:327:24: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:330:70: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:336:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:346:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:350:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/model_wrapper.py:353:80: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:354:73: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:356:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:359:55: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:362:72: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:386:77: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:390:75: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:391:70: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:393:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:395:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:397:22: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/model_wrapper.py:402:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:406:74: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:407:19: W291 trailing whitespace +./src/dataprob/model_wrapper/model_wrapper.py:411:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:419:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:424:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/model_wrapper.py:434:20: F541 f-string is missing placeholders +./src/dataprob/model_wrapper/model_wrapper.py:453:20: F541 f-string is missing placeholders +./src/dataprob/model_wrapper/vector_model_wrapper.py:3:28: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:17:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/vector_model_wrapper.py:19:71: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:23:5: C901 'VectorModelWrapper._load_model' is too complex (15) +./src/dataprob/model_wrapper/vector_model_wrapper.py:29:74: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:39:67: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:51:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:58:19: F541 f-string is missing placeholders +./src/dataprob/model_wrapper/vector_model_wrapper.py:69:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:77:37: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:84:47: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:87:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:91:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:95:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:98:40: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/vector_model_wrapper.py:99:41: E231 missing whitespace after ':' +./src/dataprob/model_wrapper/vector_model_wrapper.py:118:76: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:119:67: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:124:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:126:55: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:128:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:129:74: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:138:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:139:46: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:144:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:145:76: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:146:75: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:155:74: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:156:28: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:158:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:159:76: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:164:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:166:78: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:167:83: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:168:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:170:66: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:171:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:176:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/vector_model_wrapper.py:176:19: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:178:81: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:179:75: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:180:74: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:181:74: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:182:17: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:188:63: W291 trailing whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:190:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:195:59: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:201:33: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:222:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/vector_model_wrapper.py:223:24: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/vector_model_wrapper.py:225:60: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:3:26: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:14:1: E302 expected 2 blank lines, found 1 +./src/dataprob/model_wrapper/wrap_function.py:19:57: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:26:15: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:28:78: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:32:63: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:34:76: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:35:79: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:37:29: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:42:69: W291 trailing whitespace +./src/dataprob/model_wrapper/wrap_function.py:44:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:47:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:53:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:59:33: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/wrap_function.py:62:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:63:35: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/wrap_function.py:66:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:67:35: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/wrap_function.py:67:78: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/wrap_function.py:74:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:78:32: E231 missing whitespace after ',' +./src/dataprob/model_wrapper/wrap_function.py:89:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:90:5: E303 too many blank lines (2) +./src/dataprob/model_wrapper/wrap_function.py:94:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:100:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:101:1: W293 blank line contains whitespace +./src/dataprob/model_wrapper/wrap_function.py:101:9: W292 no newline at end of file +./src/dataprob/plot/_plot_utils.py:3:47: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:13:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/_plot_utils.py:38:36: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:40:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:51:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:55:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:59:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:67:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/_plot_utils.py:67:25: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:70:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:79:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:94:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:97:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:98:39: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:101:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:104:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:108:18: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:111:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:128:40: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:129:40: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:130:42: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:131:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:134:38: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:141:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:142:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/_plot_utils.py:142:27: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:145:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:170:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:176:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/_plot_utils.py:181:34: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:182:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:191:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:195:70: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:197:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:198:42: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:199:42: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:200:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:204:18: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:204:22: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:206:75: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:207:76: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:208:1: W293 blank line contains whitespace +./src/dataprob/plot/_plot_utils.py:214:57: W291 trailing whitespace +./src/dataprob/plot/_plot_utils.py:225:31: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:226:17: E127 continuation line over-indented for visual indent +./src/dataprob/plot/_plot_utils.py:226:32: E231 missing whitespace after ',' +./src/dataprob/plot/_plot_utils.py:230:42: W292 no newline at end of file +./src/dataprob/plot/appearance.py:7:13: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:8:20: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:9:16: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:10:13: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:11:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:13:12: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:14:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:15:26: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:16:26: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:17:21: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:18:13: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:19:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:21:12: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:22:13: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:23:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:24:21: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:25:18: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:26:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:28:18: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:29:20: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:30:16: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:31:16: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:32:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:34:19: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:35:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:36:16: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:37:21: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:38:26: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:39:26: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:40:20: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:41:17: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:43:15: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:44:13: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:45:20: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:46:20: E231 missing whitespace after ':' +./src/dataprob/plot/appearance.py:47:17: E231 missing whitespace after ':' +./src/dataprob/plot/plot_corner.py:2:76: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:3:31: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:11:1: C901 'plot_corner' is too complex (11) +./src/dataprob/plot/plot_corner.py:11:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/plot_corner.py:11:18: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:11:37: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:13:72: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:14:72: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:15:27: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:23:50: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:24:15: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:25:73: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:27:33: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:39:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_corner.py:62:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_corner.py:71:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_corner.py:73:32: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:74:36: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:78:57: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:85:57: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:86:57: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:96:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:96:48: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:99:74: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:100:23: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:108:18: W291 trailing whitespace +./src/dataprob/plot/plot_corner.py:109:32: E231 missing whitespace after ',' +./src/dataprob/plot/plot_corner.py:111:15: W292 no newline at end of file +./src/dataprob/plot/plot_fit.py:12:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/plot_fit.py:38:66: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:41:33: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:44:37: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:47:34: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:49:78: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:50:39: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:67:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_fit.py:69:40: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:70:40: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:71:42: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:72:52: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:74:47: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:75:49: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:79:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:79:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:81:31: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:84:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_fit.py:86:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:86:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:86:39: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:87:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:87:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:87:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:88:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:88:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:88:41: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:89:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_fit.py:99:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_fit.py:105:32: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:107:26: W291 trailing whitespace +./src/dataprob/plot/plot_fit.py:108:27: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:108:29: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:108:41: E231 missing whitespace after ',' +./src/dataprob/plot/plot_fit.py:121:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_fit.py:124:19: W292 no newline at end of file +./src/dataprob/plot/plot_residuals.py:15:1: C901 'plot_residuals' is too complex (14) +./src/dataprob/plot/plot_residuals.py:15:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/plot_residuals.py:28:28: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:42:66: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:45:33: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:48:37: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:51:34: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:53:79: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:54:40: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:56:77: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:73:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:75:40: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:76:40: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:77:42: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:78:54: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:79:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:80:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:84:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:92:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:99:27: E701 multiple statements on one line (colon) +./src/dataprob/plot/plot_residuals.py:99:37: E261 at least two spaces before inline comment +./src/dataprob/plot/plot_residuals.py:99:56: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:102:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:103:5: E303 too many blank lines (2) +./src/dataprob/plot/plot_residuals.py:107:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:107:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:109:31: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:118:66: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:125:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:126:27: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:127:20: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:128:27: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:129:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:134:5: E303 too many blank lines (3) +./src/dataprob/plot/plot_residuals.py:138:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:139:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:140:25: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:141:20: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:143:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:145:5: E303 too many blank lines (2) +./src/dataprob/plot/plot_residuals.py:145:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:145:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:150:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:150:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:151:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:151:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:151:31: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:151:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:154:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:157:27: E701 multiple statements on one line (colon) +./src/dataprob/plot/plot_residuals.py:157:37: E261 at least two spaces before inline comment +./src/dataprob/plot/plot_residuals.py:157:56: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:164:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:166:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:166:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:168:31: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:168:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals.py:168:55: W291 trailing whitespace +./src/dataprob/plot/plot_residuals.py:170:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:171:5: E303 too many blank lines (2) +./src/dataprob/plot/plot_residuals.py:173:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:177:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals.py:177:5: W292 no newline at end of file +./src/dataprob/plot/plot_residuals_hist.py:2:43: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:14:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/plot_residuals_hist.py:23:35: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:33:31: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:35:52: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:38:34: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:41:61: W291 trailing whitespace +./src/dataprob/plot/plot_residuals_hist.py:54:5: E303 too many blank lines (2) +./src/dataprob/plot/plot_residuals_hist.py:59:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:62:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:67:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:73:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:73:44: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:75:31: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:87:46: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:93:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:94:26: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:94:35: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:94:46: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:95:19: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:95:29: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:95:39: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:96:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:97:22: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:97:28: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:98:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:100:65: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:104:15: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:104:18: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:104:28: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:104:35: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:15: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:18: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:28: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:35: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:40: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:105:53: E231 missing whitespace after ',' +./src/dataprob/plot/plot_residuals_hist.py:110:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_residuals_hist.py:113:19: W292 no newline at end of file +./src/dataprob/plot/plot_summary.py:8:1: F401 'dataprob.plot._plot_utils.get_vectors' imported but unused +./src/dataprob/plot/plot_summary.py:13:1: E302 expected 2 blank lines, found 1 +./src/dataprob/plot/plot_summary.py:17:33: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:26:66: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:27:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:40:66: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:43:33: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:46:37: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:49:34: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:51:78: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:52:39: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:54:79: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:55:40: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:58:61: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:68:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:69:5: E303 too many blank lines (2) +./src/dataprob/plot/plot_summary.py:69:33: E231 missing whitespace after ',' +./src/dataprob/plot/plot_summary.py:70:34: E231 missing whitespace after ',' +./src/dataprob/plot/plot_summary.py:71:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:77:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:87:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:98:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:108:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:114:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:119:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:124:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:129:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:136:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:141:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:143:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:150:23: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:152:15: W291 trailing whitespace +./src/dataprob/plot/plot_summary.py:153:1: W293 blank line contains whitespace +./src/dataprob/plot/plot_summary.py:153:5: W292 no newline at end of file +./src/dataprob/util/__init__.py:4:4: W292 no newline at end of file +./src/dataprob/util/check.py:9:1: E302 expected 2 blank lines, found 1 +./src/dataprob/util/check.py:9:21: E231 missing whitespace after ',' +./src/dataprob/util/check.py:31:33: E231 missing whitespace after ',' +./src/dataprob/util/check.py:37:25: E231 missing whitespace after ',' +./src/dataprob/util/check.py:41:34: E231 missing whitespace after ',' +./src/dataprob/util/check.py:46:42: E231 missing whitespace after ',' +./src/dataprob/util/check.py:46:51: E231 missing whitespace after ',' +./src/dataprob/util/check.py:52:27: E231 missing whitespace after ',' +./src/dataprob/util/check.py:57:22: E231 missing whitespace after ',' +./src/dataprob/util/check.py:70:1: C901 'check_float' is too complex (18) +./src/dataprob/util/check.py:108:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:109:5: E303 too many blank lines (2) +./src/dataprob/util/check.py:112:34: E231 missing whitespace after ',' +./src/dataprob/util/check.py:116:25: E231 missing whitespace after ',' +./src/dataprob/util/check.py:118:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:120:34: E231 missing whitespace after ',' +./src/dataprob/util/check.py:122:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:146:23: E231 missing whitespace after ',' +./src/dataprob/util/check.py:174:1: C901 'check_int' is too complex (19) +./src/dataprob/util/check.py:174:1: E302 expected 2 blank lines, found 1 +./src/dataprob/util/check.py:210:5: E303 too many blank lines (2) +./src/dataprob/util/check.py:213:34: E231 missing whitespace after ',' +./src/dataprob/util/check.py:217:25: E231 missing whitespace after ',' +./src/dataprob/util/check.py:221:34: E231 missing whitespace after ',' +./src/dataprob/util/check.py:248:23: E231 missing whitespace after ',' +./src/dataprob/util/check.py:248:33: E231 missing whitespace after ',' +./src/dataprob/util/check.py:276:1: C901 'check_array' is too complex (14) +./src/dataprob/util/check.py:276:1: E302 expected 2 blank lines, found 1 +./src/dataprob/util/check.py:292:74: W291 trailing whitespace +./src/dataprob/util/check.py:298:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:304:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:309:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:315:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:318:25: E231 missing whitespace after ',' +./src/dataprob/util/check.py:321:76: W291 trailing whitespace +./src/dataprob/util/check.py:322:63: W291 trailing whitespace +./src/dataprob/util/check.py:323:27: E231 missing whitespace after ',' +./src/dataprob/util/check.py:325:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:328:31: E231 missing whitespace after ',' +./src/dataprob/util/check.py:332:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:338:1: W293 blank line contains whitespace +./src/dataprob/util/check.py:343:1: W293 blank line contains whitespace +./src/dataprob/util/read_spreadsheet.py:2:59: W291 trailing whitespace +./src/dataprob/util/read_spreadsheet.py:7:1: E302 expected 2 blank lines, found 1 +./src/dataprob/util/read_spreadsheet.py:9:73: W291 trailing whitespace +./src/dataprob/util/read_spreadsheet.py:10:72: W291 trailing whitespace +./src/dataprob/util/read_spreadsheet.py:11:1: W293 blank line contains whitespace +./src/dataprob/util/read_spreadsheet.py:16:1: W293 blank line contains whitespace +./src/dataprob/util/read_spreadsheet.py:24:36: E231 missing whitespace after ',' +./src/dataprob/util/read_spreadsheet.py:30:26: E231 missing whitespace after ',' +./src/dataprob/util/read_spreadsheet.py:33:38: E231 missing whitespace after ',' +./src/dataprob/util/read_spreadsheet.py:35:38: E231 missing whitespace after ',' +./src/dataprob/util/read_spreadsheet.py:44:38: E231 missing whitespace after ',' +./src/dataprob/util/read_spreadsheet.py:52:1: W293 blank line contains whitespace +./tests/conftest.py:9:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:40:63: E231 missing whitespace after ',' +./tests/conftest.py:54:49: E231 missing whitespace after ',' +./tests/conftest.py:60:9: F841 local variable 'patterns' is assigned to but never used +./tests/conftest.py:65:68: E231 missing whitespace after ',' +./tests/conftest.py:70:64: E231 missing whitespace after ',' +./tests/conftest.py:70:65: F541 f-string is missing placeholders +./tests/conftest.py:77:58: E231 missing whitespace after ',' +./tests/conftest.py:81:58: E231 missing whitespace after ',' +./tests/conftest.py:85:38: E231 missing whitespace after ',' +./tests/conftest.py:94:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:96:1: W293 blank line contains whitespace +./tests/conftest.py:97:47: E231 missing whitespace after ',' +./tests/conftest.py:98:1: W293 blank line contains whitespace +./tests/conftest.py:101:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:109:56: E231 missing whitespace after ',' +./tests/conftest.py:109:68: E231 missing whitespace after ',' +./tests/conftest.py:112:41: E231 missing whitespace after ',' +./tests/conftest.py:113:41: E231 missing whitespace after ',' +./tests/conftest.py:117:33: E231 missing whitespace after ',' +./tests/conftest.py:118:36: E231 missing whitespace after ',' +./tests/conftest.py:124:28: E231 missing whitespace after ',' +./tests/conftest.py:133:5: E303 too many blank lines (2) +./tests/conftest.py:135:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:142:1: E266 too many leading '#' for block comment +./tests/conftest.py:143:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:149:1: E302 expected 2 blank lines, found 1 +./tests/conftest.py:152:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test__prior_processing.py:16:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test__prior_processing.py:17:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:19:72: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:20:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:20:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:22:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:28:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:28:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:32:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:37:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:38:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:38:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:38:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:38:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:39:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:41:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:43:77: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:46:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:46:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:48:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:54:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:54:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:63:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:64:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:64:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:64:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:64:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:65:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:69:77: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:72:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:74:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:80:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:80:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:89:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:90:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:90:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:90:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:90:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:91:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:97:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:98:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:101:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:104:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:104:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:104:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:104:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:104:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:107:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:110:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:112:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:117:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:118:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:119:78: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:126:74: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:135:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:136:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:136:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:138:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:139:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:140:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:140:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:143:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:144:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:144:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:147:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:148:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:148:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:151:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:152:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:152:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:155:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:156:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:157:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test__prior_processing.py:158:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:159:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:167:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:169:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:172:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:174:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:177:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:180:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:183:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:186:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:187:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:188:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:191:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:193:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:196:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:198:16: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:201:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:203:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:206:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:208:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:211:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:213:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test__prior_processing.py:214:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:221:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:222:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:223:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:223:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:223:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:232:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:233:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:234:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:234:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:234:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:252:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:253:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:254:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:255:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:256:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:256:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:260:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:261:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:266:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:267:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:268:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:269:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:270:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:270:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:274:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:275:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:280:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:281:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:282:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:283:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:284:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:284:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:288:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:289:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:294:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:295:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:296:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:297:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:298:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:298:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:302:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:308:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:309:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:310:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:311:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:312:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:312:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:316:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:322:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:323:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:324:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:325:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:327:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:333:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:334:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:335:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:336:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:338:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:344:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:345:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:346:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:347:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:349:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:349:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:354:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:354:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:365:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:371:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:372:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:373:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:374:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:379:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:379:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:390:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:396:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:397:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:398:31: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/bayesian/test__prior_processing.py:399:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:401:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:401:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:415:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:418:5: E303 too many blank lines (2) +./tests/dataprob/fitters/bayesian/test__prior_processing.py:423:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test__prior_processing.py:424:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:426:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:426:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:433:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:433:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:433:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:434:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:434:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:434:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:439:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:440:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:440:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:440:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:440:59: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:441:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:441:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:441:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:441:60: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:442:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:442:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:442:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:442:61: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:444:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:444:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:444:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:444:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:445:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:445:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:445:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:445:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:446:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:446:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:446:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:446:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:447:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:452:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:452:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:452:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:453:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:453:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:453:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:454:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:459:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:460:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:460:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:460:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:460:60: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:461:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:461:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:461:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:461:61: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:463:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:463:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:463:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:463:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:464:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:464:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:464:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:464:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:470:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:470:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:470:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:471:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:471:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:471:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:478:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:480:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:481:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:482:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:482:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:483:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:485:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:486:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:487:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:487:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:488:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:490:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:491:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:492:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:492:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:493:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:499:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:499:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:499:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:500:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:500:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:500:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:507:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:509:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:509:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:510:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:511:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:511:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:512:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:514:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:514:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:515:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:516:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:516:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:517:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:519:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:519:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:520:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:521:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:521:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:522:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:528:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:528:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:528:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:529:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:529:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:529:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:536:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:538:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:539:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:539:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:540:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:541:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:541:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:543:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:544:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:544:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:545:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:546:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:546:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:548:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:549:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:549:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:550:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:551:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:551:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:554:5: E303 too many blank lines (2) +./tests/dataprob/fitters/bayesian/test__prior_processing.py:558:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:559:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:560:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:561:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:561:39: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:568:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:569:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:570:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:570:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:574:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:576:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:576:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:576:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:577:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:577:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:577:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:578:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:578:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:578:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:579:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:579:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:579:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:580:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:580:39: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:580:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:580:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:587:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:588:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:588:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:588:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:588:59: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:589:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:589:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:589:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:589:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test__prior_processing.py:591:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:592:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:592:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:593:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:593:35: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:594:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:594:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:596:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:597:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:597:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:598:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:599:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test__prior_processing.py:599:34: E222 multiple spaces after operator +./tests/dataprob/fitters/bayesian/test__prior_processing.py:604:1: W391 blank line at end of file +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:14:1: F401 'dataprob.model_wrapper.model_wrapper.ModelWrapper' imported but unused +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:19:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:25:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:28:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:34:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:35:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:36:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:37:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:38:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:39:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:40:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:41:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:44:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:45:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:46:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:47:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:53:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:55:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:64:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:64:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:71:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:72:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:73:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:74:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:82:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:82:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:89:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:90:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:91:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:92:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:97:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:98:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:98:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:99:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:99:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:102:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:102:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:107:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:107:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:107:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:111:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:111:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:111:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:112:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:112:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:112:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:113:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:113:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:113:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:114:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:114:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:114:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:115:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:115:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:115:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:120:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:121:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:124:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:124:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:127:5: E303 too many blank lines (2) +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:131:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:142:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:143:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:144:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:145:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:146:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:148:71: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:150:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:151:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:153:75: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:154:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:158:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:159:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:161:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:177:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:178:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:179:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:182:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:184:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:184:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:184:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:184:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:186:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:189:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:194:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:198:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:204:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:206:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:207:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:208:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:209:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:210:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:215:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:216:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:217:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:220:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:222:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:224:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:224:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:224:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:225:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:228:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:229:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:232:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:233:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:235:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:236:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:237:68: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:238:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:239:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:239:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:240:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:240:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:241:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:244:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:245:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:250:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:256:22: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:256:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:261:76: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:264:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:264:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:265:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:265:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:266:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:266:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:266:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:267:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:268:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:271:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:275:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:276:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:277:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:278:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:286:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:287:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:288:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:289:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:290:67: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:291:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:292:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:292:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:293:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:293:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:294:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:294:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:294:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:295:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:296:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:299:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:300:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:304:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:310:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:312:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:318:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:318:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:320:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:322:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:322:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:325:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:340:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:342:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:352:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:361:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:366:29: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:383:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:391:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:392:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:392:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:393:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:393:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:394:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:394:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:394:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:395:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:401:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:404:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:404:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:405:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:411:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:420:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:421:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:422:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:422:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:422:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:432:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:437:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:438:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:444:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:453:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:454:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:455:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:455:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:455:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:465:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:468:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:468:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:469:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:475:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:484:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:485:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:486:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:486:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:486:51: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:496:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:499:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:499:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:500:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:506:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:515:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:516:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:517:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:517:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:517:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:527:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:529:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:530:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:531:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:532:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:533:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:534:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:534:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:535:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:535:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:535:60: E261 at least two spaces before inline comment +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:536:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:542:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:551:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:552:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:553:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:553:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:553:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:557:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:557:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:564:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:567:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:569:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:569:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:570:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:570:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:570:60: E261 at least two spaces before inline comment +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:571:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:577:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:586:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:587:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:588:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:588:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:588:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:592:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:592:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:599:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:602:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:602:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:603:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:609:58: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:618:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:619:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:620:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:620:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:620:50: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:632:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:633:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:634:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:634:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:634:51: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:641:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:642:75: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:644:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:645:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:649:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:649:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:649:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:659:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:659:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:659:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:660:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:660:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:660:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:661:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:661:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:661:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:662:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:662:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:662:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:665:5: E303 too many blank lines (2) +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:666:77: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:667:75: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:669:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:669:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:669:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:670:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:670:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:671:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:671:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:671:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:672:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:675:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:679:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:679:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:680:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:680:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:681:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:681:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:681:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:682:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:682:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:682:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:683:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:683:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:684:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:684:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:687:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:688:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:689:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:690:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:691:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:692:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:695:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:695:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:696:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:696:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:697:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:697:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:697:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:698:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:698:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:698:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:699:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:699:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:700:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:700:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:709:60: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:710:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:710:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:711:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:711:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:712:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:712:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:712:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:713:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:713:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:713:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:714:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:714:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:715:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:715:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:716:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:718:5: E303 too many blank lines (2) +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:722:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:734:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:735:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:746:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:747:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:747:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:749:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:769:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:771:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:774:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:776:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:776:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:776:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:777:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:780:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:780:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:781:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:781:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:791:26: W291 trailing whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:795:1: W293 blank line contains whitespace +./tests/dataprob/fitters/bayesian/test_bayesian_sampler.py:798:1: W391 blank line at end of file +./tests/dataprob/fitters/test_base.py:11:1: F401 'matplotlib' imported but unused +./tests/dataprob/fitters/test_base.py:17:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:37:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:43:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:43:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:44:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:45:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:45:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:45:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:46:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:46:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:47:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:47:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:48:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:52:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:55:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:56:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:57:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:62:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:62:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:64:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:64:45: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:65:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:65:45: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:67:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:68:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:69:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:74:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:74:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:76:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:78:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:78:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:78:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:81:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:84:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:84:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:86:42: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:88:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:89:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:91:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:92:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:93:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:93:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:94:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:95:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:95:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:95:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:96:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:96:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:97:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:97:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:98:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:104:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:108:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:113:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:118:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:118:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:119:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:120:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:120:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:120:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:121:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:121:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:122:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:122:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:123:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:127:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:134:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:134:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:135:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:135:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:136:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:137:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:137:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:137:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:138:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:138:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:138:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:139:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:149:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:149:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:154:18: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:154:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:156:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:156:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:157:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:157:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:157:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:158:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:158:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:158:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:168:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:168:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:170:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:176:18: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:176:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:179:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:179:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:179:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:180:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:180:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:180:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:181:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:181:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:181:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:192:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:192:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:193:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:193:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:194:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:200:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:200:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:201:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:201:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:209:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:209:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:211:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:211:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:211:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:212:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:212:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:212:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:216:1: E303 too many blank lines (3) +./tests/dataprob/fitters/test_base.py:218:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:218:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:219:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:219:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:220:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:220:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:220:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:221:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:223:27: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:224:27: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:225:31: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:229:71: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:237:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:241:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:242:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:252:1: W293 blank line contains whitespace ./tests/dataprob/fitters/test_base.py:255:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:262:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:265:73: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:266:14: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:278:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:311:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:318:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:320:49: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:329:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:331:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:362:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:363:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:366:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:366:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:378:1: E303 too many blank lines (4) -./tests/dataprob/fitters/test_base.py:382:1: E302 expected 2 blank lines, found 4 -./tests/dataprob/fitters/test_base.py:388:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:414:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:414:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:415:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:415:54: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:415:63: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:415:71: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:416:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:416:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:426:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:426:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:427:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:427:54: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:427:63: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:427:71: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:428:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:428:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:430:4: E114 indentation is not a multiple of 4 (comment) -./tests/dataprob/fitters/test_base.py:437:23: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:451:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:451:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:451:41: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:459:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:468:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:472:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:475:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:476:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:476:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:476:43: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:485:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:485:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:487:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:488:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:488:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:493:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:497:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:497:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:498:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:498:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:500:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:515:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:517:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:517:63: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:518:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:519:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:523:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:532:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:536:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:536:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:537:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:538:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:539:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:544:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:552:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:552:65: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:555:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:571:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:575:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:575:65: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:576:13: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:582:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:582:65: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:584:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:585:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:585:67: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:591:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:594:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:596:23: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:596:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:596:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:596:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:596:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:597:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:597:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:597:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:598:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:598:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:598:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:598:54: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:610:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:610:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:611:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:612:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:613:11: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:624:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:624:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:624:57: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:625:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:625:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:625:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:626:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:626:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:626:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:626:45: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:628:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:628:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:628:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:628:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:630:57: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:630:68: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:634:1: E303 too many blank lines (3) -./tests/dataprob/fitters/test_base.py:643:20: E127 continuation line over-indented for visual indent -./tests/dataprob/fitters/test_base.py:646:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:652:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:658:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:664:23: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:673:23: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:682:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:682:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:685:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:686:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:687:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:687:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:691:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:697:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:700:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:707:23: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:712:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:717:34: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:718:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:719:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:731:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:734:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:740:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:741:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:748:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:749:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:750:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:757:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:758:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:759:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:775:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:780:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:784:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:784:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:784:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:787:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:787:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:792:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:814:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:830:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:830:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:832:20: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:832:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:832:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:836:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:839:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:840:13: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:841:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:844:77: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:845:36: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:849:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:850:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:851:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:852:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:852:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:853:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:854:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:857:18: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:858:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:859:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:860:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:861:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:862:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:863:23: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:863:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:864:23: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:864:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:884:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:886:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:888:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:889:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:890:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:891:41: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:892:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:893:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:894:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:895:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:896:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:897:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:898:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:899:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:901:40: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:905:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:908:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:909:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:909:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:910:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:910:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:915:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:920:18: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:921:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:922:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:923:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:925:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:926:5: E303 too many blank lines (2) -./tests/dataprob/fitters/test_base.py:926:40: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:930:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:932:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:933:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:933:45: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:934:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:934:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:935:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:935:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:936:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:944:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:944:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:944:55: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:945:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:945:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:945:56: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:952:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:953:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:956:18: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:957:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:958:22: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:959:24: E231 missing whitespace after ':' -./tests/dataprob/fitters/test_base.py:961:40: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:965:14: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:968:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:968:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:969:41: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:969:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:970:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:970:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:971:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:971:54: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:972:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:972:55: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:973:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:973:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:974:52: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:974:58: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:975:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:975:57: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:976:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:976:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:977:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:977:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:983:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:984:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:998:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:998:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:999:12: E714 test for object identity should be 'is not' -./tests/dataprob/fitters/test_base.py:1005:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1007:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1010:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1012:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1018:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:1024:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1024:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1025:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1026:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1027:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1030:76: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:1035:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1035:52: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1036:20: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1044:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1059:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1059:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1060:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1062:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1062:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1065:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1065:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1068:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1068:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1079:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1079:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1080:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1080:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1081:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1081:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1088:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1089:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1093:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1093:54: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1098:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1098:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1100:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1100:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1101:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1102:20: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_base.py:1105:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_base.py:1111:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_base.py:1136:79: W291 trailing whitespace -./tests/dataprob/fitters/test_base.py:1140:1: W391 blank line at end of file -./tests/dataprob/fitters/test_bayesian.py:17:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:19:72: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:20:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:20:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:22:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:28:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:28:61: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:32:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:37:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:38:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:38:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:38:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:38:55: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:39:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:41:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:43:77: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:46:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:46:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:48:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:54:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:54:61: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:63:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:64:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:64:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:64:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:64:55: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:65:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:69:77: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:72:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:74:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:80:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:80:61: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:89:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:90:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:90:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:90:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:90:55: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:91:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:97:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:98:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:101:13: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:101:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:104:23: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:104:27: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:104:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:104:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:104:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:107:16: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:107:58: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:110:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:112:21: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:117:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:118:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:119:78: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:126:74: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:129:16: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:129:70: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:134:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:135:8: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:135:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:135:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:137:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:138:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:139:8: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:139:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:139:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:142:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:143:8: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:143:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:143:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:146:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:147:8: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:147:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:147:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:150:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:151:8: E225 missing whitespace around operator -./tests/dataprob/fitters/test_bayesian.py:151:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:151:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:154:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:155:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:156:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:157:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:158:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:166:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:168:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:171:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:173:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:176:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:179:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:182:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:185:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:186:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:187:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:190:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:192:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:195:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:197:16: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:200:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:202:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:205:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:207:27: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:210:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:229:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:232:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:240:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:241:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:242:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:243:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:244:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:245:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:248:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:249:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:250:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:251:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:252:25: E128 continuation line under-indented for visual indent -./tests/dataprob/fitters/test_bayesian.py:253:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:256:42: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:268:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:272:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:273:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:274:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:275:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:276:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:277:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:279:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:279:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:279:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:280:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:280:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:280:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:284:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:286:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:295:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:295:52: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:299:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:299:41: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:299:49: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:300:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:300:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:300:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:306:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:306:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:310:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:310:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:310:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:311:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:311:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:311:51: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:314:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:315:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:315:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:316:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:316:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:319:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:319:52: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:323:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:324:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:328:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:329:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:330:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:331:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:332:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:334:71: W291 trailing whitespace -./tests/dataprob/fitters/test_bayesian.py:336:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:337:25: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:339:76: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:340:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:342:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:345:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:346:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:350:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:351:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:352:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:355:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:357:5: E303 too many blank lines (2) -./tests/dataprob/fitters/test_bayesian.py:358:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:358:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:358:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:358:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:360:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:363:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:368:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:373:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:373:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:373:40: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:374:34: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:374:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:374:47: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:378:33: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:379:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:380:31: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:383:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:385:65: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:387:19: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:387:22: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:387:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:388:24: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:391:39: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:392:35: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:395:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:396:30: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:398:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:400:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:401:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:406:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:432:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bayesian.py:434:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:435:20: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:438:5: F841 local variable 'L' is assigned to but never used -./tests/dataprob/fitters/test_bayesian.py:440:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:443:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:446:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bayesian.py:451:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:459:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:470:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:472:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:474:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:474:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:474:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:477:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:477:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:489:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:502:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:507:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:508:45: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:509:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:510:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:510:58: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:511:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:511:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:512:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:513:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:513:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:514:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:514:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:515:46: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bayesian.py:515:52: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:15:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_bootstrap.py:16:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:20:1: W293 blank line contains whitespace -./tests/dataprob/fitters/test_bootstrap.py:24:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:35:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:37:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:39:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:39:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:39:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:42:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:42:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:54:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:67:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:72:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:73:45: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:74:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:75:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:75:58: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:76:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:76:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:77:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:78:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:78:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:79:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_bootstrap.py:79:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:1:1: F401 'pytest' imported but unused -./tests/dataprob/fitters/test_ml.py:8:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_ml.py:13:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/fitters/test_ml.py:13:37: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:21:38: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:32:32: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:34:28: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:36:26: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:36:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:36:53: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:39:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:39:50: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:51:36: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:64:29: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:69:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:70:45: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:71:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:72:43: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:72:58: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:73:44: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:73:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:74:42: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:75:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:75:59: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:76:48: E231 missing whitespace after ',' -./tests/dataprob/fitters/test_ml.py:76:59: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:12:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_check.py:14:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:14:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:14:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:14:40: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:18:26: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:18:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:18:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:18:43: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:22: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:26: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:29: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:34: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:43: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:48: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:53: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:67: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:73: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:22:76: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:25:13: F841 local variable 'value' is assigned to but never used -./tests/dataprob/test_check.py:33:22: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:55: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:61: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:64: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:33:70: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:38:26: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:38:33: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:38:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:38:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:43:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:46:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:46:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:48:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:48:48: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:52:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:55:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:55:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:57:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:57:48: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:22: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:55: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:61: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:64: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:70: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:74: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:81: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:66:88: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:72:22: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:72:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:72:27: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:72:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:77:20: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:80:20: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:80:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:82:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:82:42: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:86:20: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:89:20: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:89:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:91:24: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:91:42: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:94:1: C901 'test_check_array' is too complex (15) -./tests/dataprob/test_check.py:94:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_check.py:95:1: W293 blank line contains whitespace -./tests/dataprob/test_check.py:96:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:98:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:99:1: W293 blank line contains whitespace -./tests/dataprob/test_check.py:100:46: W291 trailing whitespace -./tests/dataprob/test_check.py:101:26: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:101:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:101:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:103:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:105:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:108:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:108:33: E231 missing whitespace after ':' -./tests/dataprob/test_check.py:108:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:108:41: E231 missing whitespace after ':' -./tests/dataprob/test_check.py:108:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:108:48: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:108:53: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:110:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:112:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:114:36: W291 trailing whitespace -./tests/dataprob/test_check.py:115:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:115:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:115:48: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:117:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:118:34: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:119:34: E702 multiple statements on one line (semicolon) -./tests/dataprob/test_check.py:119:34: E231 missing whitespace after ';' -./tests/dataprob/test_check.py:119:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:121:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:123:40: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:126:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:126:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:126:52: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:128:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:133:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:136:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:136:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:136:52: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:138:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:142:50: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:144:1: W293 blank line contains whitespace -./tests/dataprob/test_check.py:146:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:146:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:146:52: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:148:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:154:1: W293 blank line contains whitespace -./tests/dataprob/test_check.py:156:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:156:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:157:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:157:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:158:28: E127 continuation line over-indented for visual indent -./tests/dataprob/test_check.py:158:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:158:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:160:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:163:57: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:165:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:168:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:168:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:169:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:169:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:170:28: E127 continuation line over-indented for visual indent -./tests/dataprob/test_check.py:170:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:170:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:172:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:175:54: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:177:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:180:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:180:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:181:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:181:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:182:28: E127 continuation line over-indented for visual indent -./tests/dataprob/test_check.py:182:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:182:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:184:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:187:57: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:189:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:192:13: E303 too many blank lines (2) -./tests/dataprob/test_check.py:193:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:193:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:194:32: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:194:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:195:28: E127 continuation line over-indented for visual indent -./tests/dataprob/test_check.py:195:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:195:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:197:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:200:54: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:202:44: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:205:13: E303 too many blank lines (2) -./tests/dataprob/test_check.py:206:25: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:206:28: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:206:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:206:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:206:43: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:208:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:209:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:209:39: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:210:29: E128 continuation line under-indented for visual indent -./tests/dataprob/test_check.py:210:33: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:210:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:211:39: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:211:42: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:213:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:223:1: E303 too many blank lines (4) -./tests/dataprob/test_check.py:225:30: E231 missing whitespace after ':' -./tests/dataprob/test_check.py:225:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:226:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:227:33: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:228:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:229:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:230:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:231:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:27: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:29: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:31: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:33: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:39: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:41: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:43: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:45: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:47: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:49: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:51: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:233:54: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:234:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:235:30: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:237:30: E231 missing whitespace after ':' -./tests/dataprob/test_check.py:237:36: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:238:38: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:239:33: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:240:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:241:37: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:242:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:243:35: E231 missing whitespace after ',' -./tests/dataprob/test_check.py:245:40: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:8:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:11:1: W293 blank line contains whitespace -./tests/dataprob/test_fit_param.py:12:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:14:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:16:41: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:18:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:20:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:22:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:24:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:26:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:28:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:30:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:32:41: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:34:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:35:1: W293 blank line contains whitespace -./tests/dataprob/test_fit_param.py:36:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:38:28: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:39:1: W293 blank line contains whitespace -./tests/dataprob/test_fit_param.py:40:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:47:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:47:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:50:20: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/dataprob/test_fit_param.py:51:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:51:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:51:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:73:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:73:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:77:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:98:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:98:43: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:99:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:99:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:103:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:103:43: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:104:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:104:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:106:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:109:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:109:44: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:110:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:110:48: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:112:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:115:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:115:43: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:115:46: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:115:56: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:116:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:116:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:121:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:121:49: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:122:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:122:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:124:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:127:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:127:43: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:128:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:128:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:130:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:135:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:140:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:143:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:157:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:161:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:161:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:164:16: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:165:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:166:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:169:16: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:171:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:187:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:190:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:193:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:198:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:202:32: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:205:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:217:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:220:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:221:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:226:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:226:38: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:228:1: W293 blank line contains whitespace -./tests/dataprob/test_fit_param.py:230:22: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:231:32: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:231:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:232:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:235:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:236:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:238:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:239:32: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:239:37: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:240:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:247:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:247:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:247:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:250:15: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:251:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:252:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:255:15: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:257:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:258:1: W293 blank line contains whitespace -./tests/dataprob/test_fit_param.py:274:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:277:24: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:282:17: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:283:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:283:37: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:290:26: E261 at least two spaces before inline comment -./tests/dataprob/test_fit_param.py:294:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:300:1: F811 redefinition of unused 'test_stdev_getter' from line 294 -./tests/dataprob/test_fit_param.py:300:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:303:23: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:304:39: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:304:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:306:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_fit_param.py:322:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:322:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:322:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:325:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:328:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:328:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:329:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:329:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:346:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:346:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:347:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:347:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:347:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:350:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:353:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:353:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:354:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:354:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:357:21: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:358:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:358:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:359:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:359:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:359:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:371:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:371:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:372:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:372:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:372:50: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:375:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:378:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:378:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:379:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:379:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:382:17: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:383:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:383:53: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:384:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:384:37: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:396:20: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/dataprob/test_fit_param.py:399:34: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:402:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:402:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:403:42: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:403:67: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:407:20: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/dataprob/test_fit_param.py:421:17: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:422:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:423:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:424:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:427:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:428:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:429:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:430:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:433:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:434:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:435:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:436:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:439:22: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:440:40: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:442:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:443:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:444:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:447:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:448:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:449:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:451:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:452:30: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:455:22: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:456:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:457:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:462:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:463:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:463:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:464:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:467:20: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:470:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:473:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:474:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:474:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:475:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:478:22: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:481:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:485:18: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:486:33: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:486:47: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:487:35: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:490:20: E231 missing whitespace after ',' -./tests/dataprob/test_fit_param.py:492:35: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:2:1: F401 'pytest' imported but unused -./tests/dataprob/test_integration.py:9:51: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:17:21: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:18:36: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:18:50: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:24:22: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:25:22: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:28:5: E303 too many blank lines (2) -./tests/dataprob/test_integration.py:28:13: E231 missing whitespace after ',' -./tests/dataprob/test_integration.py:28:24: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:12:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_model_wrapper.py:20:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:21:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:22:41: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:23:32: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:30:50: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:31:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:32:32: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:33:41: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:36:50: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:36:72: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:37:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:38:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:39:41: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:40:32: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:44:50: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:44:72: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:45:32: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:46:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:47:41: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:48:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:53:54: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:57:54: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:81:37: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:81:49: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:84:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:84:57: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:85:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:85:56: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:129:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_model_wrapper.py:136:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:136:57: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:137:22: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:138:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:138:51: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:142:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:143:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:143:51: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:149:29: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:150:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:150:54: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:155:57: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:155:75: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:156:40: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:157:57: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:157:69: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:158:39: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:158:51: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:160:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_model_wrapper.py:179:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_model_wrapper.py:224:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:225:28: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:226:41: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:227:32: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:234:1: E302 expected 2 blank lines, found 1 -./tests/dataprob/test_model_wrapper.py:239:1: W293 blank line contains whitespace -./tests/dataprob/test_model_wrapper.py:245:23: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:246:24: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:250:27: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:254:21: E231 missing whitespace after ',' -./tests/dataprob/test_model_wrapper.py:254:24: E231 missing whitespace after ',' -19 C901 'check_float' is too complex (17) -1 E114 indentation is not a multiple of 4 (comment) -6 E122 continuation line missing indentation or outdented -15 E127 continuation line over-indented for visual indent -11 E128 continuation line under-indented for visual indent -8 E225 missing whitespace around operator -1450 E231 missing whitespace after ',' -3 E261 at least two spaces before inline comment -2 E262 inline comment should start with '# ' -12 E265 block comment should start with '# ' +./tests/dataprob/fitters/test_base.py:255:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:255:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:258:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:259:21: E261 at least two spaces before inline comment +./tests/dataprob/fitters/test_base.py:262:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:263:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:265:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:265:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:266:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:267:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:267:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:267:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:268:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:268:50: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:269:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:269:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:270:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:279:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:284:18: E222 multiple spaces after operator +./tests/dataprob/fitters/test_base.py:284:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:285:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:285:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:286:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:286:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:288:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:289:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:290:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:290:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:290:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:291:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:293:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:293:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:293:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:293:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:299:73: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:300:14: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:303:18: E222 multiple spaces after operator +./tests/dataprob/fitters/test_base.py:303:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:304:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:304:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:305:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:305:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:307:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:314:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:314:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:314:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:315:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:318:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:318:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:318:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:318:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:323:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:323:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:323:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:325:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:330:18: E222 multiple spaces after operator +./tests/dataprob/fitters/test_base.py:330:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:331:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:331:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:332:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:332:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:334:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:335:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:336:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:336:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:336:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:337:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:339:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:339:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:339:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:339:66: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:345:69: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:346:14: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:349:18: E222 multiple spaces after operator +./tests/dataprob/fitters/test_base.py:349:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:350:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:350:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:351:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:351:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:353:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:360:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:360:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:360:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:361:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:364:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:364:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:364:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:364:66: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:369:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:369:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:369:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:371:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:373:49: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:376:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:376:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:377:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:377:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:378:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:378:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:380:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:380:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:381:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:384:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:385:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:386:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:391:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:393:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:395:57: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:398:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:398:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:399:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:399:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:400:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:400:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:402:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:402:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:403:31: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:406:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:407:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:412:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:413:38: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:419:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:420:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:423:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:423:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:423:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:435:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:440:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:442:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:443:1: E303 too many blank lines (3) +./tests/dataprob/fitters/test_base.py:448:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:456:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:457:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:459:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:461:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:461:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:463:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:463:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:466:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:467:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:467:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:468:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:468:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:468:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:468:53: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:468:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:470:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:470:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:471:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:473:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:474:1: E303 too many blank lines (3) +./tests/dataprob/fitters/test_base.py:476:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:476:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:482:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:485:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:497:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:499:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:500:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:506:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:507:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:514:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:522:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:523:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:524:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:526:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:526:27: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:528:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:530:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:535:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:535:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:536:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:542:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:543:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:544:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:551:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:553:31: E261 at least two spaces before inline comment +./tests/dataprob/fitters/test_base.py:555:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:555:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:556:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:556:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:558:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:558:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:559:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:559:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:560:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:560:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:561:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:561:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:566:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:566:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:569:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:572:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:572:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:578:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:578:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:579:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:579:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:585:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:585:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:586:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:586:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:592:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:592:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:593:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:593:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:596:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:599:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:599:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:600:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:600:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:606:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:606:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:607:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:607:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:611:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:613:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:617:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:617:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:618:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:618:41: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:619:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:619:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:620:43: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:620:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:621:43: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:621:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:622:42: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:622:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:623:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:623:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:624:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:627:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:632:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:633:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:634:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:635:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:637:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:637:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:638:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:642:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:647:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:651:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:651:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:653:5: F841 local variable 'y_obs' is assigned to but never used +./tests/dataprob/fitters/test_base.py:654:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:656:35: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:657:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:659:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:659:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:661:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:661:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:661:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:661:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:662:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:662:43: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:662:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:663:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:667:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:668:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:668:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:676:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:680:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:681:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:681:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:689:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:693:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:699:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:701:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:702:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:707:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:709:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:710:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:711:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:711:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:717:41: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_base.py:717:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:721:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:723:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:724:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:726:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:727:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:727:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:727:61: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:733:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:734:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:736:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:737:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:737:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:737:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:737:74: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:744:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:745:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:747:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:748:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:748:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:748:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:748:74: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:754:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:760:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:760:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:760:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:760:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:770:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:770:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:771:12: E714 test for object identity should be 'is not' +./tests/dataprob/fitters/test_base.py:777:24: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:779:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:782:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:784:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:790:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:798:32: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:798:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:799:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:800:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:801:29: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:805:76: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:808:74: W291 trailing whitespace +./tests/dataprob/fitters/test_base.py:810:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:810:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:817:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:817:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:820:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:830:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:845:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:845:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:846:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:848:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:848:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:851:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:851:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:854:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:854:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:865:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:865:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:866:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:866:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:867:35: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:867:39: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:874:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:875:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:879:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:879:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:884:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:884:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:886:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:886:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:887:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:888:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:891:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:898:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:898:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:899:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:901:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:902:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:904:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:904:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:908:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:908:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:909:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:910:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:910:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:914:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:916:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:923:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:923:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:925:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:925:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:932:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:932:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:932:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:934:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:934:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:937:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:938:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:942:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:949:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:960:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:961:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:962:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:962:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:968:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:970:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:970:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:975:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_base.py:976:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_base.py:977:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_base.py:977:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:5:1: F401 'dataprob.model_wrapper.model_wrapper.ModelWrapper' imported but unused +./tests/dataprob/fitters/test_bootstrap.py:13:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:21:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:21:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:24:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:41:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:42:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:43:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:44:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:47:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:53:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:59:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:61:15: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/test_bootstrap.py:62:15: E127 continuation line over-indented for visual indent +./tests/dataprob/fitters/test_bootstrap.py:66:1: E303 too many blank lines (3) +./tests/dataprob/fitters/test_bootstrap.py:67:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:69:5: E303 too many blank lines (2) +./tests/dataprob/fitters/test_bootstrap.py:69:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:69:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:70:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:70:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:71:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:71:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:71:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:72:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:78:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:79:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:82:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:82:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:88:58: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:93:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:94:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:97:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:97:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:97:50: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:105:58: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:109:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:109:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:109:50: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:114:76: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:117:20: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:120:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:121:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:121:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:125:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:128:25: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:131:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:141:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:142:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:145:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:145:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:151:58: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:158:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:158:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:158:50: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:164:72: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:165:54: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:171:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:171:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:171:50: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:175:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_bootstrap.py:176:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:177:75: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:179:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:181:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:183:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:183:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:183:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:193:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:193:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:193:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:194:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:194:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:194:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:195:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:195:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:195:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:196:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:196:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:196:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:201:75: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:203:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:205:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:207:30: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:208:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:208:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:208:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:209:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:219:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:219:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:219:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:220:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:220:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:220:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:221:52: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:221:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:221:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:222:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:222:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:222:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:226:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:227:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:231:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:232:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:237:77: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:238:75: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:240:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:240:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:241:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:241:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:242:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:242:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:242:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:243:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:244:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:247:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:248:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:252:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:252:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:253:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:253:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:254:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:254:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:254:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:255:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:255:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:255:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:256:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:256:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:257:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:257:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:260:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:261:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:262:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:263:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:264:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:265:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:268:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:268:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:269:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:269:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:270:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:270:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:270:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:271:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:271:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:271:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:272:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:272:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:273:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:273:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:280:60: W291 trailing whitespace +./tests/dataprob/fitters/test_bootstrap.py:281:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:281:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:282:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:282:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:283:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:283:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:283:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:284:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:284:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:284:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:285:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:285:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:286:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:286:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:287:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:289:5: E303 too many blank lines (2) +./tests/dataprob/fitters/test_bootstrap.py:292:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/fitters/test_bootstrap.py:292:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:292:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:293:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:293:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:294:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:294:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:294:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:295:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:296:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:299:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:300:44: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_bootstrap.py:310:33: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:317:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:317:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:317:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:318:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_bootstrap.py:321:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:321:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:322:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:322:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_bootstrap.py:337:25: W292 no newline at end of file +./tests/dataprob/fitters/test_ml.py:4:1: F401 'dataprob.model_wrapper.model_wrapper.ModelWrapper' imported but unused +./tests/dataprob/fitters/test_ml.py:9:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_ml.py:11:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:16:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_ml.py:18:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:18:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:21:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:31:73: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:38:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:49:78: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:54:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:54:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:55:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:55:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:56:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:56:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:56:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:57:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:58:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:59:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:64:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:65:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:67:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:76:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:77:37: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/dataprob/fitters/test_ml.py:79:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:90:68: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:91:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:93:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:96:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:98:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:99:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:106:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:107:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:110:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:111:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:112:46: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:112:53: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:117:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:118:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:118:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:119:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:119:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:120:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:120:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:120:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:121:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:122:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:125:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:126:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:135:61: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:137:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:146:73: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:148:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:149:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:152:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:156:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:158:77: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:159:75: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:162:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:163:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:167:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:167:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:168:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:168:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:169:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:169:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:169:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:170:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:170:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:170:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:171:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:171:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:172:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:172:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:175:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:176:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:177:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:178:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:179:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:180:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:183:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:183:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:184:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:184:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:185:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:185:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:185:65: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:186:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:186:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:186:64: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:187:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:187:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:188:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:188:58: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:196:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:196:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:197:44: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:197:47: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:198:49: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:198:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:198:60: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:199:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:199:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:199:59: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:200:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:200:55: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:201:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:201:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:203:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_ml.py:205:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:205:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:206:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:206:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:207:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:207:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:207:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:208:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:209:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:212:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:213:37: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:224:77: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:227:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:227:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:228:48: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:228:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:230:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:241:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:243:73: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:245:57: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:246:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_ml.py:251:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:257:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:257:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:259:17: E128 continuation line under-indented for visual indent +./tests/dataprob/fitters/test_ml.py:259:36: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:260:17: E128 continuation line under-indented for visual indent +./tests/dataprob/fitters/test_ml.py:260:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:261:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:261:51: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:261:56: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:262:36: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_ml.py:265:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:266:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:268:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:269:23: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:275:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:275:37: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:280:78: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:287:26: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:287:40: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:287:42: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:291:28: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:291:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:292:21: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:292:25: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_ml.py:301:25: W291 trailing whitespace +./tests/dataprob/fitters/test_ml.py:308:1: W391 blank line at end of file +./tests/dataprob/fitters/test_setup.py:15:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/fitters/test_setup.py:17:19: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:24:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:28:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:32:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:36:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:44:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:47:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:48:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:54:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:57:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:57:57: E231 missing whitespace after ':' +./tests/dataprob/fitters/test_setup.py:58:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:61:1: W293 blank line contains whitespace +./tests/dataprob/fitters/test_setup.py:64:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:65:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:70:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:71:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:75:34: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:75:38: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:77:30: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:78:37: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:79:45: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:79:50: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:79:54: E231 missing whitespace after ',' +./tests/dataprob/fitters/test_setup.py:82:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:20:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:23:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:23:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:23:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:24:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:24:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:24:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:26:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:26:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:33:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:33:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:34:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:38:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:38:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:38:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:39:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:43:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:44:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:46:34: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:46:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:46:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:47:29: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:47:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:47:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:47:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:50:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:50:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:51:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:53:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:53:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:53:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:54:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:54:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:54:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:56:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:56:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:57:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:58:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:59:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:60:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:60:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:60:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:62:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:65:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:65:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:68:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:69:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:69:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:69:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:69:65: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:70:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:70:69: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:71:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:71:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:72:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:72:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:73:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:73:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:74:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:74:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:75:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:75:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:80:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:80:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:81:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:81:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:82:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:82:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:83:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:83:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:84:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:84:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:85:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:85:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:86:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:86:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:89:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:89:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:89:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:89:65: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:90:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:90:69: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:91:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:91:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:92:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:92:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:93:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:93:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:94:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:94:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:95:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:95:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:96:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:96:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:96:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:97:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:97:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:97:58: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:100:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:100:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:101:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:101:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:102:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:102:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:103:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:103:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:104:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:104:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:105:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:105:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:106:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:106:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:109:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:109:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:109:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:109:65: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:110:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:110:69: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:111:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:111:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:112:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:112:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:113:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:113:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:114:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:114:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:115:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:115:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:116:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:116:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:116:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:117:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:117:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:117:58: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:118:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:121:18: W291 trailing whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:124:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:126:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:126:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:126:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:126:69: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:127:34: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:127:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:128:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:128:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:131:29: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:132:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:133:81: W291 trailing whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:134:79: W291 trailing whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:136:27: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:136:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:136:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:136:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:139:26: W291 trailing whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:142:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:142:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:142:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:142:60: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:143:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:145:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:145:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:146:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:146:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:149:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:149:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:152:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:152:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:153:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:153:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:157:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:158:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:161:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:161:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:161:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:161:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:162:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:162:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:162:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:162:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:163:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:163:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:163:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:163:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:165:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:165:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:165:65: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:165:73: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:166:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:166:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:166:63: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:166:70: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:169:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:169:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:169:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:169:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:171:34: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:172:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:172:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:173:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:173:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:178:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:179:25: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:179:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:180:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:185:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:186:25: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:186:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:187:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:192:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:193:25: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test__dataframe_processing.py:193:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:194:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:198:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:200:50: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:200:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:202:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:204:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:204:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:220:26: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:224:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:225:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:226:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:226:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:227:41: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:227:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:228:40: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:228:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:229:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:232:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:233:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:240:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:241:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:247:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:248:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:254:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:255:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:257:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:257:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:257:60: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:258:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:258:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:258:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:262:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:263:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:269:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:270:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:276:26: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:277:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:283:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:284:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:287:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:288:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:291:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:291:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:296:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:296:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:299:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:299:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:302:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:302:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:307:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:307:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:308:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:308:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:309:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:309:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:311:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:313:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:313:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:319:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__dataframe_processing.py:322:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:326:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:326:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:328:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:332:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:332:60: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:334:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:336:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:336:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:338:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:338:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:340:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:340:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:343:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:343:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:344:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:347:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:347:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:348:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:351:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:351:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:352:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:354:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:354:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:355:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:357:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:359:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:360:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:360:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:361:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:361:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:363:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:364:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:364:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:370:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:372:42: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:373:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:377:34: E261 at least two spaces before inline comment +./tests/dataprob/model_wrapper/test__dataframe_processing.py:378:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:378:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:379:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:379:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:382:28: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:382:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:386:34: E261 at least two spaces before inline comment +./tests/dataprob/model_wrapper/test__dataframe_processing.py:387:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:387:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:388:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:388:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:391:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:391:41: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:397:42: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:398:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:399:47: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:403:34: E261 at least two spaces before inline comment +./tests/dataprob/model_wrapper/test__dataframe_processing.py:404:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:404:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:405:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:405:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:406:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:406:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:406:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:407:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:409:28: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:409:37: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:410:28: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:410:41: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:414:34: E261 at least two spaces before inline comment +./tests/dataprob/model_wrapper/test__dataframe_processing.py:415:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:415:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:416:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:416:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:417:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:417:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:417:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__dataframe_processing.py:418:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__dataframe_processing.py:418:5: W292 no newline at end of file +./tests/dataprob/model_wrapper/test__function_processing.py:12:1: C901 'test_analyze_fcn_sig' is too complex (12) +./tests/dataprob/model_wrapper/test__function_processing.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__function_processing.py:14:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:14:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:14:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:14:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:14:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:15:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:17:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:17:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:17:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:17:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:27:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:27:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:27:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:27:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:28:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:30:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:30:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:30:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:30:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:40:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:40:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:40:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:40:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:41:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:43:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:43:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:43:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:43:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:54:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:71:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:73:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:81:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:83:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:91:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:93:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:100:22: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:100:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:101:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:103:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:106:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:106:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:106:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:110:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:110:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:113:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:116:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:116:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:116:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:120:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:129:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test__function_processing.py:131:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:132:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:133:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:134:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:135:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:136:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:139:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test__function_processing.py:147:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:155:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:158:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:163:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:171:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:174:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:175:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:180:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:180:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:181:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:181:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:181:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:182:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:185:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:186:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:186:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:190:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:191:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:191:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:192:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:192:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:192:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:193:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:196:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:196:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:197:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:201:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:202:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:202:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:203:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:203:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:203:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:204:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:211:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:212:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:212:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:212:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:213:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:213:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:213:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:214:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:216:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:218:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:218:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:219:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:219:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:223:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:224:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:225:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:225:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:226:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:226:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:226:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:227:35: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:231:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:231:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:232:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:233:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:236:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:237:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:238:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:238:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:239:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:239:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:239:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:239:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:239:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:243:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:243:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:244:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:249:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:250:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:250:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:251:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:251:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:251:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:251:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:251:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:255:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:255:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:256:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:260:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:261:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:261:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:261:45: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:262:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:262:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:263:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:263:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:263:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:263:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:263:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:272:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:272:38: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:272:42: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:272:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:272:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:273:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:273:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:274:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:274:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:274:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:274:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:274:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:279:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:283:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:284:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:284:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:285:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:285:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:285:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:285:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:285:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:295:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:296:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:296:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:297:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:297:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:297:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:297:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:297:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:300:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:302:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:302:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:302:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:303:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:306:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test__function_processing.py:308:36: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:309:36: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:309:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:309:45: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test__function_processing.py:314:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:316:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:316:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:317:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:317:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:322:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:322:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:322:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:323:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:330:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:331:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:333:23: E711 comparison to None should be 'if cond is None:' +./tests/dataprob/model_wrapper/test__function_processing.py:337:22: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:337:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:338:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:344:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:344:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:344:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:344:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:344:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:345:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:354:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:354:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:354:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:355:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:364:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:364:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:364:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:364:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test__function_processing.py:365:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:366:41: E225 missing whitespace around operator +./tests/dataprob/model_wrapper/test__function_processing.py:373:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test__function_processing.py:373:5: W292 no newline at end of file +./tests/dataprob/model_wrapper/test_model_wrapper.py:8:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_model_wrapper.py:10:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:10:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:10:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:10:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:15:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:23:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:31:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:43:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:44:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:45:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:46:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:51:48: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:58:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:59:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:66:48: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:67:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:67:61: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:72:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:73:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:74:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:81:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:85:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:87:1: E303 too many blank lines (3) +./tests/dataprob/model_wrapper/test_model_wrapper.py:94:50: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:96:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:100:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:100:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:100:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:100:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:101:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:108:77: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:109:75: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:110:28: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:113:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:114:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:115:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:116:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:120:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:122:73: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:123:81: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:124:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:124:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:124:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:133:25: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:140:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:141:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:147:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:147:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:147:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:149:75: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:150:51: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:154:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:157:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:158:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:159:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:164:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:164:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:171:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:189:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:198:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:204:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:208:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:208:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:212:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:214:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:218:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:219:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:224:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:226:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:230:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:236:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:236:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:238:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:239:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:241:41: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:248:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:249:41: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test_model_wrapper.py:249:44: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:251:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:255:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:261:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:262:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:263:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:269:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:269:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:269:50: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:270:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:275:21: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test_model_wrapper.py:275:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:276:21: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test_model_wrapper.py:276:40: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:276:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:276:46: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:278:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:279:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:283:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:289:21: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test_model_wrapper.py:289:40: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:290:21: E127 continuation line over-indented for visual indent +./tests/dataprob/model_wrapper/test_model_wrapper.py:292:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:293:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:297:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:300:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:300:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:300:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:300:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:302:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:315:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:317:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:317:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:317:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:317:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:319:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:328:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:328:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:328:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:328:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:330:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:332:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:332:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:332:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:344:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:345:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:348:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:348:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:348:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:358:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:358:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:358:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:359:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:359:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:359:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:365:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:365:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:365:59: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:375:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:375:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:375:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:376:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:376:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:377:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:379:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:380:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:380:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:380:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:380:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:385:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:385:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:385:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:385:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:387:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:390:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:399:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:404:55: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:407:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:407:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:407:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:407:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:409:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:410:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:411:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:415:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:415:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:416:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:416:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:417:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:417:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:420:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:420:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:420:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:420:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:422:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:423:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:424:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:428:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:428:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:429:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:429:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:430:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:430:52: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:433:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:433:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:433:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:433:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:435:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:436:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:437:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:439:23: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:439:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:441:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:442:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:443:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:446:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:446:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:446:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:446:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:448:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:449:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:450:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:452:23: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:457:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:457:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:457:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:457:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:459:23: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:464:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:464:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:464:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:464:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:466:23: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:466:32: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:467:38: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:470:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:471:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_model_wrapper.py:474:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:474:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:474:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:474:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:476:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:479:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:482:20: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:483:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:485:20: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:485:22: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:485:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:488:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:488:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:491:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:493:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:493:36: E261 at least two spaces before inline comment +./tests/dataprob/model_wrapper/test_model_wrapper.py:493:37: E262 inline comment should start with '# ' +./tests/dataprob/model_wrapper/test_model_wrapper.py:496:16: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:496:18: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:497:16: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:497:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:498:16: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:498:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:500:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:500:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:500:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:500:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:504:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:505:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_model_wrapper.py:507:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:507:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:507:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:507:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:509:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:511:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:511:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:513:35: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:515:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:515:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:516:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:516:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:519:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:520:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:522:38: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:523:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:523:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:528:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:534:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:535:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:535:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:535:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:535:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:537:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:539:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:539:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:539:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:540:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:542:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:542:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:544:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:544:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:544:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:548:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:548:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:553:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:553:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:553:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:553:61: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:554:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:554:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:554:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:556:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_model_wrapper.py:558:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:558:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:558:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:558:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:564:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_model_wrapper.py:565:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:566:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:566:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:566:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:566:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:568:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:568:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:568:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:569:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:571:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:572:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:572:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:572:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:574:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:574:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:574:54: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:579:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:579:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:579:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_model_wrapper.py:591:49: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_model_wrapper.py:595:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_model_wrapper.py:596:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:8:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:11:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:11:30: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:14:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:14:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:14:54: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:14:56: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:14:60: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:15:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:17:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:18:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:19:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:24:1: C901 'test_VectorModelWrapper__load_model' is too complex (16) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:24:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:31:50: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:33:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:35:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:36:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:41:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:41:45: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:41:49: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:41:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:41:55: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:43:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:49:44: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:50:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:56:44: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:57:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:63:44: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:64:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:66:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:67:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:70:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:71:44: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:72:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:73:66: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:75:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:78:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:79:44: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:80:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:81:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:82:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:86:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:87:40: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:89:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:95:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:96:40: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:98:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:99:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:100:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:100:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:104:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:104:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:106:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:107:40: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:109:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:114:76: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:117:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:117:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:117:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:119:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:120:40: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:122:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:127:76: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:130:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:130:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:130:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:132:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:133:39: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:133:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:133:46: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:133:51: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:135:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:143:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:143:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:143:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:146:21: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:146:40: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:147:21: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:147:40: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:151:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:151:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:151:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:155:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:156:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:158:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:160:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:160:21: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:163:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:164:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:164:56: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:167:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:168:1: E303 too many blank lines (3) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:170:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:170:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:172:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:172:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:172:54: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:173:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:175:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:175:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:176:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:177:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:177:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:181:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:183:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:184:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:186:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:186:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:187:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:188:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:188:49: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:197:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:197:55: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:198:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:199:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:199:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:205:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:206:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:206:42: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:206:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:209:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:210:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:213:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:55: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:58: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:62: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:215:67: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:216:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:219:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:220:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:221:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:35: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:230:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:232:6: E114 indentation is not a multiple of 4 (comment) +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:236:17: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:239:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:239:27: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:242:17: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:249:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:253:39: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:254:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:255:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:256:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:256:34: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:264:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:268:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:268:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:271:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:55: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:58: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:62: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:273:67: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:277:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:281:19: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:48: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:51: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:55: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:58: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:62: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:283:67: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:284:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:286:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:286:32: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:288:35: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:290:23: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:290:25: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:291:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:291:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:294:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:295:24: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:297:38: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:298:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:298:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:299:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_vector_model_wrapper.py:303:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:13:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/model_wrapper/test_wrap_function.py:21:29: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:21:33: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:21:37: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:21:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:28:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:30:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:31:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:32:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:34:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:38:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:41:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:43:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:44:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:46:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:50:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:50:52: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:53:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:55:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:57:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:60:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:61:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:62:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:67:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:69:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:71:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:74:34: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:75:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:78:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:79:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:80:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:83:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_wrap_function.py:84:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:85:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:87:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:92:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:94:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:96:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:106:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:107:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:109:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:111:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:112:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:46: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:50: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:53: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:57: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:62: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:66: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:121:70: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:123:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:125:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:132:14: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:133:26: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:133:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:134:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:136:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:136:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:54: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:61: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:66: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:70: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:137:74: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:140:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:141:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:142:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:143:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:154:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:154:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:154:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:155:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:156:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:157:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:161:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:161:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:161:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:162:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:162:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:162:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:163:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:165:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:166:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_wrap_function.py:169:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/model_wrapper/test_wrap_function.py:169:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:171:72: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:175:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:176:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:177:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:178:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:181:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:184:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:186:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:187:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:189:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:193:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:193:52: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:196:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:198:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:200:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:203:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:204:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:205:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:210:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:212:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:214:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:217:34: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:218:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:221:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:222:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:223:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:226:5: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_wrap_function.py:227:30: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:228:31: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:230:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:235:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:237:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:239:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:248:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:249:5: E303 too many blank lines (3) +./tests/dataprob/model_wrapper/test_wrap_function.py:251:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:252:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:254:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:256:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:257:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:260:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:263:5: E303 too many blank lines (3) +./tests/dataprob/model_wrapper/test_wrap_function.py:263:14: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:264:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/model_wrapper/test_wrap_function.py:264:26: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:264:28: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:265:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:267:43: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:267:47: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:43: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:50: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:54: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:57: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:61: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:66: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:70: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:268:74: E231 missing whitespace after ':' +./tests/dataprob/model_wrapper/test_wrap_function.py:270:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:272:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:273:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:274:31: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:275:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:285:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:285:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:285:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:286:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:287:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:288:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:292:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:292:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:292:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:293:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:293:44: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:293:48: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:294:25: E128 continuation line under-indented for visual indent +./tests/dataprob/model_wrapper/test_wrap_function.py:296:1: W293 blank line contains whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:297:4: E303 too many blank lines (2) +./tests/dataprob/model_wrapper/test_wrap_function.py:297:4: E114 indentation is not a multiple of 4 (comment) +./tests/dataprob/model_wrapper/test_wrap_function.py:300:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/dataprob/model_wrapper/test_wrap_function.py:300:39: E231 missing whitespace after ',' +./tests/dataprob/model_wrapper/test_wrap_function.py:302:72: W291 trailing whitespace +./tests/dataprob/model_wrapper/test_wrap_function.py:310:18: W292 no newline at end of file +./tests/dataprob/plot/test__plot_utils.py:16:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test__plot_utils.py:18:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:20:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:22:30: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:22:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:37:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:52:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:60:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:62:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:62:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:80:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:87:38: W291 trailing whitespace +./tests/dataprob/plot/test__plot_utils.py:95:54: E231 missing whitespace after ':' +./tests/dataprob/plot/test__plot_utils.py:104:46: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:108:13: E117 over-indented +./tests/dataprob/plot/test__plot_utils.py:108:38: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:110:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:113:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:119:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:122:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:123:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:124:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:129:22: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:130:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:132:29: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:132:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:135:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:136:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:137:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:140:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test__plot_utils.py:142:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:142:37: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:143:27: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:144:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:146:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:146:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:147:27: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:148:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:150:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:150:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:151:27: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:152:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:154:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:154:35: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:155:27: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:156:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:158:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:158:35: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:159:27: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:160:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:163:22: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:163:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:165:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test__plot_utils.py:168:29: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:169:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:187:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test__plot_utils.py:189:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:189:39: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:190:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:190:39: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:192:21: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:193:21: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:194:20: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:195:20: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:197:18: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:197:22: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:198:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:199:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:200:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:201:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:203:21: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:204:21: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:205:20: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:206:20: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:208:18: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:208:22: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:209:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:210:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:211:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:212:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test__plot_utils.py:213:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:215:1: W293 blank line contains whitespace +./tests/dataprob/plot/test__plot_utils.py:215:5: W292 no newline at end of file +./tests/dataprob/plot/test_appearance.py:4:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test_appearance.py:6:76: W291 trailing whitespace +./tests/dataprob/plot/test_appearance.py:7:14: W291 trailing whitespace +./tests/dataprob/plot/test_appearance.py:10:33: W292 no newline at end of file +./tests/dataprob/plot/test_corner.py:13:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_corner.py:14:74: W291 trailing whitespace +./tests/dataprob/plot/test_corner.py:15:71: W291 trailing whitespace +./tests/dataprob/plot/test_corner.py:16:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_corner.py:20:21: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:21:42: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:21:50: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:21:61: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:27:37: E231 missing whitespace after ':' +./tests/dataprob/plot/test_corner.py:27:42: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:27:47: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:27:58: E231 missing whitespace after ':' +./tests/dataprob/plot/test_corner.py:27:62: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:38:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:41:22: W291 trailing whitespace +./tests/dataprob/plot/test_corner.py:42:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:43:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:44:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_corner.py:45:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:46:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:48:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:49:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:51:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:52:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:53:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_corner.py:56:28: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:56:47: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:57:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_corner.py:59:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:60:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:63:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:64:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:66:52: W291 trailing whitespace +./tests/dataprob/plot/test_corner.py:73:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:74:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:77:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:77:43: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:77:55: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:78:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:81:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:81:43: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:81:55: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:81:59: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:81:65: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:82:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:85:24: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:85:43: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:85:53: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:86:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_corner.py:87:1: W391 blank line at end of file +./tests/dataprob/plot/test_plot_fit.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test_plot_fit.py:14:71: W291 trailing whitespace +./tests/dataprob/plot/test_plot_fit.py:15:17: W291 trailing whitespace +./tests/dataprob/plot/test_plot_fit.py:17:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:18:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:26:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_fit.py:32:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:33:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:39:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_fit.py:40:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:41:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:42:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:45:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:46:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:47:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:50:29: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:50:40: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:51:33: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:51:48: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:57:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_fit.py:58:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_fit.py:58:5: W292 no newline at end of file +./tests/dataprob/plot/test_plot_residuals.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test_plot_residuals.py:14:71: W291 trailing whitespace +./tests/dataprob/plot/test_plot_residuals.py:15:17: W291 trailing whitespace +./tests/dataprob/plot/test_plot_residuals.py:17:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:18:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:26:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals.py:30:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals.py:32:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:33:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:37:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:39:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:40:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:41:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:43:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals.py:45:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:51:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:52:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:59:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:60:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:67:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:68:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:75:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:76:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:83:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:84:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:91:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:92:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:99:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:100:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:107:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:108:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:111:29: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:111:40: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:112:39: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:118:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals.py:119:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals.py:123:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals.py:123:5: W292 no newline at end of file +./tests/dataprob/plot/test_plot_residuals_hist.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test_plot_residuals_hist.py:14:71: W291 trailing whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:15:17: W291 trailing whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:17:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:18:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:26:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:30:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:32:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:33:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:37:5: E303 too many blank lines (2) +./tests/dataprob/plot/test_plot_residuals_hist.py:37:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:38:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:39:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:41:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:43:30: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:45:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:45:49: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:46:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:47:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:54:40: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:54:73: E231 missing whitespace after ':' +./tests/dataprob/plot/test_plot_residuals_hist.py:57:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:57:64: E231 missing whitespace after ':' +./tests/dataprob/plot/test_plot_residuals_hist.py:58:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:59:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:63:30: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:64:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_residuals_hist.py:65:29: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:65:40: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:66:44: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:72:30: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:74:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:75:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:76:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:79:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:80:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:81:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:85:36: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:86:32: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:87:31: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:91:30: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_residuals_hist.py:93:1: W391 blank line at end of file +./tests/dataprob/plot/test_plot_summary.py:1:1: F401 'pytest' imported but unused +./tests/dataprob/plot/test_plot_summary.py:9:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/plot/test_plot_summary.py:12:74: W291 trailing whitespace +./tests/dataprob/plot/test_plot_summary.py:14:78: W291 trailing whitespace +./tests/dataprob/plot/test_plot_summary.py:15:78: W291 trailing whitespace +./tests/dataprob/plot/test_plot_summary.py:19:19: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_summary.py:20:25: E231 missing whitespace after ',' +./tests/dataprob/plot/test_plot_summary.py:25:1: W293 blank line contains whitespace +./tests/dataprob/plot/test_plot_summary.py:28:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_binding.py:12:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:13:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_binding.py:17:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:17:35: W291 trailing whitespace +./tests/dataprob/test_integration/test_binding.py:20:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_binding.py:25:28: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:25:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:26:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:26:65: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:26:69: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:28:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_binding.py:30:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_binding.py:47:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_binding.py:49:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:53:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_binding.py:60:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_binding.py:61:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_binding.py:67:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_binding.py:75:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_exponential-saturation.py:2:70: W291 trailing whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_exponential-saturation.py:12:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:13:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:17:33: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:17:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:17:37: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:17:41: W291 trailing whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:18:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:21:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_exponential-saturation.py:22:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_exponential-saturation.py:23:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_exponential-saturation.py:28:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:28:25: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:29:39: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:29:74: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:29:78: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:33:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_exponential-saturation.py:39:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_exponential-saturation.py:40:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_exponential-saturation.py:42:24: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:42:28: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:42:33: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:42:47: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:42:49: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:44:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:45:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:55:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:57:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:61:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_exponential-saturation.py:68:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_exponential-saturation.py:69:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_exponential-saturation.py:75:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_exponential-saturation.py:83:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_exponential-saturation.py:89:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_lagged-exponential.py:2:73: W291 trailing whitespace +./tests/dataprob/test_integration/test_lagged-exponential.py:3:20: W291 trailing whitespace +./tests/dataprob/test_integration/test_lagged-exponential.py:13:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_lagged-exponential.py:13:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:14:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_lagged-exponential.py:18:33: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:18:39: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:21:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_lagged-exponential.py:22:24: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_lagged-exponential.py:27:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:27:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:28:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:28:70: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:28:74: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:32:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_lagged-exponential.py:51:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:55:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_lagged-exponential.py:57:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_lagged-exponential.py:62:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_lagged-exponential.py:63:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_lagged-exponential.py:69:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_lagged-exponential.py:77:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_lagged-exponential.py:83:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:2:69: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:3:43: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:13:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:13:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:14:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:18:41: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:19:29: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:19:39: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:20:29: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:20:38: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:21:29: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:21:42: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:21:51: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:23:46: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:51:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:55:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:61:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:63:30: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:64:29: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:65:29: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:66:29: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:67:28: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:68:28: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:75:29: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:75:31: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:78:43: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:80:45: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:80:49: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:84:33: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:85:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:85:24: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:86:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:86:24: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:96:31: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:97:31: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:99:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:100:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:103:5: E303 too many blank lines (2) +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:106:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:109:77: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:113:5: E265 block comment should start with '# ' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:114:5: E265 block comment should start with '# ' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:115:5: E265 block comment should start with '# ' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:116:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:118:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:122:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:129:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:130:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:136:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear-extrapolation-folding.py:144:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear.py:2:52: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear.py:12:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:13:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear.py:17:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:17:25: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:17:29: W291 trailing whitespace +./tests/dataprob/test_integration/test_linear.py:20:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear.py:21:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear.py:26:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:26:25: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:27:29: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:27:64: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:27:68: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:29:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear.py:31:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_linear.py:48:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear.py:50:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:54:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_linear.py:61:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear.py:62:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_linear.py:68:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_linear.py:76:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_michelis-menten.py:2:62: W291 trailing whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_michelis-menten.py:12:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:13:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:17:34: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:17:40: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:17:50: W291 trailing whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:20:25: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_michelis-menten.py:21:23: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_michelis-menten.py:26:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:26:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:27:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:27:70: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:27:74: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:29:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:31:27: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_michelis-menten.py:48:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:50:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:54:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_michelis-menten.py:61:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_michelis-menten.py:62:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_michelis-menten.py:68:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_michelis-menten.py:76:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_michelis-menten.py:82:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_mixed-gaussian.py:2:68: W291 trailing whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:3:31: W291 trailing whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:13:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_mixed-gaussian.py:13:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:14:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:20:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:20:44: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:33:53: W291 trailing whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:42:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:53:44: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:56:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:27: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:39: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:43: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:46: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:48: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:57:52: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:58:17: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:58:32: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_mixed-gaussian.py:63:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:63:25: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:64:31: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:64:66: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:64:70: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:68:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_mixed-gaussian.py:69:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:69:36: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_mixed-gaussian.py:72:5: E303 too many blank lines (2) +./tests/dataprob/test_integration/test_mixed-gaussian.py:76:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:41: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:46: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:51: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:56: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:77:61: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:78:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:79:21: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:25: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:30: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:40: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:45: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:51: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:65: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:67: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:69: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:71: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:82:73: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:92:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:94:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:98:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_mixed-gaussian.py:105:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_mixed-gaussian.py:106:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_mixed-gaussian.py:112:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_mixed-gaussian.py:120:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_mixed-gaussian.py:126:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_periodic.py:2:77: W291 trailing whitespace +./tests/dataprob/test_integration/test_periodic.py:4:79: W291 trailing whitespace +./tests/dataprob/test_integration/test_periodic.py:5:75: W291 trailing whitespace +./tests/dataprob/test_integration/test_periodic.py:6:11: W291 trailing whitespace +./tests/dataprob/test_integration/test_periodic.py:16:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_periodic.py:16:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:17:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_periodic.py:22:5: E303 too many blank lines (2) +./tests/dataprob/test_integration/test_periodic.py:22:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:22:33: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:22:38: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:25:30: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_periodic.py:26:26: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_periodic.py:27:25: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_periodic.py:32:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:32:34: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:33:33: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:33:68: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:33:72: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:38:47: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_periodic.py:41:63: W291 trailing whitespace +./tests/dataprob/test_integration/test_periodic.py:42:31: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:43:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:44:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:45:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:47:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:48:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:50:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:51:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:61:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_periodic.py:63:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:67:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_periodic.py:74:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_periodic.py:75:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_periodic.py:81:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_periodic.py:89:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_periodic.py:95:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_polynomial.py:2:47: W291 trailing whitespace +./tests/dataprob/test_integration/test_polynomial.py:12:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_polynomial.py:12:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:13:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:17:36: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:17:40: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:17:44: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:17:48: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:17:52: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:17:61: W291 trailing whitespace +./tests/dataprob/test_integration/test_polynomial.py:18:11: E111 indentation is not a multiple of 4 +./tests/dataprob/test_integration/test_polynomial.py:18:11: E117 over-indented +./tests/dataprob/test_integration/test_polynomial.py:19:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:20:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:21:17: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_polynomial.py:21:20: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:22:17: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_polynomial.py:22:20: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:23:17: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_polynomial.py:23:20: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:24:17: E128 continuation line under-indented for visual indent +./tests/dataprob/test_integration/test_polynomial.py:24:20: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:25:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:28:24: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:28:27: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:29:40: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:29:79: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:29:89: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:37:43: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_polynomial.py:38:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:47:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:49:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:53:32: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_polynomial.py:60:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_polynomial.py:61:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_polynomial.py:67:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_polynomial.py:75:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_polynomial.py:81:39: W292 no newline at end of file +./tests/dataprob/test_integration/test_random.py:2:78: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:3:78: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:11:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/test_integration/test_random.py:11:22: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:12:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_random.py:13:77: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:14:26: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:14:35: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:16:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_random.py:18:22: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_random.py:21:36: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:21:44: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:22:42: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:22:56: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:24:1: W293 blank line contains whitespace +./tests/dataprob/test_integration/test_random.py:26:31: E231 missing whitespace after ':' +./tests/dataprob/test_integration/test_random.py:33:16: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:35:18: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:37:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:38:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:47:38: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:48:37: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:50:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:51:34: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:54:13: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:61:16: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:63:18: W291 trailing whitespace +./tests/dataprob/test_integration/test_random.py:65:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:66:23: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:75:38: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:76:37: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:78:35: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:79:34: E231 missing whitespace after ',' +./tests/dataprob/test_integration/test_random.py:83:1: E303 too many blank lines (3) +./tests/dataprob/test_integration/test_random.py:90:1: W391 blank line at end of file +./tests/dataprob/test_package.py:4:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/util/test_check.py:11:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/util/test_check.py:13:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:13:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:13:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:13:40: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:13:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:17:26: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:17:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:17:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:17:43: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:22: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:26: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:29: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:34: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:43: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:48: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:67: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:73: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:76: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:82: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:21:86: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:24:13: F841 local variable 'value' is assigned to but never used +./tests/dataprob/util/test_check.py:32:22: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:55: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:61: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:32:70: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:38:26: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:38:33: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:38:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:38:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:43:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:46:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:46:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:48:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:48:48: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:52:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:55:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:55:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:57:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:57:48: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:62:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:63:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:66:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:70:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:74:25: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:74:46: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:78:1: E303 too many blank lines (3) +./tests/dataprob/util/test_check.py:83:22: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:55: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:61: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:70: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:74: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:81: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:83:88: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:89:22: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:89:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:89:27: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:89:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:94:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:97:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:97:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:98:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:99:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:99:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:101:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:101:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:103:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:103:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:107:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:110:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:110:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:112:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:112:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:114:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:114:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:116:24: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:116:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:119:1: C901 'test_check_array' is too complex (15) +./tests/dataprob/util/test_check.py:119:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/util/test_check.py:120:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:121:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:123:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:124:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:125:46: W291 trailing whitespace +./tests/dataprob/util/test_check.py:126:26: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:126:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:126:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:128:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:130:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:133:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:133:33: E231 missing whitespace after ':' +./tests/dataprob/util/test_check.py:133:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:133:41: E231 missing whitespace after ':' +./tests/dataprob/util/test_check.py:133:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:133:48: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:133:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:135:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:137:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:139:36: W291 trailing whitespace +./tests/dataprob/util/test_check.py:140:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:140:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:140:48: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:142:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:143:34: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:144:34: E702 multiple statements on one line (semicolon) +./tests/dataprob/util/test_check.py:144:34: E231 missing whitespace after ';' +./tests/dataprob/util/test_check.py:144:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:146:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:148:40: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:151:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:151:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:151:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:153:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:158:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:161:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:161:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:161:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:163:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:167:50: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:169:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:171:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:171:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:171:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:173:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:179:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:181:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:181:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:182:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:182:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:183:28: E127 continuation line over-indented for visual indent +./tests/dataprob/util/test_check.py:183:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:183:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:185:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:188:57: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:190:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:193:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:193:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:194:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:194:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:195:28: E127 continuation line over-indented for visual indent +./tests/dataprob/util/test_check.py:195:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:195:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:197:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:200:54: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:202:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:205:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:205:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:206:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:206:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:207:28: E127 continuation line over-indented for visual indent +./tests/dataprob/util/test_check.py:207:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:207:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:209:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:212:57: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:214:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:217:13: E303 too many blank lines (2) +./tests/dataprob/util/test_check.py:218:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:218:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:219:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:219:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:220:28: E127 continuation line over-indented for visual indent +./tests/dataprob/util/test_check.py:220:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:220:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:222:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:225:54: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:227:44: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:230:13: E303 too many blank lines (2) +./tests/dataprob/util/test_check.py:231:25: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:231:28: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:231:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:231:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:231:43: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:233:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:234:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:234:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:235:29: E128 continuation line under-indented for visual indent +./tests/dataprob/util/test_check.py:235:33: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:235:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:236:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:236:42: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:238:38: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:246:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:246:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:247:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:249:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:250:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:252:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:252:33: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:254:30: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:254:33: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:255:1: W293 blank line contains whitespace +./tests/dataprob/util/test_check.py:256:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:256:34: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:258:31: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:258:34: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:261:27: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:261:29: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:261:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:262:32: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:262:35: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:262:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_check.py:264:1: W391 blank line at end of file +./tests/dataprob/util/test_read_spreadsheet.py:8:1: E302 expected 2 blank lines, found 1 +./tests/dataprob/util/test_read_spreadsheet.py:18:30: E231 missing whitespace after ':' +./tests/dataprob/util/test_read_spreadsheet.py:18:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:18:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:19:31: E231 missing whitespace after ':' +./tests/dataprob/util/test_read_spreadsheet.py:19:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:19:41: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:20:24: E265 block comment should start with '# ' +./tests/dataprob/util/test_read_spreadsheet.py:21:24: E265 block comment should start with '# ' +./tests/dataprob/util/test_read_spreadsheet.py:22:24: E265 block comment should start with '# ' +./tests/dataprob/util/test_read_spreadsheet.py:23:24: E265 block comment should start with '# ' +./tests/dataprob/util/test_read_spreadsheet.py:24:31: E231 missing whitespace after ':' +./tests/dataprob/util/test_read_spreadsheet.py:24:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:24:43: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:27:5: E303 too many blank lines (2) +./tests/dataprob/util/test_read_spreadsheet.py:30:1: W293 blank line contains whitespace +./tests/dataprob/util/test_read_spreadsheet.py:31:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:33:21: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:34:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:36:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:36:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:36:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:37:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:39:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:39:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:39:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:40:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:42:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:42:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:42:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:43:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:43:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:43:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:43:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:45:51: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:45:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:45:63: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:46:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:46:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:46:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:46:56: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:51:1: W293 blank line contains whitespace +./tests/dataprob/util/test_read_spreadsheet.py:52:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:54:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:55:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:57:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:57:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:57:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:58:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:60:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:60:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:60:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:61:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:63:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:63:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:63:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:64:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:64:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:64:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:64:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:66:51: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:66:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:66:63: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:67:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:67:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:67:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:67:56: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:70:5: E303 too many blank lines (2) +./tests/dataprob/util/test_read_spreadsheet.py:73:1: W293 blank line contains whitespace +./tests/dataprob/util/test_read_spreadsheet.py:74:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:76:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:77:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:79:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:79:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:79:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:80:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:82:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:82:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:82:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:83:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:85:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:85:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:85:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:86:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:86:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:86:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:86:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:88:51: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:88:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:88:63: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:89:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:89:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:89:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:89:56: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:94:1: W293 blank line contains whitespace +./tests/dataprob/util/test_read_spreadsheet.py:95:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:97:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:98:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:100:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:100:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:100:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:101:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:103:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:103:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:103:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:104:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:106:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:106:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:106:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:107:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:107:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:107:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:107:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:109:51: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:109:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:109:63: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:110:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:110:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:110:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:110:56: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:117:1: W293 blank line contains whitespace +./tests/dataprob/util/test_read_spreadsheet.py:118:37: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:120:21: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:121:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:123:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:123:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:123:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:124:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:126:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:126:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:126:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:127:20: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:129:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:129:59: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:129:64: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:130:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:130:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:130:53: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:130:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:132:51: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:132:58: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:132:63: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:133:36: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:133:39: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:133:52: E231 missing whitespace after ',' +./tests/dataprob/util/test_read_spreadsheet.py:133:56: E231 missing whitespace after ',' +25 C901 'Fitter.append_samples' is too complex (12) +1 E111 indentation is not a multiple of 4 +2 E114 indentation is not a multiple of 4 (comment) +2 E117 over-indented +2 E122 continuation line missing indentation or outdented +55 E127 continuation line over-indented for visual indent +46 E128 continuation line under-indented for visual indent +27 E222 multiple spaces after operator +1 E225 missing whitespace around operator +3801 E231 missing whitespace after ',' +15 E261 at least two spaces before inline comment +3 E262 inline comment should start with '# ' +7 E265 block comment should start with '# ' 1 E266 too many leading '#' for block comment -4 E301 expected 1 blank line, found 0 -77 E302 expected 2 blank lines, found 1 -34 E303 too many blank lines (2) -1 E306 expected 1 blank line before a nested definition, found 0 -2 E401 multiple imports on one line -2 E501 line too long (129 > 127 characters) +173 E302 expected 2 blank lines, found 1 +97 E303 too many blank lines (2) +7 E306 expected 1 blank line before a nested definition, found 0 +4 E701 multiple statements on one line (colon) 1 E702 multiple statements on one line (semicolon) -3 E712 comparison to False should be 'if cond is False:' or 'if not cond:' +1 E711 comparison to None should be 'if cond is None:' +1 E712 comparison to True should be 'if cond is True:' or 'if cond:' 1 E714 test for object identity should be 'is not' -4 E731 do not assign a lambda expression, use a def -20 F401 '.fitters.MLFitter' imported but unused -4 F541 f-string is missing placeholders -1 F811 redefinition of unused 'test_stdev_getter' from line 294 -4 F841 local variable 'extra_fake_tests' is assigned to but never used -189 W291 trailing whitespace -1 W292 no newline at end of file -199 W293 blank line contains whitespace -1 W391 blank line at end of file -2076 +17 F401 '.fitters.setup.setup' imported but unused +17 F541 f-string is missing placeholders +3 F841 local variable 'patterns' is assigned to but never used +841 W291 trailing whitespace +48 W292 no newline at end of file +878 W293 blank line contains whitespace +9 W391 blank line at end of file +6086 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 58a84ba..4c3c4bc 100644 --- a/reports/junit/junit.xml +++ b/reports/junit/junit.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/run_all_tests.sh b/run_all_tests.sh index 39dbc4c..098f1dc 100755 --- a/run_all_tests.sh +++ b/run_all_tests.sh @@ -32,7 +32,7 @@ sleep 1 genbadge coverage sleep 1 -#wget https://github.com/harmsm/topiary/actions/workflows/python-app.yml/badge.svg -O ghwf.svg -#wget https://readthedocs.org/projects/topiary-asr/badge/?version=latest -O rtd.svg +#wget https://github.com/harmslab/dataprob/actions/workflows/python-app.yml/badge.svg -O ghwf.svg +#wget https://readthedocs.org/projects/dataprob/badge/?version=latest -O rtd.svg mv *.svg docs/badges diff --git a/src/dataprob/__init__.py b/src/dataprob/__init__.py index 25742fb..e69b9bd 100644 --- a/src/dataprob/__init__.py +++ b/src/dataprob/__init__.py @@ -1,12 +1,10 @@ __description__ = \ """ -Fitters for doing fits with likelihood functions. +Key public functions and methods for dataprob library. """ -__author__ = "Michael J. Harms" -__date__ = "2017-05-09" -from .fitters import MLFitter -from .fitters import BootstrapFitter -from .fitters import BayesianFitter -from .model_wrapper import ModelWrapper -from .fit_param import FitParameter +from .fitters.setup import setup +from .plot.plot_corner import plot_corner +from .plot.plot_summary import plot_summary + +from .__version__ import __version__ \ No newline at end of file diff --git a/src/dataprob/__version__.py b/src/dataprob/__version__.py index dfd69f9..1427525 100644 --- a/src/dataprob/__version__.py +++ b/src/dataprob/__version__.py @@ -1,3 +1,7 @@ -VERSION = (0, 2, 0) +""" +Version string. +""" + +VERSION = (0, 9, 0) __version__ = '.'.join(map(str, VERSION)) diff --git a/src/dataprob/fit_param.py b/src/dataprob/fit_param.py deleted file mode 100644 index ef84c8b..0000000 --- a/src/dataprob/fit_param.py +++ /dev/null @@ -1,449 +0,0 @@ -""" -Class for holding fit parameters, including guesses, values, ranges, etc. -""" - -import numpy as np - -import warnings - -from dataprob.check import check_bool -from dataprob.check import check_float - -_INFINITY_PROXY = 1e9 - -def _guess_setter_from_bounds(bounds): - """ - Find reasonable guesses from bounds. - - Parameters - ---------- - bounds : numpy.ndarray - array with two entries corresponding to lower and upper bounds. because - this is private, it assumes bounds[0] < bounds[1]. - - Returns - ------- - guess : float - parameter guess consistent with these bounds - """ - - # Copy bounds because we will edit - bounds = np.array(bounds,dtype=float).copy() - - # Approximate infinities as a moderately large, finite number - if np.isinf(bounds[0]): - bounds[0] = -_INFINITY_PROXY - - if np.isinf(bounds[1]): - bounds[1] = _INFINITY_PROXY - - # Lower bound is 0, return upper_bound/2 - if bounds[0] == 0: - guess = bounds[1]/2 - return guess - - # Upper bound is 0, return lower_bound/2 - if bounds[1] == 0: - guess = bounds[0]/2 - return guess - - lower_sign = bounds[0]/np.abs(bounds[0]) - upper_sign = bounds[1]/np.abs(bounds[1]) - - # If the bounds have the same sign, use geometric mean. Otherwise, - # use arithmetic mean - if upper_sign == lower_sign: - log_sum = np.sum(np.log(np.abs(bounds))) - guess = upper_sign * np.exp(log_sum/2) - else: - guess = np.mean(bounds) - - return guess - - -class FitParameter: - """ - Class for storing and manipulating fit parameters. - - Fit control attributes - ---------------------- - - These attributes can be set on __init__ or directly via instance.xxx = value. - If any of these values are set, the fit result (stored in .value) is wiped - out to avoid inconsistency between the fit control parameters and the - resulting fit. - - + .guess: (float) guess value for fit - + .fixed: (bool) whether to float parameter or not - + .bounds: [float,float] lower and upper bounds for parameter - + .prior: [float,float] mean and standard deviation of gaussian prior - - Fit result attributes - --------------------- - - These attributes can only be updated using the load_fit_result method, which - takes a fitter instance as an argument. - - + .value: (float) Current value of parameter. - Before the fit is run, this will be the .guess value. After - the fit is run, this will be the parameter estimate. - + .stdev: (float) standard deviation on the estimate of the fit parameter. - Before the fit is run, this will be None. - + .ninetyfive: (float,float) top and bottom of the 95% confidence interval. - Before the fit is run, this will be None. - + .is_fit_result: (bool) whether or not the parameter contains the results - of a fit. - - Metadata attributes - ------------------- - - This attribute can be set on __init__ or directly via instance.name = value. - The value is used for convenience only and is ignored by other methods. - - + .name: (str) name of fit parameter - """ - - def __init__(self,name,guess=None,fixed=False,bounds=None,prior=None): - """ - Initialize class. - - Parameters - ---------- - name : str - name of parameter - guess : float, optional. - parameter guess. If None, the guess will be determined in the - following way. 1) If prior is given, the guess will be set to the - mean of the prior. 2) If no prior is given and lower and upper - bounds have the same sign, the guess will be placed at the geometric - mean of the two bounds. 3) If no prior is given and lower and upper - bounds have different signs, the guess is placed at the arithmetic - mean of the two bounds. 4) If no prior or bounds are given, the - guess will be set to 0.0. - fixed : bool - whether or not the parameter is fixed - bounds : iterable - bounds (inclusive) on fit for parameter (list-like, 2 floats). If - not given, bounds will be set to (-np.inf,np.inf). Nones are - interpreted as infinities: (None,5) would give bounds of (-np.inf,5) - prior : iterable - prior on parameter (list-like, 2 floats). The two values represent - the (mean,stdev) for a Gaussian prior on that parameter. The second - value must be positive. Infinities are not allowed. If None, - the prior will be set to (np.nan,np.nan), causing a Bayesian - inference to use a uniform prior. - """ - - # Setting must be in this order. If no guess is specified, the guess - # is made first based on the prior, then (if not specified) based on - # the bounds. - self._is_fit_result = False - self.bounds = bounds - self.prior = prior - self.guess = guess - - # Simple terms - self.name = name - self.fixed = fixed - - #-------------------------------------------------------------------------- - # parameter name - - @property - def name(self): - """ - Name of the parameter. - """ - - try: - return self._name - except AttributeError: - return None - - @name.setter - def name(self,name): - self._name = str(name) - - - #-------------------------------------------------------------------------- - # parameter guess - - @property - def guess(self): - """ - Guess for the parameter. - """ - - try: - return self._guess - except AttributeError: - return None - - @guess.setter - def guess(self,guess): - f""" - Set the guess. If None, the guess is assigned using the following. 1) - If prior is specified, the mean of the prior is used as the guess. 2) - If bounds are specified and both have the same sign, the guess becomes - the to arithmetic mean of the bounds. 3) If the bounds are specified and - have different signs, use the geometric mean of the bounds. (For #2 and - #3, if one of the bounds is infinite, set that bound to {_INFINITY_PROXY} - for the purpose of the mean calculation. 4) If no prior or bound is - specified, the guess is set to 0.0. - """ - - if guess is None: - if not np.isnan(self.prior[0]): - guess = self.prior[0] - else: - guess = _guess_setter_from_bounds(self.bounds) - - guess = check_float(value=guess, - variable_name="guess") - - # Make sure the guess is within bounds - if guess > self.bounds[1] or guess < self.bounds[0]: - err = f"guess ({guess}) outside bounds ({self.bounds[0],self.bounds[1]})\n" - raise ValueError(err) - - self._guess = guess - self._clear_fit_result() - - #-------------------------------------------------------------------------- - # parameter fixed-ness. - - @property - def fixed(self): - """ - Whether or not the parameter if fixed. - """ - - return self._fixed - - @fixed.setter - def fixed(self,bool_value): - """ - Fix or unfix the parameter. - """ - - self._fixed = check_bool(value=bool_value, - variable_name="fixed") - self._clear_fit_result() - - #-------------------------------------------------------------------------- - # bounds for fit. - - @property - def bounds(self): - """ - Fit bounds. Either list of bounds or None. - """ - - try: - return self._bounds - except AttributeError: - return None - - @bounds.setter - def bounds(self,bounds): - """ - Set fit bounds. - """ - - err_msg = \ - """ - - Bounds should be list-like, with two floats. The first entry is the - lower bound; the second is the upper bounds. When doing the fit, bounds - are inclusive. - - + The upper bound must be larger than the lower bound. - + If bounds == None, the bounds are set to [-np.inf,np.inf]. - + np.inf values are allowed, but np.nan is not. - - """ - - if bounds is None: - bounds = np.array((-np.inf,np.inf)) - - try: - bounds = np.array(bounds,dtype=float) - except Exception as e: - raise ValueError(err_msg) from e - - if len(bounds.shape) == 0 or bounds.shape[0] != 2: - raise ValueError(err_msg) - - num_nan = np.sum(np.isnan(bounds)) - if num_nan > 0: - raise ValueError(err_msg) - - # Set any bounds very close to zero to zero. - equiv_to_zero = np.finfo(bounds.dtype).resolution - bounds[np.abs(bounds) < equiv_to_zero] = 0.0 - - # Make sure upper bound is above the lower bound - if bounds[1] <= bounds[0]: - raise ValueError(err_msg) - - self._bounds = bounds - - # Shift existing guess if necessary - if self.guess is not None: - - if self.guess < bounds[0]: - new_guess = bounds[0] - elif self.guess > bounds[1]: - new_guess = bounds[1] - else: - new_guess = None - - if new_guess is not None: - - w = f"The previous guess ({self.guess}) is outside the new\n" - w += f"bounds ({bounds}). The guess has been updated to\n" - w += f"'{new_guess}'.\n" - warnings.warn(w,UserWarning) - - self.guess = new_guess - - self._clear_fit_result() - - #-------------------------------------------------------------------------- - # priors for fit. - - @property - def prior(self): - """ - Parameter prior (mean, std). Either numpy array of two elements or None. - """ - - try: - return self._prior - except AttributeError: - return None - - @prior.setter - def prior(self,prior): - """ - Set the prior. - """ - - err_msg = \ - """ - - prior should be list-like, with two floats. The first entry is the - mean of a gaussian prior; the second is the standard deviation. - - + If prior == None, the prior is set to [np.nan,np.nan], which will - cause a Bayesian inference to use uniform priors - + The standard deviation must be positive. - + np.nan values are allowed, but np.inf is not. - - """ - - if prior is None: - prior = np.nan*np.ones(2,dtype=float) - - # Can be coerced to float array - try: - prior = np.array(prior,dtype=float) - except Exception as e: - raise ValueError(err_msg) from e - - # two elements - if len(prior.shape) == 0 or prior.shape[0] != 2: - raise ValueError(err_msg) - - # no infinities allowed - num_inf = np.sum(np.isinf(prior)) - if num_inf > 0: - raise ValueError(err_msg) - - # stdev must be >= 0 - if prior[1] <= 0: - raise ValueError(err_msg) - - self._prior = prior - self._clear_fit_result() - - - #-------------------------------------------------------------------------- - # Properties that are set by the fitter, but not the user. - - @property - def value(self): - """ - Value of the parameter. - """ - - try: - return self._value - except AttributeError: - return None - - - @property - def stdev(self): - """ - Standard deviation on the parameter. - """ - - try: - return self._stdev - except AttributeError: - return None - - @property - def ninetyfive(self): - """ - 95% confidence interval on the parameter. - """ - - try: - return self._ninetyfive - except AttributeError: - return None - - @property - def is_fit_result(self): - """ - Whether the value shown is the result of a fit. - """ - - return self._is_fit_result - - - def load_fit_result(self,fitter,param_number): - """ - Update the standard deviation, ninetyfive, parameter value, from a - successful fit. - - Parameters - ---------- - fitter : dataprob.Fitter - fit with results - param_number : int - number corresponding to this parameter in the fit parameter vector. - """ - - if fitter.success: - self._value = fitter.estimate[param_number] - self._stdev = fitter.stdev[param_number] - if fitter.ninetyfive is not None: - self._ninetyfive = np.array([fitter.ninetyfive[0,param_number], - fitter.ninetyfive[1,param_number]]) - else: - self._ninetyfive = np.array([np.nan,np.nan]) - self._is_fit_result = True - - def _clear_fit_result(self): - """ - Clear the fit result. Called when attributes controlling the fit - are modified to avoid inconsistency. - """ - - self._value = self.guess - self._stdev = None - self._ninetyfive = None - self._is_fit_result = False diff --git a/src/dataprob/fitters/__init__.py b/src/dataprob/fitters/__init__.py index 8e266a3..0da0b68 100644 --- a/src/dataprob/fitters/__init__.py +++ b/src/dataprob/fitters/__init__.py @@ -1,4 +1,3 @@ - -from .ml import MLFitter -from .bootstrap import BootstrapFitter -from .bayesian import BayesianFitter +""" +Code for performing regression and sampling analyses on model parameters. +""" \ No newline at end of file diff --git a/src/dataprob/fitters/base.py b/src/dataprob/fitters/base.py index fc3ab50..19caecb 100644 --- a/src/dataprob/fitters/base.py +++ b/src/dataprob/fitters/base.py @@ -2,43 +2,80 @@ Fitter base class allowing different classes of fits. """ +from dataprob.util.check import check_array +from dataprob.util.check import check_float +from dataprob.util.check import check_int + +from dataprob.model_wrapper.model_wrapper import ModelWrapper +from dataprob.model_wrapper.wrap_function import wrap_function +from dataprob.util.read_spreadsheet import read_spreadsheet + import numpy as np import pandas as pd -import corner - -import re -import inspect import pickle import os +import copy + +def _pretty_zeropad_str(N): + """ + Make a string zero-pad based on the number of digits in a number. + """ -import dataprob -from dataprob.check import check_array + num_digits = len(f"{N}") + 1 + fmt_string = "s{:0" + f"{num_digits}" + "d}" + return fmt_string class Fitter: """ Base class for fits/analyses using a dataprob function. """ - def __init__(self): - """ - Init function for the class. + def __init__(self, + some_function, + fit_parameters=None, + non_fit_kwargs=None, + vector_first_arg=False): """ + Initialize the fitter. - self._num_obs = None - self._num_params = None - - # Keep track of whether or not the model is a ModelWrapper instance - # (which can be used for more powerful fit/parameter options) - self._model_is_model_wrapper = False + Parameters + ---------- + some_function : callable + A function that takes at least one argument and returns a float numpy + array. Compare the outputs of this function against y_obs when doing + the analysis. + fit_parameters : list, dict, str, pandas.DataFrame; optional + fit_parameters lets the user specify information about the parameters + in the fit. + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for some_function that should not + be fit but need to be specified to non-default values. + vector_first_arg : bool, default=False + If True, the first argument of the function is taken as a vector of + parameters to fit. All other arguments to some_function are treated as + non-fittable parameters. fit_parameters must then specify the names of + each vector element. + """ + + # Load the model. Copy in ModelWrapper if passed in; otherwise, create + # from arguments. + if issubclass(type(some_function),ModelWrapper): + self._model = copy.deepcopy(some_function) + else: + self._model = wrap_function(some_function=some_function, + fit_parameters=fit_parameters, + non_fit_kwargs=non_fit_kwargs, + vector_first_arg=vector_first_arg) + + # Initialize the fit df now that we have a model + self._initialize_fit_df() # This is set to True after a fit is run but is reset to False by # the setter functions like guesses, etc. that would influence the # fit results. self._fit_has_been_run = False - self._fit_type = "" - def _sanity_check(self,call_string,attributes_to_check): """ Do a sanity check before doing model calculations. @@ -58,134 +95,96 @@ def _sanity_check(self,call_string,attributes_to_check): except KeyError: err = f"'{a}' must be set before {call_string}\n" raise RuntimeError(err) + + def _process_obs_args(self, + y_obs, + y_std): + """ + Process the arguments the user sends in defining the observable (y_obs + and y_std). Make sure they are consistent with each other. + """ + + # record y_obs if specified + to_df = {} + if y_obs is not None: + to_df["y_obs"] = y_obs + + # record y_std if specified + if y_std is not None: + to_df["y_std"] = y_std + + # If both specified, turn into dataframe and store as data_df. Setter + # validates. + if len(to_df) == 2: + self.data_df = pd.DataFrame(to_df) + + # If one specified, store in the existing data_df. data_df setter takes + # care of validation + elif len(to_df) == 1: + + data_df = self.data_df + for column in to_df: + data_df[column] = to_df[column] + self.data_df = data_df + # else here for completeness -- do not do anything if y_obs and y_std + # are both zero. + else: + pass + + def fit(self, - model=None, - guesses=None, y_obs=None, - bounds=None, - priors=None, - names=None, - y_stdev=None, + y_std=None, **kwargs): """ Fit the parameters. Parameters ---------- - - model : callable - model to fit. Model should take "guesses" as its only argument. - If model is a ModelWrapper instance, arguments related to the - parameters (guess, bounds, names) will automatically be - filled in. - guesses : array of floats - guesses for parameters to be optimized. - y_obs : array of floats - observations in an concatenated array - bounds : list, optional - list of two lists containing lower and upper bounds. If None, - bounds are set to -np.inf and np.inf - priors : list, optional - list of two lists containing the mean and standard deviation of - gaussian priors. None entries use uniform priors. If whole argument - is None, use uniform priors for all parameters. - names : array of str - names of parameters. If None, parameters assigned names p0,p1,..pN - y_stdev : array of floats or None - standard deviation of each observation. if None, each observation - is assigned an error of 1. + y_obs : numpy.ndarray + observations in a numpy array of floats that matches the shape + of the output of some_function set when initializing the fitter. + nan values are not allowed. y_obs must either be specified here + or in the data_df dataframe. + y_std : numpy.ndarray + standard deviation of each observation. nan values are not allowed. + If not specified, all points are assigned an uncertainty of + 0.1*mean(y_obs). **kwargs : any remaining keyword arguments are passed as **kwargs to - core engine (optimize.least_squares or emcee.EnsembleSampler) + the core engine (optimize.least_squares or emcee.EnsembleSampler) """ - # Record model, check for preloaded model, or fail. - if model is not None: - self.model = model - else: - if self.model is None: - err = "model must be specified before fit\n" - raise RuntimeError(err) - - # Record guesses, grab from ModelWrapper model, or fail. - if guesses is not None: - self.guesses = guesses - else: - if self.guesses is None: - err = "parameter guesses must be specified before fit\n" - raise RuntimeError(err) - - # Record bounds, grab from ModelWrapper model, or make infinite - if bounds is not None: - self.bounds = bounds - else: - if self.bounds is None: - tmp = np.ones(len(self.guesses)) - self.bounds = [-np.inf*tmp,np.inf*tmp] - - # Record priors, grab from ModelWrapper model, or make infinite - if priors is not None: - self.priors = priors - else: - if self.priors is None: - self.priors = np.nan*np.ones((2,len(self.guesses)), - dtype=float) - - # Record names, grab from ModelWrapper model, or use default - if names is not None: - self.names = names - else: - if self.names is None: - self.names = ["p{}".format(i) for i in range(len(self.guesses))] - - # Record y_obs, check for preloaded, or fail - if y_obs is not None: - self.y_obs = y_obs - else: - if self.y_obs is None: - err = "y_obs must be specified before fit\n" - raise RuntimeError(err) - - # Record y_stdev, check for preloaded, or use default - if y_stdev is not None: - self.y_stdev = y_stdev - else: - if self.y_stdev is None: - self.y_stdev = np.ones(len(self.y_obs),dtype=float) + # Load y_obs and y_std into attributes + self._process_obs_args(y_obs=y_obs, + y_std=y_std) + # Final check that everything is loaded + self._sanity_check("fit can be done",["model","y_obs","y_std"]) + # No fit has been run self._success = None - self._sanity_check("fit can be done",["model","y_obs","y_stdev"]) - - # Make sure that there is at least one adjustable parameter - if len(self.guesses) < 1: - err = "Cannot do fit with no adjustable parameters\n" - raise RuntimeError(err) + # Finalize model + self._model.finalize_params() + # Run the fit self._fit(**kwargs) - # Load the fit results into the model_wrapper - if self._model_is_model_wrapper: - self._model.load_fit_result(self) - self._fit_has_been_run = True def _fit(self,**kwargs): """ - Should be redefined in subclass. + Should be redefined in subclass. This function should: + + 1. Update self._fit_result in whatever way makes sense for the fit. + 2. Update self._success with True or False, depending on success. + 3. Call self._update_fit_df """ raise NotImplementedError("should be implemented in subclass\n") - def _update_estimates(self): - """ - Should be redefined in subclass. - """ - raise NotImplementedError("should be implemented in subclass\n") - - def _unweighted_residuals(self,param): """ Private function calculating residuals with no error checking. @@ -201,8 +200,8 @@ def _unweighted_residuals(self,param): difference between observed and calculated values """ - y_calc = self.model(param) - return self._y_obs - y_calc + y_calc = self._model.fast_model(param) + return y_calc - self._y_obs def unweighted_residuals(self,param): """ @@ -226,10 +225,6 @@ def unweighted_residuals(self,param): expected_shape=(self.num_params,), expected_shape_names="(num_param,)") - # This call should finalize the number of parameters if not already set - if self.num_params is None: - self._num_params = len(param) - return self._unweighted_residuals(param) def _weighted_residuals(self,param): @@ -248,12 +243,12 @@ def _weighted_residuals(self,param): standard deviation """ - y_calc = self.model(param) - return (self.y_obs - y_calc)/self.y_stdev + y_calc = self._model.fast_model(param) + return (y_calc - self._y_obs)/self._y_std def weighted_residuals(self,param): """ - Calculate weighted residuals: (y_obs - y_calc)/y_stdev + Calculate weighted residuals: (y_obs - y_calc)/y_std Parameters ---------- @@ -267,17 +262,13 @@ def weighted_residuals(self,param): standard deviation """ - self._sanity_check("fit can be done",["model","y_obs","y_stdev"]) + self._sanity_check("fit can be done",["model","y_obs","y_std"]) param = check_array(value=param, variable_name="param", expected_shape=(self.num_params,), expected_shape_names="(num_param,)") - # This call should finalize the number of parameters if not already set - if self.num_params is None: - self._num_params = len(param) - return self._weighted_residuals(param) def _ln_like(self,param): @@ -295,9 +286,9 @@ def _ln_like(self,param): log likelihood """ - y_calc = self.model(param) - sigma2 = self._y_stdev**2 - return -0.5*(np.sum((self._y_obs - y_calc)**2/sigma2 + np.log(sigma2))) + y_calc = self._model.fast_model(param) + sigma2 = self._y_std**2 + return -0.5*(np.sum((y_calc - self._y_obs)**2/sigma2 + np.log(2*np.pi*sigma2))) def ln_like(self,param): """ @@ -314,435 +305,176 @@ def ln_like(self,param): log likelihood """ - self._sanity_check("fit can be done",["model","y_obs","y_stdev",]) + self._sanity_check("fit can be done",["model","y_obs","y_std",]) param = check_array(value=param, variable_name="param", expected_shape=(self.num_params,), expected_shape_names="(num_param,)") - # This call should finalize the number of parameters if not already set - if self.num_params is None: - self._num_params = len(param) - return self._ln_like(param) + @property def model(self): """ - Model to use for calculating y_calc. The model should either be an - instance of dataprob.ModelWrapper OR a function that takes param (a 1D - numpy array) as its only argument and returns y_calc (a 1D numpy array) - as its only returned value. + Model to use for calculating y_calc given parameters. """ - try: - if self._model_is_model_wrapper: - return self._model.model - else: - return self._model - except AttributeError: - return None - - @model.setter - def model(self,model): - - # If this is a ModelWrapper instance, grab the model method rather than - # the model instance for the check below. - if isinstance(model,dataprob.model_wrapper.ModelWrapper): - model = model.model - - has_err = False - try: - if not inspect.isfunction(model) and not inspect.ismethod(model): - has_err = True - if len(inspect.signature(model).parameters) < 1: - has_err = True - - except TypeError: - has_err = True - - if has_err: - err = "model must be a function that takes at least one argument\n" - raise ValueError(err) - - # If the model is a method of a ModelWrapper instance, record this so - # the Fitter object knows it can get guesses, bounds, and names from - # the ModelWrapper if necessary. - self._model_is_model_wrapper = False - try: - if model.__qualname__.startswith("ModelWrapper"): - - # If this is a model wrapper, we can check for consistency - # between the number of model parameters in the model vs. - # what has been pre-set in the model. - if self.num_params is not None: - if len(model.__self__.guesses) != self.num_params: - err = f"number of model parameters ({len(model.__self__.guesses)}) does\n" - err += f"not match the number of parameters in the Fitter ({self.num_params})\n" - raise ValueError(err) - - self._model_is_model_wrapper = True - - # We're going to store the ModelWrapper instance, not the - # method. - model = model.__self__ - - except AttributeError: - pass - - # Record the model - self._model = model - self._fit_has_been_run = False + return self._model.model + @property - def guesses(self): + def y_obs(self): """ - Guesses for fit parameters. + Observed y values for fit. """ - # Grab the guesses from the model wrapper in case they changed - if self._model_is_model_wrapper: - self._guesses = self._model.guesses - try: - return self._guesses + return self._y_obs except AttributeError: return None - @guesses.setter - def guesses(self,guesses): - - guesses = check_array(value=guesses, - variable_name="guesses", - expected_shape=(None,), - expected_shape_names="(num_param,)") - - if self.num_params is None: - self._num_params = guesses.shape[0] - - if guesses.shape[0] != self.num_params: - err = "guesses should be a numpy array the same length as the\n" - err += "number of guesses\n" - raise ValueError(err) - - self._guesses = guesses - - # Update the underlying guesses in each FitParameter instance - if self._model_is_model_wrapper: - for i, p in enumerate(self._model.position_to_param): - self._model.fit_parameters[p].guess = guesses[i] - - self._fit_has_been_run = False @property - def bounds(self): + def y_std(self): """ - Bounds for fit parameters. - - bounds must be a (2 x num_parameters) numpy array of floats with the - form: - - [[lower_0, lower_1, ..., lower_n], - [upper_0, upper_1, ..., upper_n]] - - np.inf values are allowed, indicating no bounds on that parameter. - np.nan are not allowed. + Estimated standard deviation on observed y values. """ - # Grab the bounds from the model wrapper in case they changed - if self._model_is_model_wrapper: - self._bounds = self._model.bounds - try: - return self._bounds + return self._y_std except AttributeError: return None - @bounds.setter - def bounds(self,bounds): - - bounds = check_array(value=bounds, - variable_name="bounds", - expected_shape=(2,None), - expected_shape_names="(2,num_param)") - - if self.num_params is None: - self._num_params = bounds.shape[1] - - if bounds.shape[1] != self.num_params: - doc = inspect.getdoc(Fitter.bounds) - err = f"incorrectly specified bounds. \n\n{doc}\n\n" - raise ValueError(err) - - self._bounds = bounds - - # Update the underlying guesses in each FitParameter instance - if self._model_is_model_wrapper: - for i, p in enumerate(self._model.position_to_param): - self._model.fit_parameters[p].bounds = bounds[:,i] - - self._fit_has_been_run = False - @property - def priors(self): + def param_df(self): """ - Gaussian priors to use for each parameter. - - priors must be a (2 x num_parameters) numpy array of floats with the - form: - - [[mean_0, mean_1, ..., mean_n], - [stdev_0, stdev_1, ..., stdev_n]] - - np.inf values are not allowed. np.nan entries indicate that uniform - priors should be used for that parameter. + Return a dataframe with fit parameters. """ - # Grab the priors from the model wrapper in case they changed - if self._model_is_model_wrapper: - self._priors = self._model.priors - - try: - return self._priors - except AttributeError: - return None - - @priors.setter - def priors(self,priors): + return self._model.param_df + + @param_df.setter + def param_df(self,param_df): + self._model.param_df = param_df + + @property + def data_df(self): - priors = check_array(value=priors, - variable_name="priors", - expected_shape=(2,None), - expected_shape_names="(2,num_param)") + out = {} - if self.num_params is None: - self._num_params = priors.shape[1] - - if priors.shape[1] != self.num_params: - doc = inspect.getdoc(Fitter.priors) - err = f"incorrectly specified priors. \n\n{doc}\n\n" - raise ValueError(err) - - if np.sum(np.isinf(priors)) > 0: - doc = inspect.getdoc(Fitter.priors) - err = f"priors cannot be infinite. \n\n{doc}\n\n" - raise ValueError(err) - - self._priors = priors - - # Update the underlying guesses in each FitParameter instance - if self._model_is_model_wrapper: - for i, p in enumerate(self._model.position_to_param): - self._model.fit_parameters[p].prior = priors[:,i] - - self._fit_has_been_run = False - - @property - def names(self): - """ - Parameter names for fit parameters. + y_obs = self.y_obs + if y_obs is not None: + out["y_obs"] = y_obs - Should be an array of unique strings the same length as the number of - parameters. - """ + y_std = self.y_std + if y_std is not None: + out["y_std"] = y_std - # Grab the bounds from the model wrapper in case they changed - if self._model_is_model_wrapper: - self._names = self._model.names + if self.success: + + estimate = np.array(self.fit_df.loc[self._model.unfixed_mask, + "estimate"],dtype=float).copy() + out["y_calc"] = self.model(estimate) + out["unweighted_residuals"] = self._unweighted_residuals(estimate) + out["weighted_residuals"] = self._weighted_residuals(estimate) - try: - return self._names - except AttributeError: - return None + return pd.DataFrame(out) - @names.setter - def names(self,names): + @data_df.setter + def data_df(self,data_df): - # If the user sends in a naked string, make it into a list of strings - if issubclass(type(names),str): - names = [names] + # Read dataframe + data_df = read_spreadsheet(data_df) - # Force to be an array of strings - names = np.array(names,dtype=str) - - if len(names) != len(set(names)): - doc = inspect.getdoc(Fitter.names) - err = f"parameter names must all be unique. \n\n{doc}\n\n" + # make sure it has y_obs and y_std + has_columns = np.sum(data_df.columns.isin(["y_obs","y_std"])) + if has_columns != 2: + err = "data_df must have both y_obs and y_std columns\n" raise ValueError(err) + + # Go through each column + for c in ["y_obs","y_std"]: - if self.num_params is not None: - if names.shape[0] != self.num_params: - doc = inspect.getdoc(Fitter.names) - err = f"length of names ({names.shape[0]}) must match the number of parameters ({self.num_params}) \n\n{doc}\n\n" + # start with the pandas caster to numeric as this is smart and + # robust + try: + data_df[c] = pd.to_numeric(data_df[c]) + except Exception as e: + err = f"Could not coerce all entries in the '{c}' column to float\n" + raise ValueError(err) from e + + # then do a direct cast to float + data_df[c] = data_df[c].astype(float) + + if np.sum(np.isnan(data_df[c])) > 0: + err = "y_obs and y_std must not contain nan\n" + raise ValueError(err) + + if np.sum(np.isinf(data_df[c])) > 0: + err = "y_obs and y_std must be finite\n" raise ValueError(err) - else: - self._num_params = names.shape[0] - - self._names = names - - # Update the underlying guesses in each FitParameter instance - if self._model_is_model_wrapper: - for i, p in enumerate(self._model.position_to_param): - self._model.fit_parameters[p].name = names[i] - - @property - def y_obs(self): - """ - Observed y values for fit. This should be a 1D numpy array of floats - the same length as the number of observations. - """ - - try: - return self._y_obs - except AttributeError: - return None - - @y_obs.setter - def y_obs(self,y_obs): - - y_obs = check_array(value=y_obs, - variable_name="y_obs", - expected_shape=(None,), - expected_shape_names="(num_obs,)") - - if self.num_obs is None: - self._num_obs = y_obs.shape[0] - if y_obs.shape[0] != self.num_obs: - doc = inspect.getdoc(Fitter.y_obs) - err = f"incorrectly specified y_obs. \n\n{doc}\n\n" + if np.sum(data_df["y_std"] <= 0) > 0: + err = "all y_std values must be >= 0\n" raise ValueError(err) - self._y_obs = y_obs + # Store y_obs and y_std + self._y_obs = data_df["y_obs"] + self._y_std = data_df["y_std"] + # new y_obs, fit has not been run yet self._fit_has_been_run = False @property - def y_stdev(self): + def non_fit_kwargs(self): """ - Estimated standard deviation on observed y values. This should be a 1D - numpy array of floats the same length as the number of observations. + Return a dictionary with the keyword arguments to pass to the function + that are not fit parameters. """ - - try: - return self._y_stdev - except AttributeError: - return None - - @y_stdev.setter - def y_stdev(self,y_stdev): - - y_stdev = check_array(value=y_stdev, - variable_name="y_stdev", - expected_shape=(None,), - expected_shape_names="(num_obs,)") - if self.num_obs is None: - self._num_obs = y_stdev.shape[0] - - if y_stdev.shape[0] != self.num_obs: - doc = inspect.getdoc(Fitter.y_stdev) - err = f"incorrectly specified y_stdev. \n\n{doc}\n\n" - raise ValueError(err) - - self._y_stdev = y_stdev - - self._fit_has_been_run = False - - - @property - def num_params(self): - """ - Number of fit parameters. - """ - - if self._model_is_model_wrapper: - return len(self._model.guesses) - - try: - return self._num_params - except AttributeError: - return None - - @property - def num_obs(self): - """ - Number of observations. - """ - - try: - return self._num_obs - except AttributeError: - return None - - @property - def estimate(self): - """ - Estimates of fit parameters. - """ + return self._model.non_fit_kwargs - try: - return self._estimate - except AttributeError: - return None + def _initialize_fit_df(self): - @property - def stdev(self): - """ - Standard deviations on estimates of fit parameters. - """ + df = pd.DataFrame({"name":self.param_df["name"]}) + df.index = df["name"] + df["estimate"] = np.nan + df["std"] = np.nan + df["low_95"] = np.nan + df["high_95"] = np.nan + df["guess"] = self.param_df["guess"] + df["fixed"] = self.param_df["fixed"] + df["lower_bound"] = self.param_df["lower_bound"] + df["upper_bound"] = self.param_df["upper_bound"] + df["prior_mean"] = self.param_df["prior_mean"] + df["prior_std"] = self.param_df["prior_std"] - try: - return self._stdev - except AttributeError: - return None + self._fit_df = df - @property - def ninetyfive(self): + def _update_fit_df(self): """ - Ninety-five perecent confidence intervals on the estimates. + Should be redefined in subclass. This function should update + self._fit_df. """ - try: - return self._ninetyfive - except AttributeError: - return None - - @property - def fit_result(self): - """ - Full fit results (will depend on exact fit type what is placed here). - """ - - try: - return self._fit_result - except AttributeError: - return None - - @property - def success(self): - """ - Whether the fit was successful. - """ - - try: - return self._success - except AttributeError: - return None + raise NotImplementedError("should be implemented in subclass\n") @property - def fit_info(self): + def fit_df(self): """ - Information about fit run. + Return the fit results as a dataframe. """ - return None - + return self._fit_df + @property def samples(self): """ - Samples of fit parameters. + Samples of fit parameters. If fit has been run and generated samples, + this will be a float numpy array with a shape (num_samples,num_param). + Otherwise, is None. """ try: @@ -750,143 +482,6 @@ def samples(self): except AttributeError: return None - @property - def fit_type(self): - """ - Fit type. - """ - return self._fit_type - - @property - def fit_df(self): - """ - Return the fit results as a dataframe. - """ - - if not self.success: - return None - - out_dict = {"param":[], - "estimate":[], - "stdev":[], - "low_95":[], - "high_95":[], - "guess":[], - "prior_mean":[], - "prior_std":[], - "lower_bound":[], - "upper_bound":[]} - - if self._model_is_model_wrapper: - - m = self._model - - out_dict["fixed"] = [] - for p in m.fit_parameters.keys(): - out_dict["param"].append(m.fit_parameters[p].name) - out_dict["estimate"].append(m.fit_parameters[p].value) - out_dict["fixed"].append(m.fit_parameters[p].fixed) - - if m.fit_parameters[p].fixed: - for col in ["stdev","low_95","high_95","guess", - "lower_bound","upper_bound", - "prior_mean","prior_std"]: - out_dict[col].append(None) - else: - out_dict["stdev"].append(m.fit_parameters[p].stdev) - - if m.fit_parameters[p].ninetyfive is not None: - out_dict["low_95"].append(m.fit_parameters[p].ninetyfive[0]) - out_dict["high_95"].append(m.fit_parameters[p].ninetyfive[1]) - else: - out_dict["low_95"].append(np.nan) - out_dict["high_95"].append(np.nan) - - out_dict["guess"].append(m.fit_parameters[p].guess) - out_dict["lower_bound"].append(m.fit_parameters[p].bounds[0]) - out_dict["upper_bound"].append(m.fit_parameters[p].bounds[1]) - out_dict["prior_mean"].append(m.fit_parameters[p].prior[0]) - out_dict["prior_std"].append(m.fit_parameters[p].prior[1]) - - else: - - for i in range(len(self.names)): - - out_dict["param"].append(self.names[i]) - out_dict["estimate"].append(self.estimate[i]) - out_dict["stdev"].append(self.stdev[i]) - - if self.ninetyfive is not None: - out_dict["low_95"].append(self.ninetyfive[0,i]) - out_dict["high_95"].append(self.ninetyfive[1,i]) - else: - out_dict["low_95"].append(np.nan) - out_dict["high_95"].append(np.nan) - - out_dict["guess"].append(self.guesses[i]) - out_dict["lower_bound"].append(self.bounds[0,i]) - out_dict["upper_bound"].append(self.bounds[1,i]) - out_dict["prior_mean"].append(self.priors[0,i]) - out_dict["prior_std"].append(self.priors[1,i]) - - return pd.DataFrame(out_dict) - - - def corner_plot(self,filter_params=("DUMMY_FILTER",),*args,**kwargs): - """ - Create a "corner plot" that shows distributions of values for each - parameter, as well as cross-correlations between parameters. - - Parameters - ---------- - filter_params : list-like - strings used to search parameter names. if the string matches, - the parameter is *excluded* from the plot. - """ - - # Don't return anything if this is the base class - if self.fit_type == "": - return None - - # If the user passes a string (instead of a list or tuple of patterns), - # convert it to a list up front. - if type(filter_params) is str: - filter_params = (filter_params,) - - skip_pattern = re.compile("|".join(filter_params)) - - s = self.samples - - # Make sure that fit actually returned samples. (Will fail, for example - # if Jacobian misbehaves in ML fit) - if len(s) == 0: - err = "\n\nFit did not produce samples for generation of a corner plot.\nCheck warnings.\n" - raise RuntimeError(err) - - keep_indexes = [] - corner_range = [] - names = [] - est_values = [] - for i in range(s.shape[1]): - - # look for patterns to skip - if skip_pattern.search(self.names[i]): - print("not doing corner plot for parameter ",self.names[i]) - continue - - names.append(self.names[i]) - keep_indexes.append(i) - corner_range.append(tuple([np.min(s[:,i])-0.5,np.max(s[:,i])+0.5])) - - est_values.append(self.estimate[i]) - - to_plot = s[:,np.array(keep_indexes,dtype=int)] - - fig = corner.corner(to_plot,labels=names,range=corner_range, - truths=est_values,*args,**kwargs) - - return fig - def write_samples(self,output_file): """ Write the samples from the fit out to a pickle file. @@ -948,7 +543,7 @@ def append_samples(self,sample_file=None,sample_array=None): err = f"'{sample_file}' does not appear to be a pickle file.\n" raise pickle.UnpicklingError(err) - # Check sanity of sample_array; update num_params if not specified + # Check sanity of sample_array; try: sample_array = np.array(sample_array,dtype=float) except Exception as e: @@ -956,14 +551,122 @@ def append_samples(self,sample_file=None,sample_array=None): raise ValueError(err) from e if len(sample_array.shape) != 2: - err = "sample_array should have dimensions (num_samples,num_param)\n" + err = "sample_array should have dimensions (num_samples,num_params)\n" raise ValueError(err) if sample_array.shape[1] != self.num_params: - err = "sample_array should have dimensions (num_samples,num_param)\n" + err = "sample_array should have dimensions (num_samples,num_params)\n" raise ValueError(err) # Concatenate the new samples to the existing samples self._samples = np.concatenate((self.samples,sample_array)) - self._update_estimates() + self._update_fit_df() + + def get_sample_df(self,num_samples=100): + """ + Create a dataframe with y_calc for samples from parameter uncertainty as + columns. The output dataframe will have the columns 'y_obs', 'y_std', + 'y_calc', 's0', 's1', ... 'sn', where 'y_calc' is the calculated value + using the ``self.fit_df["estimate"]`` parameters and s0 through sn are + calculated values using parameters sampled from the estimated + likelihood surface. If no samples have been generated, the dataframe + will omit the s0-sn columns. + + Parameters + ---------- + num_samples : int + number of samples to take. + + Returns + ------- + sample_df : pandas.DataFrame + dataframe with y_obs, y_calc, and values sampled from likelihood + surface. + """ + + num_samples = check_int(value=num_samples, + variable_name="num_samples", + minimum_allowed=0) + + # Out dictionary + out = {} + + # Get y_obs if defined + y_obs = self.y_obs + if y_obs is not None: + out["y_obs"] = y_obs + + # get y_std if defined + y_std = self.y_std + if y_std is not None: + out["y_std"] = y_std + + # get y_calc if fit was successful + if self.success: + estimate = np.array(self.fit_df["estimate"],dtype=float).copy() + out["y_calc"] = self.model(estimate) + + samples = self.samples + if samples is not None: + + N = samples.shape[0] + fmt_string = _pretty_zeropad_str(N) + + for i in range(0,N,N//(num_samples-1)): + key = fmt_string.format(i) + out[key] = self.model(self.samples[i]) + + return pd.DataFrame(out) + + @property + def num_params(self): + """ + Number of fit parameters. If model has not been defined, will be None. + """ + + self._model.finalize_params() + return np.sum(self._model.unfixed_mask) + + @property + def num_obs(self): + """ + Number of observations. If y_obs has not been defined, will be None. + """ + + try: + return self._y_obs.shape[0] + except AttributeError: + return None + + @property + def success(self): + """ + Whether the fit was successful when run (True or False). If no fit has + been attempted, will be None. + """ + + try: + return self._success + except AttributeError: + return None + + @property + def fit_info(self): + """ + Should be implemented in subclass. Information about fit run as a + dictionary. + """ + + raise NotImplementedError("should be implemented in subclass\n") + + @property + def fit_result(self): + """ + Full fit results (will depend on exact fit type what is placed here). + """ + + try: + return self._fit_result + except AttributeError: + return None \ No newline at end of file diff --git a/src/dataprob/fitters/bayesian.py b/src/dataprob/fitters/bayesian.py deleted file mode 100644 index 5df8184..0000000 --- a/src/dataprob/fitters/bayesian.py +++ /dev/null @@ -1,544 +0,0 @@ -""" -Fitter subclass for performing bayesian (MCMC) parameter estimation. -""" - -from dataprob.fitters.base import Fitter -from dataprob.check import check_int -from dataprob.check import check_float -from dataprob.check import check_bool -from dataprob.check import check_array - -import emcee - -import numpy as np -import scipy.optimize as optimize -from scipy import stats - -import multiprocessing -import warnings - -def _find_normalization(scale,rv,**kwargs): - """ - This method finds an offset to add to the output of rv.logpdf that - makes the total area under the pdf curve 1.0. - - Parameters - ---------- - scale : float - scale argument to scipy.stats.rv - rv : rv_continuous - object for calculating logpdf - kwargs : dict - kwargs are passed to rv_continuous to initialize - - Returns - ------- - offset : float - offset to add to frozen_rv.logpdf(x) to normalize pdf to 1.0 - - Notes - ----- - - Calculate the minimum difference between floats we can represent using our - data type. This sets the bin width for a discrete approximation of the - continuous distribution. - - res = np.finfo(dtype).resolution - - Calculate the sum of the un-normalized pdf over a range spanning zero. We - use a range of -num_to_same*res -> num_to_sample*res, taking steps of res: - - frozen_rv = rv(loc=0,scale=scale,**kwargs) - x = np.arange(-num_to_sample*res, - num_to_sample*(res + 1), - res) - un_norm_prob = np.sum(frozen_rv.pdf(loc=x)) - - Calculate the difference in the cdf between num_to_sample*res and - -num_to_sample*res. This is the normalized probability of the slice - centered on zero we calculated above. - - norm_prob = cdf(num_to_sample*res) - cdf(-num_to_sample*res). - - The ratio of norm_prob and un_norm_prob is a scalar that converts from raw - pdf calculations to normalized probabilities. - - norm_prob_x = frozen_rv.pdf(x)*norm_prob/un_norm_prob - - Since we care about log versions of this, it becomes: - - log_norm_prob_x = frozen_rv.logpdf(x) + log(norm_prob) - log(un_norm_prob) - - We can define a pre-calculated offset; - - offset = log(norm_prob) - log(un_norm_prob) - - So, finally: - - log_norm_prob_x = frozen_rv.logpdf(x) + offset - """ - - # Create frozen distribution located at 0.0 - centered_rv = rv(loc=0,scale=scale,**kwargs) - - # Get smallest float step (resolution) for this datatype on this - # platform. - res = np.finfo(centered_rv.cdf(0).dtype).resolution - - num_to_sample = int(np.round(1/res/1e9,0)) - - # Calculate prob of -1000res -> 1000res using cdf - cdf = centered_rv.cdf(num_to_sample*res) - centered_rv.cdf(-num_to_sample*res) - - # Calculate pdf over this interval with a step size of res - pdf = np.sum(centered_rv.pdf(np.linspace(-num_to_sample*res, - num_to_sample*res, - 2*num_to_sample + 1))) - - # This normalizes logpdf. It's the log version of: - # norm_prob_x = rv.pdf(x)*cdf/pdf. - offset = np.log(cdf) - np.log(pdf) - - return offset - -def _reconcile_bounds_and_priors(bounds,frozen_rv): - """ - Figure out how much bounds trim off priors and return amount to add to the - prior offset area to set to pdf area to 1. - - Parameters - ---------- - bounds : list-like or None - bounds applied to parameter - - Returns - ------- - offset : float - offset to add to np.logpdf(x) that accounts for the fact that bounds - may have trimmed some of the probability density and normalizes the - area of the pdf to 1.0. - """ - - # bounds specified, no offset to area - if bounds is None: - return 0.0 - - # Parse bounds list. - left = float(bounds[0]) - right = float(bounds[1]) - - # left and right the same. prob of this value is 1 (np.log(1) = 0) - if left == right: - w = f"left and right bounds {bounds} are identical\n" - warnings.warn(w) - return 0.0 - - # Calculate the amount the bounds trim off the top and the bottom of the - # distribution. - left_trim = frozen_rv.cdf(left) - right_trim = frozen_rv.sf(right) - - # Figure out how much we need to scale the area up given we lost some - # of the tails. - remaining = 1 - (left_trim + right_trim) - - # If remaining ends up zero, the left and right edges of the bounds - # are identical within numerical error. prob of this value is 1 (np.log(1) = 0) - if remaining == 0: - w = f"left and right bounds {bounds} are numerically identical\n" - warnings.warn(w) - return 0.0 - - # Return amount to scale the area by - return np.log(1/remaining) - -def _find_uniform_value(bounds): - """ - Find the log probability for a specific value between bounds to use in a - uniform prior. - - Parameters - ---------- - bounds : list-like, optional - list like float of two values. function assumes these are non-nanf - floats where bounds[1] >= bounds[0]. If bounds is None, assume - infinite bounds. - - The idea here is to find the maximum finite width the parameter can occupy - (bound[1] - bound[0]) and then to divide that by the number of steps based - on our numerical resolution. If our resolution was 0.1 and we were between - 0 and 1, there would be 11 values, so the uniform prior would be ln(1/11). - The log prior ends up being: np.log(resolution/width) - - For finite bounds, this is: - - np.log(resolution) - np.log(upper - lower) - - For infinite bounds, this is: - - np.log(resolution) - (np.log(scalar) + log(max_positive_finite_float)). - - max_positive_finite_float is the largest number we can represent. scalar - ranges (0,2]. It would be 2 for the bounds (-infinity,infinity), because - this covers a span 2*max_positive_finite_float. To avoid overflow, we - represent as logs (ln(2*max) --> ln(2) + ln(max)). Scalar values lower than - 2 represent smaller chunks of the finite number line. A value of 1 would - be half the number line (-infinity,0), (0,infinity). The value approaches - zero for the bounds (-infinity, -infinity + resolution) and - (infinity - resolution,infinity). - """ - - # float architecture information - finfo = np.finfo(np.ones(1,dtype=float)[0].dtype) - log_resolution = np.log(finfo.resolution) - log_max_value = np.log(finfo.max) - max_value = finfo.max - - # width is 2*max_value --> log(2) + log_max_value - if bounds is None: - return log_resolution - (np.log(2) + log_max_value) - - # Parse bounds list - left = float(bounds[0]) - right = float(bounds[1]) - - # left and right the same, probability is 1.0 (log(P) = 0) for this value - if left == right: - w = f"left and right bounds {bounds} are identical\n" - warnings.warn(w) - return 0.0 - - # width is 2*max_value --> log(2) + log_max_value - if np.isinf(left) and np.isinf(right): - return log_resolution - (np.log(2) + log_max_value) - - # Figure out scalars (see docstring) - if np.isinf(left): - - # exactly half the number line; scalar = 1 - if right == 0: - return log_resolution - log_max_value - - # scalar is less than 1 if left and right are both to the left of zero, - # more than 1 if right is above zero - if right < 0: - scalar = 1 - np.abs(right/max_value) - else: - scalar = 1 + np.abs(right/max_value) - - return log_resolution - (np.log(scalar) + log_max_value) - - if np.isinf(right): - - # exactly half the number line; scalar = 1 - if left == 0: - return log_resolution - log_max_value - - # scalar is less than 1 if left and right are both to the right of zero, - # more than 1 if left is below zero - if left > 0: - scalar = 1 - np.abs(left/max_value) - else: - scalar = 1 + np.abs(left/max_value) - - return log_resolution - (np.log(scalar) + log_max_value) - - # simple case with finite bounds. resolution/bound_width - return np.log(finfo.resolution) - np.log((right - left)) - - -class BayesianFitter(Fitter): - """ - Use Bayesian MCMC to sample parameter space. - """ - def __init__(self, - num_walkers=100, - initial_walker_spread=1e-4, - ml_guess=True, - num_steps=100, - burn_in=0.1, - num_threads=1): - """ - Initialize the bayesian sampler. - - Parameters - ---------- - num_walkers : int > 0 - how many markov chains to have in the analysis - initial_walker_spread : float - each walker is initialized with parameters sampled from normal - distributions with mean equal to the initial guess and a standard - deviation of guess*initial_walker_spread - ml_guess : bool - if true, do an ML optimization to get the initial guess - num_steps: - number of steps to run the markov chains - burn_in : float between 0 and 1 - fraction of samples to discard from the start of the run - num_threads : int - number of threads to use. if `0`, use the total number of cpus. - [NOT YET IMPLEMENTED] - """ - - super().__init__() - - # Set keywords, validating as we go - self._num_walkers = check_int(value=num_walkers, - variable_name="num_walkers", - minimum_allowed=1) - self._initial_walker_spread = check_float(value=initial_walker_spread, - variable_name="initial_walker_spread", - minimum_allowed=0, - minimum_inclusive=False) - self._ml_guess = check_bool(value=ml_guess, - variable_name="ml_guess") - self._num_steps = check_int(value=num_steps, - variable_name="num_steps", - minimum_allowed=1) - self._burn_in = check_float(value=burn_in, - variable_name="burn_in", - minimum_allowed=0, - maximum_allowed=1, - minimum_inclusive=False, - maximum_inclusive=False) - - # Deal with number of threads - num_threads = check_int(value=num_threads, - variable_name="num_threads", - minimum_allowed=0) - if num_threads == 0: - num_threads = multiprocessing.cpu_count() - - if num_threads != 1: - err = "multithreading has not yet been implemented (yet!).\n" - raise NotImplementedError(err) - - self._num_threads = num_threads - - # Finalize initialization - self._success = None - self._fit_type = "bayesian" - - def _setup_priors(self): - """ - Set up the priors for the calculation. - """ - - # Create prior distribution to use for all gaussian prior calcs - self._prior_frozen_rv = stats.norm(loc=0,scale=1) - - # Figure out the offset that normalizes the area of the pdf curve to 1.0 - # given the float precision etc. of the system - base_offset = _find_normalization(scale=1,rv=stats.norm) - - uniform_priors = [] - gauss_prior_means = [] - gauss_prior_stds = [] - gauss_prior_offsets = [] - gauss_prior_mask = [] - for i in range(self.num_params): - - priors = self.priors[:,i] - bounds = self.bounds[:,i] - - if np.isnan(priors[0]) or np.isnan(priors[1]): - uniform_priors.append(_find_uniform_value(bounds)) - gauss_prior_mask.append(False) - - else: - gauss_prior_means.append(priors[0]) - gauss_prior_stds.append(priors[1]) - - z_bounds = (bounds - priors[0])/priors[1] - bounds_offset = _reconcile_bounds_and_priors(bounds=z_bounds, - frozen_rv=self._prior_frozen_rv) - gauss_prior_offsets.append(base_offset + bounds_offset) - gauss_prior_mask.append(True) - - self._uniform_priors = np.sum(uniform_priors) - - self._gauss_prior_means = np.array(gauss_prior_means,dtype=float) - self._gauss_prior_stds = np.array(gauss_prior_stds,dtype=float) - self._gauss_prior_offsets = np.array(gauss_prior_offsets,dtype=float) - self._gauss_prior_mask = np.array(gauss_prior_mask,dtype=bool) - - def _ln_prior(self,param): - """ - Private function that gets the log prior without error checking. - """ - - # If any parameter falls outside of the bounds, make the prior -infinity - if np.sum(param < self.bounds[0,:]) > 0 or np.sum(param > self.bounds[1,:]) > 0: - return -np.inf - - # Get priors for parameters we're treating with gaussian priors - z = (param[self._gauss_prior_mask] - self._gauss_prior_means)/self._gauss_prior_stds - gauss = np.sum(self._prior_frozen_rv.logpdf(z) + self._gauss_prior_offsets) - - # Return total priors - return self._uniform_priors + gauss - - def ln_prior(self,param): - """ - Log prior of fit parameters. - - Parameters - ---------- - param : numpy.ndarray - float array of parameters to fit - - Returns - ------- - prior : float - log of priors. - """ - - self._sanity_check("fit can be done",["priors","bounds"]) - - param = check_array(value=param, - variable_name="param", - expected_shape=(self.num_params,), - expected_shape_names="(num_param,)") - - # This call should finalize the number of parameters if not already set - if self.num_params is None: - self._num_params = len(param) - - return self._ln_prior(param) - - - def _ln_prob(self,param): - """ - Private function that gets log probability without error checking. - """ - - # log posterior is log prior plus log likelihood - ln_prob = self._ln_prior(param) + self._ln_like(param) - - # If result is not finite, this solution has an -infinity log - # probability - if not np.isfinite(ln_prob): - return -np.inf - - return ln_prob - - def ln_prob(self,param): - """ - Posterior probability of model parameters. - - Parameters - ---------- - param : array of floats - parameters to fit - - Returns - ------- - ln_prob : float - log posterior proability - """ - - self._sanity_check("fit can be done",["model","y_obs","y_stdev","priors","bounds"]) - - param = check_array(value=param, - variable_name="param", - expected_shape=(self.num_params,), - expected_shape_names="(num_param,)") - - # This call should finalize the number of parameters if not already set - if self.num_params is None: - self._num_params = len(param) - - return self._ln_prob(param) - - def _fit(self,**kwargs): - """ - Fit the parameters. - - Parameters - ---------- - kwargs : dict - keyword arguments to pass to emcee.EnsembleSampler - """ - - # Set up the priors - self._setup_priors() - - # Make initial guess (ML or just whatever the parameters sent in were) - if self._ml_guess: - fn = lambda *args: -self.weighted_residuals(*args) - ml_fit = optimize.least_squares(fn,x0=self.guesses,bounds=self.bounds) - self._initial_guess = np.copy(ml_fit.x) - else: - self._initial_guess = np.copy(self.guesses) - - # Create walker positions - - # Size of perturbation in parameter depends on the scale of the parameter - perturb_size = self._initial_guess*self._initial_walker_spread - - ndim = len(self.guesses) - pos = [self._initial_guess + np.random.randn(ndim)*perturb_size - for i in range(self._num_walkers)] - - # Sample using walkers - self._fit_result = emcee.EnsembleSampler(self._num_walkers, - ndim, - self._ln_prob, - **kwargs) - - self._fit_result.run_mcmc(pos, self._num_steps,progress=True) - - # Create list of samples - to_discard = int(round(self._burn_in*self._num_steps,0)) - new_samples = self._fit_result.get_chain()[to_discard:,:,:].reshape((-1,ndim)) - - if self.samples is None: - self._samples = new_samples - - # If samples have already been done, append to them. - else: - self._samples = np.concatenate((self._samples,new_samples)) - - self._lnprob = self._fit_result.get_log_prob()[:,:].reshape(-1) - - self._update_estimates() - - def _update_estimates(self): - """ - Update samples based on the samples array. - """ - - # Get mean and standard deviation - self._estimate = np.mean(self._samples,axis=0) - self._stdev = np.std(self._samples,axis=0) - - # Calculate 95% confidence intervals - self._ninetyfive = [] - lower = int(round(0.025*self._samples.shape[0],0)) - upper = int(round(0.975*self._samples.shape[0],0)) - self._ninetyfive = [[],[]] - for i in range(self._samples.shape[1]): - nf = np.sort(self._samples[:,i]) - self._ninetyfive[0].append(nf[lower]) - self._ninetyfive[1].append(nf[upper]) - - self._ninetyfive = np.array(self._ninetyfive) - - self._success = True - - @property - def fit_info(self): - """ - Information about the Bayesian run. - """ - - output = {} - output["Num walkers"] = self._num_walkers - output["Initial walker spread"] = self._initial_walker_spread - output["Use ML guess"] = self._ml_guess - output["Num steps"] = self._num_steps - output["Burn in"] = self._burn_in - output["Final sample number"] = len(self._samples[:,0]) - output["Num threads"] = self._num_threads - - return output diff --git a/src/dataprob/fitters/bayesian/__init__.py b/src/dataprob/fitters/bayesian/__init__.py new file mode 100644 index 0000000..d830941 --- /dev/null +++ b/src/dataprob/fitters/bayesian/__init__.py @@ -0,0 +1,3 @@ +""" +Code for running Bayesian MCMC analyses. +""" \ No newline at end of file diff --git a/src/dataprob/fitters/bayesian/_prior_processing.py b/src/dataprob/fitters/bayesian/_prior_processing.py new file mode 100644 index 0000000..5fce2f7 --- /dev/null +++ b/src/dataprob/fitters/bayesian/_prior_processing.py @@ -0,0 +1,410 @@ +""" +Functions for calculating priors used in Bayesian MCMC sampling. +""" + +import numpy as np + +import warnings + +def find_normalization(scale,rv,**kwargs): + """ + This method finds an offset to add to the output of rv.logpdf that + makes the total area under the pdf curve 1.0. + + Parameters + ---------- + scale : float + scale argument to scipy.stats.rv + rv : rv_continuous + object for calculating logpdf + kwargs : dict + kwargs are passed to rv_continuous to initialize + + Returns + ------- + offset : float + offset to add to frozen_rv.logpdf(x) to normalize pdf to 1.0 + + Notes + ----- + + Calculate the minimum difference between floats we can represent using our + data type. This sets the bin width for a discrete approximation of the + continuous distribution. + + res = np.finfo(dtype).resolution + + Calculate the sum of the un-normalized pdf over a range spanning zero. We + use a range of -num_to_same*res -> num_to_sample*res, taking steps of res: + + frozen_rv = rv(loc=0,scale=scale,**kwargs) + x = np.arange(-num_to_sample*res, + num_to_sample*(res + 1), + res) + un_norm_prob = np.sum(frozen_rv.pdf(loc=x)) + + Calculate the difference in the cdf between num_to_sample*res and + -num_to_sample*res. This is the normalized probability of the slice + centered on zero we calculated above. + + norm_prob = cdf(num_to_sample*res) - cdf(-num_to_sample*res). + + The ratio of norm_prob and un_norm_prob is a scalar that converts from raw + pdf calculations to normalized probabilities. + + norm_prob_x = frozen_rv.pdf(x)*norm_prob/un_norm_prob + + Since we care about log versions of this, it becomes: + + log_norm_prob_x = frozen_rv.logpdf(x) + log(norm_prob) - log(un_norm_prob) + + We can define a pre-calculated offset; + + offset = log(norm_prob) - log(un_norm_prob) + + So, finally: + + log_norm_prob_x = frozen_rv.logpdf(x) + offset + """ + + # Create frozen distribution located at 0.0 + centered_rv = rv(loc=0,scale=scale,**kwargs) + + # Get smallest float step (resolution) for this datatype on this + # platform. + res = np.finfo(centered_rv.cdf(0).dtype).resolution + + num_to_sample = int(np.round(1/res/1e9,0)) + + # Calculate prob of -1000res -> 1000res using cdf + cdf = centered_rv.cdf(num_to_sample*res) - centered_rv.cdf(-num_to_sample*res) + + # Calculate pdf over this interval with a step size of res + pdf = np.sum(centered_rv.pdf(np.linspace(-num_to_sample*res, + num_to_sample*res, + 2*num_to_sample + 1))) + + # This normalizes logpdf. It's the log version of: + # norm_prob_x = rv.pdf(x)*cdf/pdf. + offset = np.log(cdf) - np.log(pdf) + + return offset + +def reconcile_bounds_and_priors(bounds,frozen_rv): + """ + Figure out how much bounds trim off priors and return amount to add to the + prior offset area to set to pdf area to 1. + + Parameters + ---------- + bounds : list-like or None + bounds applied to parameter + + Returns + ------- + offset : float + offset to add to np.logpdf(x) that accounts for the fact that bounds + may have trimmed some of the probability density and normalizes the + area of the pdf to 1.0. + """ + + # bounds specified, no offset to area + if bounds is None: + return 0.0 + + # Parse bounds list. + left = float(bounds[0]) + right = float(bounds[1]) + + # left and right the same. prob of this value is 1 (np.log(1) = 0) + if left == right: + w = f"left and right bounds {bounds} are identical\n" + warnings.warn(w) + return 0.0 + + # Calculate the amount the bounds trim off the top and the bottom of the + # distribution. + left_trim = frozen_rv.cdf(left) + right_trim = frozen_rv.sf(right) + + # Figure out how much we need to scale the area up given we lost some + # of the tails. + remaining = 1 - (left_trim + right_trim) + + # If remaining ends up zero, the left and right edges of the bounds + # are identical within numerical error. prob of this value is 1 (np.log(1) = 0) + if remaining == 0: + w = f"left and right bounds {bounds} are numerically identical\n" + warnings.warn(w) + return 0.0 + + # Return amount to scale the area by + return np.log(1/remaining) + +def find_uniform_value(bounds): + """ + Find the log probability for a specific value between bounds to use in a + uniform prior. + + Parameters + ---------- + bounds : list-like, optional + list like float of two values. function assumes these are non-nanf + floats where bounds[1] >= bounds[0]. If bounds is None, assume + infinite bounds. + + The idea here is to find the maximum finite width the parameter can occupy + (bound[1] - bound[0]) and then to divide that by the number of steps based + on our numerical resolution. If our resolution was 0.1 and we were between + 0 and 1, there would be 11 values, so the uniform prior would be ln(1/11). + The log prior ends up being: np.log(resolution/width) + + For finite bounds, this is: + + np.log(resolution) - np.log(upper - lower) + + For infinite bounds, this is: + + np.log(resolution) - (np.log(scalar) + log(max_positive_finite_float)). + + max_positive_finite_float is the largest number we can represent. scalar + ranges (0,2]. It would be 2 for the bounds (-infinity,infinity), because + this covers a span 2*max_positive_finite_float. To avoid overflow, we + represent as logs (ln(2*max) --> ln(2) + ln(max)). Scalar values lower than + 2 represent smaller chunks of the finite number line. A value of 1 would + be half the number line (-infinity,0), (0,infinity). The value approaches + zero for the bounds (-infinity, -infinity + resolution) and + (infinity - resolution,infinity). + """ + + # float architecture information + finfo = np.finfo(np.ones(1,dtype=float)[0].dtype) + log_resolution = np.log(finfo.resolution) + log_max_value = np.log(finfo.max) + max_value = finfo.max + + # width is 2*max_value --> log(2) + log_max_value + if bounds is None: + return log_resolution - (np.log(2) + log_max_value) + + # Parse bounds list + left = float(bounds[0]) + right = float(bounds[1]) + + # left and right the same, probability is 1.0 (log(P) = 0) for this value + if left == right: + w = f"left and right bounds {bounds} are identical\n" + warnings.warn(w) + return 0.0 + + # width is 2*max_value --> log(2) + log_max_value + if np.isinf(left) and np.isinf(right): + return log_resolution - (np.log(2) + log_max_value) + + # Figure out scalars (see docstring) + if np.isinf(left): + + # exactly half the number line; scalar = 1 + if right == 0: + return log_resolution - log_max_value + + # scalar is less than 1 if left and right are both to the left of zero, + # more than 1 if right is above zero + if right < 0: + scalar = 1 - np.abs(right/max_value) + else: + scalar = 1 + np.abs(right/max_value) + + return log_resolution - (np.log(scalar) + log_max_value) + + if np.isinf(right): + + # exactly half the number line; scalar = 1 + if left == 0: + return log_resolution - log_max_value + + # scalar is less than 1 if left and right are both to the right of zero, + # more than 1 if left is below zero + if left > 0: + scalar = 1 - np.abs(left/max_value) + else: + scalar = 1 + np.abs(left/max_value) + + return log_resolution - (np.log(scalar) + log_max_value) + + # simple case with finite bounds. resolution/bound_width + return np.log(finfo.resolution) - np.log((right - left)) + +def _sample_gaussian(prior_mean, + prior_std, + lower_bound, + upper_bound, + num_walkers): + """ + Attempt to generate num_walkers samples from a gaussian with prior_mean + and prior_std, subject to the constraint that all samples are between + lower and upper bounds. Either return an array of samples num_walkers + long or, if no samples are found, return None. + """ + + # generate a huge number of possible priors + gaussian_priors = np.random.normal(loc=prior_mean, + scale=prior_std, + size=num_walkers*1000) + + # Grab only those priors that are within the bounds + good_mask = np.logical_and(gaussian_priors > lower_bound, + gaussian_priors < upper_bound) + good_priors = gaussian_priors[good_mask] + + # If we have enough good priors, keep them. If we have only a few + # good priors, it means the bounds have sliced out a ridiculously + # tiny chunk of the distribution. Approximate the walkers as + # a uniform sample from that distribution. + if len(good_priors) >= num_walkers: + return good_priors[:num_walkers] + + return None + +def _cover_uniform(lower_bound, + upper_bound, + num_walkers, + infinity_proxy, + span_base=10): + """ + Create samples at even steps (logarithmic) between lower and upper bound. + Returns a numpy array num_walkers long with sampled values between lower + and upper bound. These are shuffled, but steps rather than purely random + samples. span_base sets + """ + + # Slice down infinite bounds to largish numbers + if np.isinf(lower_bound): + lower_bound = -infinity_proxy + if np.isinf(upper_bound): + upper_bound = infinity_proxy + + # If only one walker, put at the mean of the bounds + if num_walkers == 1: + return [np.mean([lower_bound,upper_bound])] + + # If the upper and lower bounds have the same sign, make a uniform + # span between them (log steps). For example, 1e-9 to 1e-6 with four + # walkers would yield approximately 1e-9, 1e-8, 1e-7, 1e-6 (uses ln, + # so not quite powers of 10) + if upper_bound*lower_bound >= 0: + + steps = np.exp(np.linspace(0,span_base,num_walkers)) + steps = (steps - np.min(steps))/(np.max(steps) - np.min(steps)) + walkers = steps*(upper_bound - lower_bound) + lower_bound + np.random.shuffle(walkers) + + return walkers + + # If the upper and lower bounds have different signs, make uniform + # spans from 0 to upper and 0 to lower, weighted by how much of the + # the span is above and below. + + # Figure out fraction of uniform distribution below zero + lower_mag = np.abs(lower_bound) + upper_mag = np.abs(upper_bound) + fx_lower = lower_mag/(lower_mag + upper_mag) + + # Figure out how many walkers to place above and below zero + num_below = int(np.round(fx_lower*num_walkers,0)) + + # Make sure we have at least one above and one below + if num_below == 0: + num_below = 1 + if num_below == num_walkers: + num_below = num_walkers - 1 + num_above = num_walkers - num_below + + # Create steps from 0 to upper_bound + if num_above > 1: + steps = np.exp(np.linspace(0,span_base,num_above)) + steps = (steps - np.min(steps))/(np.max(steps) - np.min(steps)) + above_walkers = list(steps*upper_bound) + else: + above_walkers = [upper_bound] + + # Create steps from 0 to lower_bound + if num_below > 1: + steps = np.exp(np.linspace(0,span_base,num_below)) + steps = (steps - np.min(steps))/(np.max(steps) - np.min(steps)) + below_walkers = list(steps*lower_bound) + else: + below_walkers = [lower_bound] + + # Combine all steps + above_walkers.extend(below_walkers) + walkers = np.array(above_walkers) + + # Shuffle randomly + np.random.shuffle(walkers) + + return walkers + +def create_walkers(param_df, + num_walkers, + infinity_proxy=1e9): + """ + Create a collection of starting walkers from a parameter dataframe. + + Parameters + ---------- + param_df : pandas.DataFrame + parameter dataframe (usually taken from a ModelWrapper instance) that + should have fixed, guess, prior_mean, prior_std, lower_bound, and + upper_bound columns. This dataframe is not validated by the function; + this is the callers responsibility. + num_walkers : int + number of walkers to generate. + infinity_proxy : float, default = 1e9 + substitute this for infinite bounds. should generally be a large-ish + number, but not so large as to lead to numerical problems. + + Returns + ------- + walkers : numpy.ndarray + numpy array with dimensions (num_walkers,num_parameters) with sampled + starting points for an MCMC calculation + """ + + walker_list = [] + + # Go through each parameter one-by-one + for p in param_df.index: + + # Skip fixed parameters + if param_df.loc[p,"fixed"]: + continue + + # Get prior mean, std, and bounds + prior_mean = param_df.loc[p,"prior_mean"] + prior_std = param_df.loc[p,"prior_std"] + lower_bound = param_df.loc[p,"lower_bound"] + upper_bound = param_df.loc[p,"upper_bound"] + + # If gaussian prior, try to do that first. + if not np.isnan(prior_mean): + + gaussian_priors = _sample_gaussian(prior_mean, + prior_std, + lower_bound, + upper_bound, + num_walkers) + if gaussian_priors is not None: + walker_list.append(gaussian_priors) + continue + + # If we get here, gaussian priors were not given or did not work. + uniform_priors = _cover_uniform(lower_bound, + upper_bound, + num_walkers, + infinity_proxy) + walker_list.append(uniform_priors) + + walkers = np.array(walker_list).T + + return walkers \ No newline at end of file diff --git a/src/dataprob/fitters/bayesian/bayesian_sampler.py b/src/dataprob/fitters/bayesian/bayesian_sampler.py new file mode 100644 index 0000000..455d4b1 --- /dev/null +++ b/src/dataprob/fitters/bayesian/bayesian_sampler.py @@ -0,0 +1,429 @@ +""" +Fitter subclass for performing bayesian (MCMC) parameter estimation. +""" + +from dataprob.fitters.base import Fitter +from dataprob.fitters.ml import MLFitter + +from dataprob.fitters.bayesian._prior_processing import find_normalization +from dataprob.fitters.bayesian._prior_processing import find_uniform_value +from dataprob.fitters.bayesian._prior_processing import reconcile_bounds_and_priors +from dataprob.fitters.bayesian._prior_processing import create_walkers + +from dataprob.util.check import check_int +from dataprob.util.check import check_float +from dataprob.util.check import check_bool +from dataprob.util.check import check_array + +import emcee + +import numpy as np +from scipy import stats + +import multiprocessing + +class BayesianSampler(Fitter): + """ + Use Bayesian MCMC to sample parameter space. + """ + + def _setup_priors(self): + """ + Set up the priors for the calculation. + """ + + # Create prior distribution to use for all gaussian prior calcs + self._prior_frozen_rv = stats.norm(loc=0,scale=1) + + # Figure out the offset that normalizes the area of the pdf curve to 1.0 + # given the float precision etc. of the system + base_offset = find_normalization(scale=1,rv=stats.norm) + + uniform_priors = [] + gauss_prior_means = [] + gauss_prior_stds = [] + gauss_prior_offsets = [] + gauss_prior_mask = [] + + for param in self.param_df.index: + + # If a parameter is fixed, ignore it completely here. The param + # array that comes in will not have an entry for this parameter + # so it should not even be in the mask as a False + if self.param_df.loc[param,"fixed"]: + continue + + # Get prior mean and std. + prior_mean = self.param_df.loc[param,"prior_mean"] + prior_std = self.param_df.loc[param,"prior_std"] + + # Get bounds + lower_bound = self.param_df.loc[param,"lower_bound"] + upper_bound = self.param_df.loc[param,"upper_bound"] + bounds = np.array([lower_bound,upper_bound]) + + # If prior_mean or prior_std is nan, use uniform priors. + if np.isnan(prior_mean) or np.isnan(prior_std): + + # Set the gauss_prior_mask to False for this parameter and add + # an appropriate chunk to the uniform prior + gauss_prior_mask.append(False) + uniform_priors.append(find_uniform_value(bounds)) + + else: + + # Set gauss_prior_mask to True for this parameter + gauss_prior_mask.append(True) + + # Record gauss prior mean and std for use in the on-the-fly + # prior calc + gauss_prior_means.append(prior_mean) + gauss_prior_stds.append(prior_std) + + # Reconcile the bounds and priors to find the normalization + # offset for this parameter + z_bounds = (bounds - prior_mean)/prior_std + bounds_offset = reconcile_bounds_and_priors(bounds=z_bounds, + frozen_rv=self._prior_frozen_rv) + + # Record the normalization offset + gauss_prior_offsets.append(base_offset + bounds_offset) + + + self._uniform_priors = np.sum(uniform_priors) + + self._gauss_prior_means = np.array(gauss_prior_means,dtype=float) + self._gauss_prior_stds = np.array(gauss_prior_stds,dtype=float) + self._gauss_prior_offsets = np.array(gauss_prior_offsets,dtype=float) + self._gauss_prior_mask = np.array(gauss_prior_mask,dtype=bool) + + # Grab lower and upper bounds. We pull them out of the dataframe so we + # can use in prior calculations without any dictionary lookups. + unfixed = self._model.unfixed_mask + self._lower_bounds = np.array(self.param_df.loc[unfixed,"lower_bound"], + dtype=float).copy() + self._upper_bounds = np.array(self.param_df.loc[unfixed,"upper_bound"], + dtype=float).copy() + + def _ln_prior(self,param): + """ + Private function that gets the log prior without error checking. + """ + + # If any parameter falls outside of the bounds, make the prior -infinity + if np.sum(param < self._lower_bounds) > 0: + return -np.inf + + if np.sum(param > self._upper_bounds) > 0: + return -np.inf + + # Get priors for parameters we're treating with gaussian priors + z = (param[self._gauss_prior_mask] - self._gauss_prior_means)/self._gauss_prior_stds + gauss = np.sum(self._prior_frozen_rv.logpdf(z) + self._gauss_prior_offsets) + + # Return total priors + return self._uniform_priors + gauss + + def ln_prior(self,param): + """ + Log prior of fit parameters. + + Parameters + ---------- + param : numpy.ndarray + float array of parameters to fit + + Returns + ------- + prior : float + log of priors. + """ + + # Make sure model is loaded + self._sanity_check("fit can be done",["model"]) + + # Set up priors given model and param_df + self._setup_priors() + + param = check_array(value=param, + variable_name="param", + expected_shape=(self.num_params,), + expected_shape_names="(num_param,)") + + return self._ln_prior(param) + + + def _ln_prob(self,param): + """ + Private function that gets log probability without error checking. + """ + + # log posterior is log prior plus log likelihood + ln_prob = self._ln_prior(param) + self._ln_like(param) + + # If result is not finite, this solution has an -infinity log + # probability + if not np.isfinite(ln_prob): + return -np.inf + + return ln_prob + + def ln_prob(self,param): + """ + Posterior probability of model parameters. + + Parameters + ---------- + param : array of floats + parameters to fit + + Returns + ------- + ln_prob : float + log posterior proability + """ + + self._sanity_check("fit can be done",["model","y_obs","y_std"]) + self._setup_priors() + + param = check_array(value=param, + variable_name="param", + expected_shape=(self.num_params,), + expected_shape_names="(num_param,)") + + return self._ln_prob(param) + + def fit(self, + y_obs=None, + y_std=None, + num_walkers=100, + use_ml_guess=True, + num_steps=100, + burn_in=0.1, + num_threads=1, + **emcee_kwargs): + """ + Perform Bayesian MCMC sampling of parameter values. + + Parameters + ---------- + y_obs : numpy.ndarray + observations in a numpy array of floats that matches the shape + of the output of some_function set when initializing the fitter. + nan values are not allowed. y_obs must either be specified here + or in the data_df dataframe. + y_std : numpy.ndarray + standard deviation of each observation. nan values are not allowed. + If not specified, all points are assigned an uncertainty of + 0.1*mean(y_obs). + num_walkers : int, default=100 + number of markov chains to use in the analysis + use_ml_guess : bool, default=True + if true, do a maximum likelihood maximization then sample from the + fit parameter covariance matrix to get the initial chain positions + num_steps: int, default=100 + number of steps to run each markov chain + burn_in : float, default = 0.1 + fraction of samples to discard from the start of the run + num_threads : int + number of threads to use. if `0`, use the total number of cpus. + [NOT YET IMPLEMENTED] + **emcee_kwargs : + all remaining keyword arguments are passed to the initialization + function of emcee.EnsembleSampler + """ + + # Set keywords, validating as we go + self._num_walkers = check_int(value=num_walkers, + variable_name="num_walkers", + minimum_allowed=1) + self._use_ml_guess = check_bool(value=use_ml_guess, + variable_name="use_ml_guess") + self._num_steps = check_int(value=num_steps, + variable_name="num_steps", + minimum_allowed=1) + self._burn_in = check_float(value=burn_in, + variable_name="burn_in", + minimum_allowed=0, + maximum_allowed=1, + minimum_inclusive=False, + maximum_inclusive=False) + + # Deal with number of threads + num_threads = check_int(value=num_threads, + variable_name="num_threads", + minimum_allowed=0) + if num_threads == 0: + num_threads = multiprocessing.cpu_count() + + if num_threads != 1: + err = "multithreading has not yet been implemented (yet!).\n" + raise NotImplementedError(err) + + self._num_threads = num_threads + + super().fit(y_obs=y_obs, + y_std=y_std, + **emcee_kwargs) + + + def _fit(self,**kwargs): + """ + Fit the parameters. + + Parameters + ---------- + kwargs : dict + keyword arguments to pass to emcee.EnsembleSampler + """ + + # Set up the priors + self._setup_priors() + + # Construct initial walker positions. If use_ml_guess is specified, do a + # maximum likelihood fit, then sample from the fit parameter covariance + # matrix to generate initial guesses. This will sample only unfixed + # parameters. + if self._use_ml_guess: + + ml_fit = MLFitter(some_function=self._model) + ml_fit.data_df = self.data_df + ml_fit.fit() + self._initial_state = ml_fit.samples[:self._num_walkers,:] + + # Generate walkers by sampling from the prior distribution. This will + # only generate values for unfixed parameters. + else: + self._initial_state = create_walkers(param_df=self.param_df, + num_walkers=self._num_walkers) + + # Build sampler object + self._fit_result = emcee.EnsembleSampler(nwalkers=self._num_walkers, + ndim=self._initial_state.shape[1], + log_prob_fn=self._ln_prob, + **kwargs) + + # Run sampler + self._fit_result.run_mcmc(initial_state=self._initial_state, + nsteps=self._num_steps, + progress=True) + + # Create numpy array of samples + to_discard = int(round(self._burn_in*self._num_steps,0)) + chains = self._fit_result.get_chain()[to_discard:,:,:] + new_samples = chains.reshape((-1,self._initial_state.shape[1])) + + # Create numpy array of lnprob for each sample + new_lnprob = self._fit_result.get_log_prob()[:,:].reshape(-1) + new_lnprob = new_lnprob[-new_samples.shape[0]:] + + if self.samples is None: + self._samples = new_samples + self._lnprob = new_lnprob + else: + self._samples = np.concatenate((self._samples,new_samples)) + self._lnprob = np.concatenate((self._lnprob,new_lnprob)) + + self._success = True + + self._update_fit_df() + + def _update_fit_df(self): + """ + Update samples based on the samples array. + """ + + # Get mean and standard deviation + estimate = np.mean(self._samples,axis=0) + std = np.std(self._samples,axis=0) + + # Calculate 95% confidence intervals + lower = int(round(0.025*self._samples.shape[0],0)) + upper = int(round(0.975*self._samples.shape[0],0)) + + # For samples less than ~100, the rounding above will make the + # the upper cutoff the number of samples, and thus lead to an index + # error below. + if upper >= self._samples.shape[0]: + upper = self._samples.shape[0] - 1 + + low_95 = [] + high_95 = [] + for i in range(self._samples.shape[1]): + sorted_samples = np.sort(self._samples[:,i]) + low_95.append(sorted_samples[lower]) + high_95.append(sorted_samples[upper]) + + # Get finalized parameters from param_df in case they were updated + # after the model was set and the fit_df created. + for col in ["guess","fixed","lower_bound","upper_bound","prior_mean", + "prior_std"]: + self._fit_df[col] = self.param_df[col] + + fixed = np.array(self._fit_df["fixed"],dtype=bool).copy() + unfixed = np.logical_not(fixed) + + self._fit_df.loc[unfixed,"estimate"] = estimate + self._fit_df.loc[fixed,"estimate"] = self._fit_df.loc[fixed,"guess"] + self._fit_df.loc[unfixed,"std"] = std + self._fit_df.loc[unfixed,"low_95"] = low_95 + self._fit_df.loc[unfixed,"high_95"] = high_95 + + + @property + def fit_info(self): + """ + Information about the Bayesian run. + """ + + output = {} + + if hasattr(self,"_num_walkers"): + output["Num walkers"] = self._num_walkers + + if hasattr(self,"_use_ml_guess"): + output["Use ML guess"] = self._use_ml_guess + + if hasattr(self,"_num_steps"): + output["Num steps"] = self._num_steps + + if hasattr(self,"_burn_in"): + output["Burn in"] = self._burn_in + + + if self.samples is not None: + num_samples = self.samples.shape[0] + else: + num_samples = None + + output["Final sample number"] = num_samples + + if hasattr(self,"_num_threads"): + output["Num threads"] = self._num_threads + + return output + + def __repr__(self): + """ + Output to show when object is printed or displayed in a jupyter + notebook. + """ + + out = ["BayesianSampler\n---------------\n"] + + out.append("Sampler parameters:\n") + for k in self.fit_info: + out.append(f" {k}: {self.fit_info[k]}") + + out.append(f"\nanalysis has been run: {self._fit_has_been_run}\n") + + if self._fit_has_been_run: + out.append(f"analysis results:\n") + if self.success: + for dataframe_line in repr(self.fit_df).split("\n"): + out.append(f" {dataframe_line}") + out.append("\n") + else: + out.append(" analysis failed\n") + + return "\n".join(out) \ No newline at end of file diff --git a/src/dataprob/fitters/bootstrap.py b/src/dataprob/fitters/bootstrap.py index 4f90894..b90b573 100644 --- a/src/dataprob/fitters/bootstrap.py +++ b/src/dataprob/fitters/bootstrap.py @@ -2,45 +2,54 @@ Fitter subclass for performing bootstrap analyses. """ -from .base import Fitter +from dataprob.fitters.base import Fitter +from dataprob.util.check import check_int import numpy as np -import scipy.optimize +import scipy +from tqdm.auto import tqdm -import sys +import warnings class BootstrapFitter(Fitter): """ Perform the fit many times, sampling from uncertainty in each measurement. """ - def __init__(self,num_bootstrap=100,perturb_size=1.0,exp_err=False,verbose=False): + def fit(self, + y_obs=None, + y_std=None, + num_bootstrap=100, + **least_squares_kwargs): """ - Perform the fit many times, sampling from uncertainty in each measured - heat. + Fit the model parameters to the data by maximum likelihood, sampling + uncertainty in observation values by bootstrap. Parameters ---------- + y_obs : numpy.ndarray + observations in a numpy array of floats that matches the shape + of the output of some_function set when initializing the fitter. + nan values are not allowed. y_obs must either be specified here + or in the data_df dataframe. + y_std : numpy.ndarray + standard deviation of each observation. nan values are not allowed. + If not specified, all points are assigned an uncertainty of + 0.1*mean(y_obs). num_bootstrap : int - Number of bootstrap samples to do - perturb_size : float - Standard deviation of random samples for heats. Ignored if exp_err - is specified. - exp_err : bool - Use experimental estimates of heat uncertainty. If specified, overrides - perturb_size. - verbose : bool - Give verbose output. + Number of bootstrap samples to run + **least_squares_kwargs : + any remaining keyword arguments are passed as **kwargs to + scipy.optimize.least_squares """ + + self._num_bootstrap = check_int(value=num_bootstrap, + variable_name="num_bootstrap", + minimum_allowed=2) - super(BootstrapFitter,self).__init__() - - self._num_bootstrap = num_bootstrap - self._perturb_size = perturb_size - self._exp_err = exp_err - self._verbose = verbose - - self._fit_type = "bootstrap" + super().fit(y_obs=y_obs, + y_std=y_std, + **least_squares_kwargs) def _fit(self,**kwargs): """ @@ -53,65 +62,136 @@ def _fit(self,**kwargs): scipy.optimize.least_squares """ + # Grab un-fixed guesses and bounds + to_fit = self._model.unfixed_mask + guesses = np.array(self._model.param_df.loc[to_fit,"guess"]).copy() + bounds = np.array([self._model.param_df.loc[to_fit,"lower_bound"], + self._model.param_df.loc[to_fit,"upper_bound"]]).copy() + # Create array to store bootstrap replicates - samples = np.zeros((self._num_bootstrap,len(self.guesses)),dtype=float) + samples = np.zeros((self._num_bootstrap,len(guesses)),dtype=float) + # Record y_obs original_y_obs = np.copy(self._y_obs) + # Define function to regress against + def fn(*args): return -self._unweighted_residuals(*args) + # Go through bootstrap reps - for i in range(self._num_bootstrap): - - if self._verbose and i != 0 and i % 100 == 0: - print("Bootstrap {} of {}".format(i,self._num_bootstrap)) - sys.stdout.flush() - - # Add random error to each sample - self.y_obs = original_y_obs + np.random.normal(0.0,self.y_stdev) - - # Do the fit - fit = scipy.optimize.least_squares(self.unweighted_residuals, - x0=self.guesses, - bounds=self.bounds, - **kwargs) - - # record the fit results - samples[i,:] = fit.x - + problems = [] + for i in tqdm(range(self._num_bootstrap)): + + # Create updated version of y_obs sampled from y_std + self._y_obs = original_y_obs + np.random.normal(0.0,self._y_std) + + # Do regression + try: + fit = scipy.optimize.least_squares(fn, + x0=guesses, + bounds=bounds, + **kwargs) + except Exception as e: + problems.append(str(e)) + samples[i,:] = np.nan + continue + + # Record the fit results. If the fit fails, record np.nan + if fit.success: + samples[i,:] = fit.x + else: + samples[i,:] = np.nan + + # Restore y_obs from our stored copy self._y_obs = np.copy(original_y_obs) + # If no samples yet, store them. Otherwise, append them to the existing + # samples. if self.samples is None: self._samples = samples - - # If samples have already been done, append to them. else: - self._samples = np.concatenate((self._samples,samples)) - - self._fit_result = self._samples + self.append_samples(sample_array=samples) + + # Record the current stats on the number of samples and number that + # failed and place in _fit_result. + total_samples = self.samples.shape[0] + num_failed = np.sum(np.isnan(self.samples[:,0])) + num_success = total_samples - num_failed + self._fit_result = {"total_samples":total_samples, + "num_success":num_success, + "num_failed":num_failed} + + # warn if a fit failed to converge + if num_failed > 0: + w = f"\n\nOnly {num_success} of {total_samples} fits were successful.\n\n" + + if len(problems) > 0: + prob_types, prob_counts = np.unique(problems, + return_counts=True) + w += "The fitter threw the following errors:\n" + for i in range(len(prob_types)): + w += f" '{prob_types[i]}' {prob_counts[i]} times.\n" + + warnings.warn(w) + + # If at least two replicates worked, record this as success + if num_success > 2: + self._success = True + else: + self._success = False - self._update_estimates() + if self._success: + self._update_fit_df() - def _update_estimates(self): + def _update_fit_df(self): """ Recalculate the parameter estimates from any new samples. """ - - # mean of bootstrap samples - self._estimate = np.mean(self._samples,axis=0) - - # standard deviation from bootstrap samples - self._stdev = np.std(self._samples,axis=0) - - # 95% from bootstrap samples - self._ninetyfive = [[],[]] - for i in range(self._samples.shape[1]): - lower = np.percentile(self._samples[:,i], 2.5) - upper = np.percentile(self._samples[:,i],97.5) - self._ninetyfive[0].append(lower) - self._ninetyfive[1].append(upper) - self._ninetyfive = np.array(self._ninetyfive) - - self._success = True - + + samples = self.samples + good_mask = np.logical_not(np.isnan(samples[:,0])) + samples = samples[good_mask,:] + if samples.shape[0] < 2: + err = f"_update_fit_df requires at least two non-nan samples. The\n" + err += f".samples array has {samples.shape[0]} non-nan parameters.\n" + raise ValueError(err) + + # Get mean and standard deviation + estimate = np.mean(samples,axis=0) + std = np.std(samples,axis=0) + + # Calculate 95% confidence intervals + lower = int(round(0.025*samples.shape[0],0)) + upper = int(round(0.975*samples.shape[0],0)) + + # For samples less than ~100, the rounding above will make the + # the upper cutoff the number of samples, and thus lead to an index + # error below. + if upper >= samples.shape[0]: + upper = samples.shape[0] - 1 + + low_95 = [] + high_95 = [] + for i in range(samples.shape[1]): + sorted_samples = np.sort(samples[:,i]) + low_95.append(sorted_samples[lower]) + high_95.append(sorted_samples[upper]) + + # Get finalized parameters from param_df in case they were updated + # after the model was set and the fit_df created. + for col in ["guess","fixed","lower_bound","upper_bound","prior_mean", + "prior_std"]: + self._fit_df[col] = self.param_df[col] + + fixed = np.array(self._fit_df["fixed"],dtype=bool).copy() + unfixed = np.logical_not(fixed) + + self._fit_df.loc[unfixed,"estimate"] = estimate + self._fit_df.loc[fixed,"estimate"] = self._fit_df.loc[fixed,"guess"] + self._fit_df.loc[unfixed,"std"] = std + self._fit_df.loc[unfixed,"low_95"] = low_95 + self._fit_df.loc[unfixed,"high_95"] = high_95 + + @property def fit_info(self): """ @@ -120,8 +200,28 @@ def fit_info(self): output = {} - output["Num bootstrap"] = self._num_bootstrap - output["Perturb size"] = self._perturb_size - output["Use experimental error"] = self._exp_err + if hasattr(self,"_num_bootstrap"): + output["Num bootstrap"] = self._num_bootstrap return output + + def __repr__(self): + + out = ["BootstrapFitter\n---------------\n"] + + out.append("Fit parameters:\n") + for k in self.fit_info: + out.append(f" {k}: {self.fit_info[k]}") + + out.append(f"\nfit has been run: {self._fit_has_been_run}\n") + + if self._fit_has_been_run: + out.append(f"fit results:\n") + if self.success: + for dataframe_line in repr(self.fit_df).split("\n"): + out.append(f" {dataframe_line}") + out.append("\n") + else: + out.append(" fit failed\n") + + return "\n".join(out) diff --git a/src/dataprob/fitters/ml.py b/src/dataprob/fitters/ml.py index 8e9e676..8f0078d 100644 --- a/src/dataprob/fitters/ml.py +++ b/src/dataprob/fitters/ml.py @@ -2,7 +2,8 @@ Fitter subclass for performing maximum likelihood fits. """ -from .base import Fitter +from dataprob.fitters.base import Fitter +from dataprob.util.check import check_int import numpy as np import scipy.stats @@ -16,24 +17,42 @@ class MLFitter(Fitter): Standard deviation and ninety-five percent confidence intervals on parameter estimates are determined using the covariance matrix (Jacobian * residual - variance) See: - # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es - # http://stackoverflow.com/questions/14581358/getting-standard-errors-on-fitted-parameters-using-the-optimize-leastsq-method-i + variance) """ - def __init__(self,num_samples=100000): + + def fit(self, + y_obs=None, + y_std=None, + num_samples=100000, + **least_squares_kwargs): """ - Initialize the fitter. + Fit the model parameters to the data by maximum likelihood. Parameters ---------- + y_obs : numpy.ndarray + observations in a numpy array of floats that matches the shape + of the output of some_function set when initializing the fitter. + nan values are not allowed. y_obs must either be specified here + or in the data_df dataframe. + y_std : numpy.ndarray + standard deviation of each observation. nan values are not allowed. + If not specified, all points are assigned an uncertainty of + 0.1*mean(y_obs). num_samples : int number of samples for generating corner plot + **least_squares_kwargs : + any remaining keyword arguments are passed as **kwargs to + scipy.optimize.least_squares """ + + self._num_samples = check_int(value=num_samples, + variable_name="num_samples", + minimum_allowed=0) - super(MLFitter,self).__init__() - - self._fit_type = "maximum likelihood" - self._num_samples = num_samples + super().fit(y_obs=y_obs, + y_std=y_std, + **least_squares_kwargs) def _fit(self,**kwargs): """ @@ -46,23 +65,31 @@ def _fit(self,**kwargs): scipy.optimize.least_squares """ + to_fit = self._model.unfixed_mask + guesses = np.array(self._model.param_df.loc[to_fit,"guess"]).copy() + bounds = np.array([self._model.param_df.loc[to_fit,"lower_bound"], + self._model.param_df.loc[to_fit,"upper_bound"]]).copy() # Do the actual fit - fn = lambda *args: -self.weighted_residuals(*args) + def fn(*args): return -self._weighted_residuals(*args) self._fit_result = optimize.least_squares(fn, - x0=self.guesses, - bounds=self.bounds, + x0=guesses, + bounds=bounds, **kwargs) self._success = self._fit_result.success + + # Delete samples if they were present from a previous fit + if hasattr(self,"_samples"): + del self._samples + + self._update_fit_df() - self._update_estimates() - - def _update_estimates(self): + def _update_fit_df(self): """ Recalculate the parameter estimates from any new samples. """ - self._estimate = self._fit_result.x + estimate = self._fit_result.x # Extract standard error on the fit parameter from the covariance N = len(self._y_obs) @@ -72,27 +99,42 @@ def _update_estimates(self): J = self._fit_result.jac cov = np.linalg.inv(2*np.dot(J.T,J)) - self._stdev = np.sqrt(np.diagonal(cov)) #variance) + std = np.sqrt(np.diagonal(cov)) #variance # 95% confidence intervals from standard error z = scipy.stats.t(N-P-1).ppf(0.975) - c1 = self._estimate - z*self._stdev - c2 = self._estimate + z*self._stdev + c1 = estimate - z*std + c2 = estimate + z*std - self._ninetyfive = [[],[]] + low_95 = [] + high_95 = [] for i in range(P): - self._ninetyfive[0].append(c1[i]) - self._ninetyfive[1].append(c2[i]) - self._ninetyfive = np.array(self._ninetyfive) + low_95.append(c1[i]) + high_95.append(c2[i]) except np.linalg.LinAlgError: - warning = "\n\nJacobian matrix was singular.\n" - warning += "Could not estimate parameter uncertainty.\n" - warning += "Consider using the Bayesian sampler.\n" - warnings.warn(warning) + w = "\n\nJacobian matrix was singular. Could not fit parameter\n" + w += "uncertainty.\n\n" + warnings.warn(w) + + std = np.nan*np.ones(len(estimate),dtype=float) + low_95 = np.nan*np.ones(len(estimate),dtype=float) + high_95 = np.nan*np.ones(len(estimate),dtype=float) + + # Get finalized parameters from param_df in case they were updated + # after the model was set and the fit_df created. + for col in ["guess","fixed","lower_bound","upper_bound","prior_mean", + "prior_std"]: + self._fit_df[col] = self.param_df[col] - self._stdev = np.nan*np.ones(len(self._estimate),dtype=float) - self._ninety_five = np.nan*np.ones((2,len(self._estimate)),dtype=float) + fixed = np.array(self._fit_df["fixed"],dtype=bool).copy() + unfixed = np.logical_not(fixed) + + self._fit_df.loc[unfixed,"estimate"] = estimate + self._fit_df.loc[fixed,"estimate"] = self._fit_df.loc[fixed,"guess"] + self._fit_df.loc[unfixed,"std"] = std + self._fit_df.loc[unfixed,"low_95"] = low_95 + self._fit_df.loc[unfixed,"high_95"] = high_95 @property @@ -111,31 +153,72 @@ def samples(self): https://stats.stackexchange.com/questions/120179/generating-data-with-a-given-sample-covariance-matrix """ - try: + # If we already have samples, return them + if hasattr(self,"_samples"): return self._samples - except AttributeError: - - try: - # Return None if no fit has been run. - try: - J = self._fit_result.jac - except AttributeError: - return None - - cov = np.linalg.inv(2*np.dot(J.T,J)) - chol_cov = np.linalg.cholesky(cov).T - except np.linalg.LinAlgError: - warning = "\n\nJacobian matrix was singular.\n" - warning += "Could not estimate parameter uncertainty.\n" - warning += "Consider using the Bayesian sampler.\n" - warnings.warn(warning) - - # Return empty array - return np.array([]) - - self._samples = np.dot(np.random.normal(size=(self._num_samples, - chol_cov.shape[0])), - chol_cov) - self._samples = self._samples + self.estimate - return self._samples + # Return None if no fit has been run. + if not self._fit_has_been_run: + return None + + try: + J = self._fit_result.jac + cov = np.linalg.inv(2*np.dot(J.T,J)) + chol_cov = np.linalg.cholesky(cov).T + except np.linalg.LinAlgError: + w = "\n\nJacobian matrix was singular. Could not generate\n" + w += "parameter samples.\n\n" + warnings.warn(w) + + # Return empty array + return None + + unfixed = np.logical_not(np.array(self.fit_df["fixed"],dtype=bool)) + estimate = np.array(self.fit_df.loc[unfixed,"estimate"]).copy() + self._samples = np.dot(np.random.normal(size=(self._num_samples, + chol_cov.shape[0])), + chol_cov) + + self._samples = self._samples + estimate + + num_param = self._samples.shape[1] + + # above_mask is True for a given sample if all of the parameter values + # are >= the lower bound for that sample + lower_bound = np.array(self.fit_df.loc[unfixed,"lower_bound"],dtype=float) + above_mask = np.sum(self._samples >= lower_bound,axis=1) == num_param + + # below_mak is True for a given sample if all of the parameter values + # are <= the upper bound for that sample + upper_bound = np.array(self.fit_df.loc[unfixed,"upper_bound"],dtype=float) + below_mask = np.sum(self._samples <= upper_bound,axis=1) == num_param + + # Keep mask is True only if above_mask and below_mask are true for a + # given sample + keep_mask = np.logical_and(above_mask,below_mask) + + # Get only samples that fit the condition + self._samples = self._samples[keep_mask,:] + + return self._samples + + + def __repr__(self): + """ + Output to show when object is printed or displayed in a jupyter + notebook. + """ + + out = ["MLFitter\n--------\n"] + + out.append(f"fit has been run: {self._fit_has_been_run}\n") + if self._fit_has_been_run: + out.append(f"fit results:\n") + if self.success: + for dataframe_line in repr(self.fit_df).split("\n"): + out.append(f" {dataframe_line}") + out.append("\n") + else: + out.append(" fit failed\n") + + return "\n".join(out) diff --git a/src/dataprob/fitters/setup.py b/src/dataprob/fitters/setup.py new file mode 100644 index 0000000..31da228 --- /dev/null +++ b/src/dataprob/fitters/setup.py @@ -0,0 +1,193 @@ +""" +Public constructor used to set up analyses. +""" + +from dataprob.fitters.ml import MLFitter +from dataprob.fitters.bootstrap import BootstrapFitter +from dataprob.fitters.bayesian.bayesian_sampler import BayesianSampler + +def setup(some_function, + method="ml", + fit_parameters=None, + non_fit_kwargs=None, + vector_first_arg=False): + """ + Set up a dataprob analysis. + + Parameters + ---------- + some_function : callable + A function that takes at least one argument and returns a float numpy + array. Fitter objects will compare the outputs of this function against + y_obs. + method : str, default="ml" + analysis method to use. should be "ml" (maximum likelihood), "bootstrap" + (ml with bootstrap resampling of observation uncertainty), or "mcmc" + (Bayesian Markov Chain Monte Carlo sampling). + fit_parameters : list, dict, str, pandas.DataFrame; optional + fit_parameters lets the user specify information about the parameters + in the fit. See Note below for details. + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for some_function that should not + be fit but need to be specified to non-default values. + vector_first_arg : bool, default=False + If True, the first argument of the function is taken as a vector of + parameters to fit. All other arguments to some_function are treated as + non-fittable parameters. Fit_parameters must then specify the names of + each vector element. + + Returns + ------- + f : Fitter + fitter instance to use for the analysis + + Notes + ----- + + **Basic pattern** + + ..code-block :: python + + # assume we have a dataframe named 'df' with the columns 'x', 'y_obs' + # and 'y_std'. x is our independent variable, y_obs is what we observed + # and y_std is the uncertainty on each observation. + + import dataprob + + # Define model + def linear_model(m,b,x): return m*x + b + + # Set up the fit, passing in "x", which we need to run the model but is not + # a fittable parameter. + f = dataprob.setup(linear_model, + non_fit_kwargs={"x":df["x"]}) + + # do fit + f.fit(y_obs=df["y_obs"], + y_std=df["y_std"]) + + # Plot and print fit result dataframe + fig = dataprob.plot.plot_summary(f) + print(f.fit_df) + + **Parameter setup** + + There are two classes of parameters to each model. Fittable parameters are + visible to Fitter instances (such as the ML fitter or Bayesian sampler) and + are thus regressed/sampled. Non-fittable parameters are fixed and passed + into ``some_function`` whenever it is called, but are invisible to the Fitter. + + The software uses the signature of ``some_function`, ``fit_parameters`, and + ``vector_first_arg`` to figure out what fit parameters to use. + + In the simplest case (`fit_parameters is None`, ``vector_first_arg is False`), + the software will infer the fittable and non-fittable parameters from the + ``some_function`` signature. It will grab the first N arguments with no + default or whose default can be coerced to a float. The remaining arguments + are treated as non-fittable parameters. Consider the example: + + ``some_function == my_func(a,b=1,c="test",d=1)` + + The software will find the fittable parameters ``a`` and ``b`, setting the + guesses to ``a = 0`` and ``b = 1`. The ``c`` and ``d`` parameters will be set as + non-fittable. + + If fittable_parameters is defined, it can override this default. For + example, if ``fit_parameters = ['a','d']`, ``a`` and ``d`` will be fittable + parameters and ``b`` and ``c`` will be non-fittable parameters. Except for two + special cases described below, the parameters in ``fit_parameters`` must match + the parameters in the function signature. The parameters ``a`, ``b`, and ``d`` + can be specified as fittable; the parameter ``c`` cannot because its default + argument is a string. + + NOTE: ``fit_parameters`` is treated as an exhaustive list of fittable + parameters. If specified, *only* the parameters in the list will be + fittable. + + ``fit_parameters`` can differ from the parameters in the signature of + ``some_function`` in two cases: + + 1) If the signature of ``some_function`` contains ``**kwargs`, ``fit_parameters` + can be used to specify parameters to pass into some_function that are + not explicitly delineated in the function signature. For example: + + ``some_function == my_func(a,**kwargs)` + + would allow ``fit_parameters = ['a','b','c']`. The ``b`` and ``c`` parameters + would be passed in as keyword arguments. (The code does not check + whether ``my_func`` can take those keyword arguments; that is the user's + responsibility) + + 2) If ``vector_first_arg`` is ``True`, ``fit_parameters`` defines the parameters + to pass in as a numpy.ndarray as the first function argument. If + ``vector_first_arg`` is ``True`, ``fit_parameters`` is required. All + function arguments besides this vector are treated as non-fittable + parameters. + + Finally, ``fit_parameters`` can be used to pass in other information about + the fit parameters. This includes the parameter guess, whether or not it is + fixed during the regression, its bounds, and the mean and standard deviation + of a gaussian prior to apply to that fit parameter (Bayesian sampling only). + This information can either be passed in via a dictionary or dataframe. + + If ``fit_parameters`` comes in as a dataframe, the dataframe must have a + ``name`` column with parameter names (just like the entries to a + ``fit_parameters`` list). It may have entries as described in the table below. + + If ``fit_parameters`` comes in as a dictionary, the keys should be the + parameter names (just like the entries to a ``fit_parameters`` list). The + values should be dictionaries keying parameter attributes to their values. + For example: + + ``fit_parameters = {"K":{"guess":1,"lower_bound":0}}` + + would indicate that parameter "K" should have a guess of 1 and a lower bound + of zero. + + If ``fit_parameters`` comes in as a string, the software will treat this as + a filename and will attempt to load it in as a dataframe. + + The allowed columns (for the dataframe) or keys (for the dictionary) are: + + +---------------+-----------------------------------------------------+ + | key | value | + +===============+=====================================================+ + | 'guess' | guess as single float value (must be non-nan and | + | | within bounds if specified) | + +---------------+-----------------------------------------------------+ + | 'fixed' | whether or not parameter can vary. True of False | + +---------------+-----------------------------------------------------+ + | 'lower_bound' | single float value; -np.inf allowed; None, nan or | + | | pd.NA interpreted as -np.inf. | + +---------------+-----------------------------------------------------+ + | 'upper_bound' | single float value; -np.inf allowed; None, nan or | + | | pd.NA interpreted as np.inf. | + +---------------+-----------------------------------------------------+ + | 'prior_mean' | single float value; np.nan allowed (see below) | + +---------------+-----------------------------------------------------+ + | 'prior_std' | single float value; np.nan allowed (see below) | + +---------------+-----------------------------------------------------+ + + Gaussian priors are specified using the 'prior_mean' and 'prior_std' + fields, declaring the prior mean and standard deviation. If both are + set to nan for a parameter, the prior is set to uniform between the + parameter bounds. If either 'prior_mean' or 'prior_std' is set to a + non-nan value, both must be non-nan to define the prior. When set, + 'prior_std' must be greater than zero. Neither can be np.inf. + """ + + + method_map = {"ml":MLFitter, + "bootstrap":BootstrapFitter, + "mcmc":BayesianSampler} + + if method not in method_map: + err = "method should be one of:\n" + for k in method_map: + err += f" {k}\n" + raise ValueError(err) + + return method_map[method](some_function=some_function, + fit_parameters=fit_parameters, + non_fit_kwargs=non_fit_kwargs, + vector_first_arg=vector_first_arg) \ No newline at end of file diff --git a/src/dataprob/model_wrapper.py b/src/dataprob/model_wrapper.py deleted file mode 100644 index d63f3a6..0000000 --- a/src/dataprob/model_wrapper.py +++ /dev/null @@ -1,330 +0,0 @@ -""" -Class for wrapping models for use in likelihood calculations. -""" - -from dataprob.fit_param import FitParameter - -import numpy as np - -import inspect - -class ModelWrapper: - """ - Wrap a model for use in likelihood calculations. - - The first N arguments with no default argument or arguments whose - default can be coerced as a float are converted to fit parameters. The - remaining arguments are treated as non-fittable parameters. A specific - set of arguments to convert to fit parameters can be specified by - specifying 'fittable_params'. - """ - - # Attributes to hold the fit parameters and other arguments to pass - # to the model. These have to be defined across class because we are going - # to hijack __getattr__ and __setattr__ and need to look inside this as soon - # as we start setting attributes. - _mw_fit_parameters = {} - _mw_other_arguments = {} - - def __init__(self,model_to_fit,fittable_params=None): - """ - - Parameters - ---------- - model_to_fit : callable - a function or method to fit. - fittable_params : list-like, optional - list of arguments to fit. - """ - - # Define these here so __setattr__ and __getattr__ are looking at - # instance-level attributes rather than class-level attributes. - self._mw_fit_parameters = {} - self._mw_other_arguments = {} - - self._model_to_fit = model_to_fit - self._mw_load_model(fittable_params) - - def _mw_load_model(self,fittable_params): - """ - Load a model into the wrapper, making the arguments into attributes. - Fittable arguments are made into FitParameter instances. Non-fittable - arguments are set as generic attributes. - - Parameters - ---------- - fittable_params : list-like or None - list of parameters to fit - """ - - # model arguments - self._mw_signature = inspect.signature(self._model_to_fit) - - # Figure out which arguments to make fittable. - argument_gettable = [] - for p in self._mw_signature.parameters: - - # Make sure that this parameter name isn't already being used by - # the wrapper. - if p in dir(self.__class__): - err = f"Parameter name '{p}' reserved by this class.\n" - err += "Please change the argument name in your function.\n" - raise ValueError(err) - - # See if this parameter can conceivably be a fit parameter: either - # no default or default can be coerced into a float - try: - float(self._mw_signature.parameters[p].default) - argument_gettable.append(p) - except (TypeError,ValueError): - if self._mw_signature.parameters[p].default == inspect._empty: - argument_gettable.append(p) - else: - argument_gettable.append(None) - - # If the fittable params were not specified by the user, take all params - # up to the first one that was not gettable. - if fittable_params is None: - - fittable_params = [] - for p in argument_gettable: - if p is not None: - fittable_params.append(p) - else: - break - - # Load arguments as either fit parameters or generic attributes - for i, p in enumerate(self._mw_signature.parameters): - - if p in fittable_params: - - # Remove p from _fittable_params - fittable_params.remove(p) - - # Make sure this argument was identified as one we could use - # as a parameter. - if not argument_gettable[i]: - err = f"default for function argument '{p}' cannot be\n" - err += "coerced into a float\n" - raise ValueError(err) - - # Grab guess from default argument - if self._mw_signature.parameters[p].default == inspect._empty: - guess = None - else: - guess = float(self._mw_signature.parameters[p].default) - - # Convert to a fit parameter - self._mw_fit_parameters[p] = FitParameter(name=p,guess=guess) - - else: - # Record as a generic argument, not a fit parameter. - self._mw_other_arguments[p] = self._mw_signature.parameters[p].default - - # Check to make sure we saw all of the specified fittable_params - if len(fittable_params) > 0: - err = f"Specified parameter(s) are not arguments to the model:\n\n:" - err += " ({})".format(",".join(fittable_params)) - raise ValueError(err) - - self._update_parameter_map() - - def __setattr__(self, key, value): - """ - Hijack __setattr__ so setting the value for fit parameters - updates the fit guess. - """ - - # We're setting the guess of the fit parameter - if key in self._mw_fit_parameters.keys(): - self._mw_fit_parameters[key].guess = value - - # We're setting another argument - elif key in self._mw_other_arguments.keys(): - self._mw_other_arguments[key] = value - - elif key in ["bounds","guesses","names","fixed"]: - err = f"'{key}' can only be set at the individual parameter level\n" - err += "for a ModelWrapper instance.\n" - raise TypeError(err) - - # Otherwise, just set it like normal - else: - super(ModelWrapper, self).__setattr__(key, value) - - def __getattr__(self,key): - """ - Define __getattr__ to we get fit parameters and other arguments - appropriately. - """ - - # We're getting a fit parameter - if key in self._mw_fit_parameters.keys(): - return self._mw_fit_parameters[key] - - # We're getting another argument - if key in self._mw_other_arguments.keys(): - return self._mw_other_arguments[key] - - # Otherwise, get like normal - else: - super(ModelWrapper,self).__getattribute__(key) - - def _update_parameter_map(self): - """ - Update the map between the parameter vector that will be passed in to - the fitter and the parameters in this wrapper. This - """ - - self._position_to_param = [] - self._mw_kwargs = {} - for p in self._mw_fit_parameters.keys(): - if self._mw_fit_parameters[p].fixed: - self._mw_kwargs[p] = self._mw_fit_parameters[p].value - else: - self._mw_kwargs[p] = None - self._position_to_param.append(p) - - self._mw_kwargs.update(self._mw_other_arguments) - - def _mw_observable(self,params=None): - """ - Actual function called by the fitter. - """ - - # If parameters are not passed, stick in the current parameter - # values - if params is None: - for p in self.position_to_param: - self._mw_kwargs[p] = self.fit_parameters[p].value - else: - if len(params) != len(self.position_to_param): - err = f"Number of fit parameters ({len(params)}) does not match\n" - err += f"number of unfixed parameters ({len(self.position_to_param)})\n" - raise ValueError(err) - - for i in range(len(params)): - self._mw_kwargs[self.position_to_param[i]] = params[i] - - try: - return self._model_to_fit(**self._mw_kwargs) - except Exception as e: - err = "\n\nThe wrapped model threw an error (see trace).\n\n" - raise type(e)(err) from e - - def load_fit_result(self,fitter): - """ - Load the result of a fit into all fit parameters. - """ - - for i, p in enumerate(self.position_to_param): - self.fit_parameters[p].load_fit_result(fitter,i) - - @property - def model(self): - """ - The observable. - """ - - # Update mapping between parameters and model arguments in case - # user has fixed value - self._update_parameter_map() - - # This model, once returned, does not have to re-run update_parameter_map - # and should thus be faster when run again and again in regression - return self._mw_observable - - @property - def guesses(self): - """ - Return an array of the guesses for the model (only including the unfixed - parameters). - """ - - # Update mapping between parameters and model arguments in case - # user has fixed value - self._update_parameter_map() - - guesses = [] - for p in self.position_to_param: - guesses.append(self.fit_parameters[p].guess) - - return np.array(guesses) - - @property - def bounds(self): - """ - Return an array of the bounds for the model (only including the unfixed - parameters). - """ - - # Update mapping between parameters and model arguments in case - # user has fixed value - self._update_parameter_map() - - bounds = [[],[]] - for p in self.position_to_param: - bounds[0].append(self.fit_parameters[p].bounds[0]) - bounds[1].append(self.fit_parameters[p].bounds[1]) - - return np.array(bounds) - - @property - def priors(self): - """ - Return an array of the priors for the model (only including the unfixed - parameters). - """ - - # Update mapping between parameters and model arguments in case - # user has fixed value - self._update_parameter_map() - - priors = [[],[]] - for p in self.position_to_param: - priors[0].append(self.fit_parameters[p].prior[0]) - priors[1].append(self.fit_parameters[p].prior[1]) - - return np.array(priors) - - @property - def names(self): - """ - Return an array of the names of the parameters (only including the unfixed - parameters). - """ - - # Update mapping between parameters and model arguments in case - # user has fixed value - self._update_parameter_map() - - names = [] - for p in self.position_to_param: - names.append(self.fit_parameters[p].name) - - return names[:] - - @property - def fit_parameters(self): - """ - A dictionary of FitParameter instances. - """ - - return self._mw_fit_parameters - - @property - def other_arguments(self): - """ - A dictionary with every model argument that is not a fit parameter. - """ - - return self._mw_other_arguments - - @property - def position_to_param(self): - """ - List mapping the position of each parameters in the output arrays to - their original model argument names. - """ - - return self._position_to_param diff --git a/src/dataprob/model_wrapper/__init__.py b/src/dataprob/model_wrapper/__init__.py new file mode 100644 index 0000000..3bea347 --- /dev/null +++ b/src/dataprob/model_wrapper/__init__.py @@ -0,0 +1,3 @@ +""" +Code for wrapping generic python functions as fittable models. +""" \ No newline at end of file diff --git a/src/dataprob/model_wrapper/_dataframe_processing.py b/src/dataprob/model_wrapper/_dataframe_processing.py new file mode 100644 index 0000000..97ff7c5 --- /dev/null +++ b/src/dataprob/model_wrapper/_dataframe_processing.py @@ -0,0 +1,394 @@ +""" +Functions for processing parameter dataframes. +""" + +import numpy as np +import pandas as pd + +def _check_name(param_df,param_in_order): + """ + Check name column for sanity, set it as the index, and order dataframe + according to param_in_order + """ + + if "name" not in param_df.columns: + err = "param_df must have a name column\n" + raise ValueError(err) + + if len(set(param_in_order)) != len(param_in_order): + err = "param_in_order must all have unique parameters\n" + raise ValueError(err) + + # work on a copy + param_df = param_df.copy() + + # Coerce to string + param_df["name"] = param_df["name"].astype(str) + + names_in_df = set(param_df["name"]) + names_in_mw = set(param_in_order) + + if names_in_df != names_in_mw: + err = "\nValues in the 'name' column in a parameter dataframe must\n" + err += "be identical to the fit parameter names.\n\n" + + missing_values = names_in_mw - names_in_df + if len(missing_values) > 0: + err += "Missing values:\n" + for v in missing_values: + err += f" {v}\n" + err += "\n" + + extra_values = names_in_df - names_in_mw + if len(extra_values) > 0: + err += "Extra values:\n" + for v in extra_values: + err += f" {v}\n" + err += "\n" + + raise ValueError(err) + + # Make sure the index is the parameter name + param_df.index = param_df["name"] + param_df = param_df.loc[param_in_order,:] + + return param_df + +def _build_columns(param_df,default_guess): + """ + Build any missing columns and coerce them to the correct types. + """ + + # ---------------------------------------------------------------------- + # Build any missing columns + + if "guess" not in param_df.columns: + param_df["guess"] = default_guess + if "fixed" not in param_df.columns: + param_df["fixed"] = False + if "lower_bound" not in param_df.columns: + param_df["lower_bound"] = -np.inf + if "upper_bound" not in param_df.columns: + param_df["upper_bound"] = np.inf + if "prior_mean" not in param_df.columns: + param_df["prior_mean"] = np.nan + if "prior_std" not in param_df.columns: + param_df["prior_std"] = np.nan + + # ---------------------------------------------------------------------- + # Coerce column types + + float_columns = ["guess", + "lower_bound","upper_bound", + "prior_mean","prior_std"] + + for fc in float_columns: + + # start with the pandas caster as this is smart and robust + try: + param_df[fc] = pd.to_numeric(param_df[fc]) + except Exception as e: + err = f"Could not coerce all entries in the '{fc}' column to float\n" + raise ValueError(err) from e + + # then do a direct cast to float + param_df[fc] = param_df[fc].astype(float) + + bool_columns = ["fixed"] + + for bc in bool_columns: + + try: + param_df[bc] = param_df[bc].astype(bool) + except Exception as e: + err = f"Could not coerce all entries in the '{bc}' column to bool\n" + raise ValueError(err) from e + + return param_df + +def _check_bounds(param_df): + """ + Check upper_bound and lower_bound columns for sanity. + """ + + # Set nan values to be -np.inf and +np.inf + lower_bound_nan = pd.isna(param_df["lower_bound"]) + upper_bound_nan = pd.isna(param_df["upper_bound"]) + param_df.loc[lower_bound_nan,"lower_bound"] = -np.inf + param_df.loc[upper_bound_nan,"upper_bound"] = np.inf + + # Check for bounds that are inconsistent. + bad_bound_mask = param_df["lower_bound"] >= param_df["upper_bound"] + + if np.sum(bad_bound_mask) > 0: + + bad_df = param_df.loc[bad_bound_mask,["name", + "lower_bound","upper_bound"]] + + err = "\nBounds must have lower_bound < upper_bound. -np.inf is\n" + err += "allowed lower_bound; np.inf is allowed for upper_bound.\n" + + err += "\nBad parameters are:\n" + err += f"\n{repr(bad_df)}\n\n" + + raise ValueError(err) + + return param_df + +def _check_guesses(param_df): + """ + Check guess column for sanity. + """ + + guesses = param_df["guess"] + too_low_mask = guesses < param_df["lower_bound"] + too_high_mask = guesses > param_df["upper_bound"] + is_nan_mask = np.isnan(guesses) + bad_guesses = np.logical_or.reduce((too_low_mask, + too_high_mask, + is_nan_mask)) + if np.sum(bad_guesses) > 0: + + bad_df = param_df.loc[bad_guesses,["name","guess", + "lower_bound","upper_bound"]] + + err = "\nGuess values must be non-nan and between lower_bound and\n" + err += "upper_bound.\n" + + err += "\nBad parameters are:\n" + err += f"\n{repr(bad_df)}\n\n" + + raise ValueError(err) + + return param_df + +def _check_priors(param_df): + """ + Check prior_mean and prior_std columns for sanity. + """ + + # Look for partially defined parameters using a XOR gate, which is true + # if mean OR std is nan, but false if neither is nan or both are nan. + prior_mean_nan = pd.isna(param_df["prior_mean"]) + prior_std_nan = pd.isna(param_df["prior_std"]) + nan_xor = np.logical_or( + np.logical_and(prior_mean_nan, + np.logical_not(prior_std_nan)), + np.logical_and(np.logical_not(prior_mean_nan), + prior_std_nan) + ) + if np.sum(nan_xor) > 0: + + bad_df = param_df.loc[nan_xor,["name","prior_mean","prior_std"]] + + err = "\nIf either prior_mean and prior_std are defined for a\n" + err += "given parameter, both must be non-nan. If prior_mean\n" + err += "and prior_std are both set to np.nan, the parameter uses\n" + err += "uniform priors within the specified bounds.\n" + + err += "\nBad parameters are:\n" + err += f"\n{repr(bad_df)}\n\n" + + raise ValueError(err) + + # Look for prior_std that are defined and <= 0. + bad_prior_std = param_df["prior_std"] <= 0 + if np.sum(bad_prior_std) > 0: + + bad_df = param_df.loc[bad_prior_std,["name","prior_std"]] + + err = "\nIf defined, prior_std must be > 0.\n" + + err += "\nBad parameters are:\n" + err += f"\n{repr(bad_df)}\n\n" + + raise ValueError(err) + + # Look for infinite priors + prior_mean_inf = np.isinf(param_df["prior_mean"]) + prior_std_inf = np.isinf(param_df["prior_std"]) + bad_prior_inf = np.logical_or(prior_mean_inf,prior_std_inf) + if np.sum(bad_prior_inf) > 0: + + bad_df = param_df.loc[bad_prior_inf,["name","prior_mean","prior_std"]] + + err = "\nprior_mean and prior_std must be finite. If prior_mean and\n" + err += "prior_std are set to np.nan, the parameter uses uniform\n" + err += "priors within the specified bounds.\n" + + err += "\nBad parameters are:\n" + err += f"\n{repr(bad_df)}\n\n" + + raise ValueError(err) + + return param_df + +def _df_to_dict(df): + """ + Convert a dataframe into a nested dictionary (out_dict[name][column]). This + is useful in case the input dataframe has only partial coverage of a larger + dataframe. + """ + + if "name" not in df.columns: + err = "dataframe must have a name column\n" + raise ValueError(err) + + # work on copy + df = df.copy() + + # Coerce to string + df["name"] = df["name"].astype(str) + + # make sure names are all unique + if len(set(df["name"])) != len(df["name"]): + err = "all 'name' entries in dataframe must be unique\n" + raise ValueError(err) + + df.index = df["name"] + + out_dict = {} + for p in df["name"]: + out_dict[p] = {} + for c in df.columns: + out_dict[p][c] = df.loc[p,c] + + return out_dict + + +def validate_dataframe(param_df, + param_in_order, + default_guess=0): + """ + Validate a parameter dataframe, returning it in a standardized format. This + validates and possibly creates the core columns (name, guess, fixed, + lower_bound, upper_bound, prior_mean, and prior_std). It also orders the + parameters according to param_in_order and sets the dataframe index to be + the parameter name. Other columns are left intact, but ignored. + + Parameters + ---------- + param_df : pandas.DataFrame + parameter dataframe to check + param_in_order : list-like + list of parameter names in the desired order + default_guess : float, default = 0 + assign missing guess entries this value + + Returns + ------- + param_df : pandas.DataFrame + validated dataframe + """ + + # make sure the input is a dataframe + if not issubclass(type(param_df),pd.DataFrame): + err = "\nparam_df should be a pandas DataFrame\n" + raise ValueError(err) + + # Check dataframe entries + param_df = _check_name(param_df=param_df, + param_in_order=param_in_order) + + param_df = _build_columns(param_df=param_df, + default_guess=default_guess) + + param_df = _check_bounds(param_df=param_df) + + param_df = _check_guesses(param_df=param_df) + + param_df = _check_priors(param_df=param_df) + + + return param_df + + +def param_into_existing(param_input, + param_df): + """ + Load parameter information from param_input into param_df. + + Parameters + ---------- + param_input : dict or pandas.DataFrame + this can be nested dictionary that keys parameter names to columns to + values (param_input[name][column] -> value). it can also be a pandas + dataframe with (minimally) a 'name' column. + param_df : pandas.DataFrame + parameter dataframe into which we are loading data. + + Notes + ----- + Any information in param_df that is not explicitly defined in param_input + will be left intact in param_df. For example, if param_df has entries for + parameters 'K1' and 'K2', param_input could set values for 'K1' without + altering 'K2'. This can happen at the attribute level as well. We could + set the guess of 'K1' without altering the 'upper_bound'. + + 0. If a param_input is a dataframe, it must have a 'name' column that + corresponds to the parameters in param_df. + 1. The parameters in param_input must already be in param_df. + 2. Not all parameters in param_df must be in param_input. Parameters that + are not in param_input are not changed in param_df. + 3. param_input can have columns that are not present in param_df. These + will be added to param_df. + """ + + # If the param_input is a dataframe, convert to a dictionary + if issubclass(type(param_input),pd.DataFrame): + param_input = _df_to_dict(param_input) + + # If param_input is not a dictionary at this point, throw an error + if not issubclass(type(param_input),dict): + err = "param_input should be a pandas dataframe or dictionary\n" + raise ValueError(err) + + # work on copy of parameter dataframe + param_df = param_df.copy() + + # Go through parameters... + added_columns = [] + for p in param_input: + + # Make sure parameter is in model + if p not in param_df["name"]: + err = f"parameter {p} is not a parameter in the model\n" + raise ValueError(err) + + if not issubclass(type(param_input[p]),dict): + err = f"\nparam_input['{p}'] should be a dictionary\n" + err += f"\n{param_into_existing.__doc__}\n\n" + raise ValueError(err) + + # Go through input columns for parameter + for c in param_input[p]: + + # Decide if we need to add a new column + if c not in param_df.columns: + added_columns.append(c) + continue + + # If column already exists, add to it + param_df.loc[p,c] = param_input[p][c] + + # Build columns that were not in param_df + for c in added_columns: + new_column = [] + for p in param_df["name"]: + + # Parameter not in input + if p not in param_input: + new_column.append(None) + continue + + # Parameter in input, but not column + if c not in param_input[p]: + new_column.append(None) + continue + + # Parameter and column in input + new_column.append(param_input[p][c]) + + param_df[c] = new_column + + return param_df \ No newline at end of file diff --git a/src/dataprob/model_wrapper/_function_processing.py b/src/dataprob/model_wrapper/_function_processing.py new file mode 100644 index 0000000..6050de5 --- /dev/null +++ b/src/dataprob/model_wrapper/_function_processing.py @@ -0,0 +1,251 @@ +""" +Functions for processing function signatures and identifying fit parameters. +""" + +import inspect + +# Various codes classifying argument types +KWARGS_KIND = inspect.Parameter.VAR_KEYWORD +ARGS_KIND = inspect.Parameter.VAR_POSITIONAL +EMPTY_DEFAULT = inspect.Parameter.empty + +def analyze_fcn_sig(fcn): + """ + Extract information about function being fit. + + Parameters + ---------- + fcn : callable + function or method used for fitting + + Returns + ------- + all_args : list + list of string names for all function arguments. This excludes + *args and **kwargs + can_be_fit : dict + dictionary of arguments that can concievably fit. parameter names + are keys, values are parameter defaults (float or None) + cannot_be_fit : dict + dictionary of arguments that cannot be fit. parameter names are + keys, values are parameter defaults + has_kwargs : bool + whether or not this function takes **kwargs + """ + + # Get function signature + sig = inspect.signature(fcn) + + # Function outputs + all_args = [] + can_be_fit = {} + cannot_be_fit = {} + has_kwargs = False + + # Go through parameters + for p in sig.parameters: + + # If kwargs, record we saw it and skip + if sig.parameters[p].kind is KWARGS_KIND: + has_kwargs = True + continue + + # If args, skip + if sig.parameters[p].kind is ARGS_KIND: + continue + + all_args.append(p) + + # Get default for argument + default = sig.parameters[p].default + + # If this is iterable, assume it is not fittable. (Putting this here + # prevents a bad comparison to multiple values in the next comparison to + # EMPTY_DEFAULT) + if hasattr(default,"__iter__"): + cannot_be_fit[p] = default + continue + + # If empty, assume it is fittable + if default == EMPTY_DEFAULT: + can_be_fit[p] = None + continue + + # Fittable if it can be coerced as a float. Explicitly exclude bool + try: + if issubclass(type(default),bool): + raise ValueError + can_be_fit[p] = float(default) + except (TypeError,ValueError): + cannot_be_fit[p] = default + + return all_args, can_be_fit, cannot_be_fit, has_kwargs + + +def reconcile_fittable(fit_parameters, + non_fit_kwargs, + all_args, + can_be_fit, + cannot_be_fit, + has_kwargs): + """ + Find fittable and not fittable parameters for this function. + + Parameters + ---------- + fit_parameters : list-like, optional + list of fittable parameter names. if None, infer + non_fit_kwargs : dict, optional + non-fit keyword arguments to pass to the function. if None, infer. + all_args : list + list of string names for all function arguments. This excludes + *args and **kwargs + can_be_fit : dict + dictionary of arguments that can conceivably fit. parameter names + are keys, values are parameter defaults (float or None) + cannot_be_fit : dict + dictionary of arguments that cannot be fit. parameter names are + keys, values are parameter defaults + has_kwargs : bool + whether or not this function takes **kwargs + + Returns + ------- + fit_parameters : list + list of fittable parameters built from fit_parameters input and + can_be_fit + not_fit_parameters : list + list of unfittable params built from non_fit_kwargs, all_args, and + cannot_be_fit + """ + + # Construct not_fit_parameters from non_fit_kwargs keys + if non_fit_kwargs is not None: + not_fit_parameters = list(non_fit_kwargs.keys()) + else: + not_fit_parameters = [] + + # Make sure the user didn't send in the same parameter as both a fittable + # and non-fittable parameter + if fit_parameters is not None: + fittable_set = set(fit_parameters) + not_fittable_set = set(not_fit_parameters) + intersect = fittable_set.intersection(not_fittable_set) + if len(intersect) != 0: + err = "a parameter cannot be in fit_parameters and not fit_parameters.\n" + err += f"Bad parameters: {str(intersect)}\n" + raise ValueError(err) + + # If fit_parameters are not specified, construct + if fit_parameters is None: + fit_parameters = [] + for a in all_args: + if a in can_be_fit: + fit_parameters.append(a) + else: + break + + # Go through all fittable parameters + for p in fit_parameters: + + # Not fittable based on sig -- die + if p in cannot_be_fit: + err = f"parameter '{p}' cannot be fit. It should have an empty\n" + err += f"or float default argument in the function definition.\n" + raise ValueError(err) + + # Not found, and no **kwargs around. + if p not in can_be_fit and not has_kwargs: + err = f"fittable parameter '{p}' is not in the function definition\n" + raise ValueError(err) + + # Go through all nonfittable params + for p in not_fit_parameters: + + # Parameter not in function signature and the signature does not have + # **kwargs. Fail. + in_can_fit = p in can_be_fit + in_cannot_fit = p in cannot_be_fit + if not in_can_fit and not in_cannot_fit and not has_kwargs: + err = f"not_fittable parameter '{p}' is not in the function definition\n" + raise ValueError(err) + + # Filter kwargs to remove any user-specified nonfit_parameters + fit_parameters = [p for p in fit_parameters + if p not in not_fit_parameters] + + # If we get here and do not have a fittable parameter, bad news. + if len(fit_parameters) == 0: + err = "no parameters to fit!\n" + raise ValueError(err) + + # Make a final list of not_fit_parameters -- everything that is not + # fittable. + final_not_fittable = [] + for p in all_args: + if p not in fit_parameters: + final_not_fittable.append(p) + + # Grab anything sent in by the user that is not already in the definition. + # (Do this way so args are in order from signature, then in order sent in by + # user for any **kwargs. + for p in not_fit_parameters: + if p not in final_not_fittable: + final_not_fittable.append(p) + + return fit_parameters, final_not_fittable + + +def analyze_vector_input_fcn(fcn): + """ + Extract information about function being fit. + + Parameters + ---------- + fcn : callable + function or method used for fitting + + Returns + ------- + first_arg : str + name of first argument + other_kwargs : dict + dictionary keying all remaining arguments to their default values. + arguments with no default are assigned a default of None. + has_kwargs : bool + whether or not this function takes **kwargs + """ + + sig = inspect.signature(fcn) + + first_arg = None + other_kwargs = {} + has_kwargs = False + for p in sig.parameters: + + if sig.parameters[p].kind == KWARGS_KIND: + has_kwargs = True + continue + + # Skip kwargs and args + if sig.parameters[p].kind == ARGS_KIND: + continue + + if first_arg is None: + first_arg = p + continue + + default = sig.parameters[p].default + if default == EMPTY_DEFAULT: + default = None + + other_kwargs[p] = default + + return first_arg, other_kwargs, has_kwargs + + + + + + + diff --git a/src/dataprob/model_wrapper/model_wrapper.py b/src/dataprob/model_wrapper/model_wrapper.py new file mode 100644 index 0000000..ed7142d --- /dev/null +++ b/src/dataprob/model_wrapper/model_wrapper.py @@ -0,0 +1,458 @@ +""" +Class for wrapping functions for use in likelihood calculations. +""" + +from dataprob.model_wrapper._function_processing import analyze_fcn_sig +from dataprob.model_wrapper._function_processing import reconcile_fittable + +from dataprob.util.read_spreadsheet import read_spreadsheet +from dataprob.model_wrapper._dataframe_processing import validate_dataframe +from dataprob.model_wrapper._dataframe_processing import param_into_existing + +from dataprob.util.check import check_float + +import numpy as np +import pandas as pd + +class ModelWrapper: + """ + Wrap a function for use in likelihood calculations. + + The first N arguments with no default argument or arguments whose + default can be coerced as a float are converted to fit parameters. The + remaining arguments are treated as non-fittable parameters. A specific + set of arguments to convert to fit parameters can be specified by + specifying 'fit_parameters'. + """ + + # Attributes to hold the fit parameters and other arguments to pass + # to the model. These have to be defined across class because we are going + # to hijack __getattr__ and __setattr__ and need to look inside this as soon + # as we start setting attributes. + _param_df = pd.DataFrame({"name":[]}) + _non_fit_kwargs = {} + + def __init__(self, + model_to_fit, + fit_parameters=None, + non_fit_kwargs=None, + default_guess=0.0): + """ + Parameters + ---------- + model_to_fit : callable + a function or method to fit. + fit_parameters : list-like, optional + list of arguments to fit. + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for model_to_fit that should + be fit but need to be specified to non-default values. + default_guess : float, default=0 + assign parameters with no default value this value + """ + + # Make sure input model is callable + if not hasattr(model_to_fit,"__call__"): + err = f"'{model_to_fit}' should be callable\n" + raise ValueError(err) + + # Check fit_parameters + if fit_parameters is not None: + if not hasattr(fit_parameters,"__iter__") or issubclass(type(fit_parameters),str): + err = "fittable_parameters should be a list of parameter names\n" + raise ValueError(err) + + # check non_fit_kwargs + if non_fit_kwargs is not None: + if not issubclass(type(non_fit_kwargs),dict): + err = "non_fit_kwargs must be a dictionary of keyword arguments\n" + err += "to be passed to model_to_fit when the function is run.\n" + raise ValueError(err) + + self._default_guess = check_float(value=default_guess, + variable_name="default_guess") + + # Re-define these here so __setattr__ and __getattr__ end up looking at + # instance-level (__dict__) attributes rather than class-level + # attributes. + self._param_df = pd.DataFrame({"name":[]}) + self._non_fit_kwargs = {} + + self._load_model(model_to_fit=model_to_fit, + fit_parameters=fit_parameters, + non_fit_kwargs=non_fit_kwargs) + + + def _load_model(self,model_to_fit,fit_parameters,non_fit_kwargs): + """ + Load a model into the wrapper. Fittable arguments are put into param_df. + Non-fittable arguments are placed in the _non_fit_kwargs dictionary. + + Parameters + ---------- + model_to_fit : callable + a function or method to fit. + fit_parameters : list-like or None + list of parameters to fit + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for model_to_fit that should + be fit but need to be specified to non-default values. + """ + + self._model_to_fit = model_to_fit + + if non_fit_kwargs is None: + non_fit_kwargs = {} + + # Parse function arguments + all_args, can_be_fit, cannot_be_fit, has_kwargs = \ + analyze_fcn_sig(fcn=self._model_to_fit) + + # Decide which parameters are fittable and which are not + fit_parameters, not_fittable_parameters = \ + reconcile_fittable(fit_parameters=fit_parameters, + non_fit_kwargs=non_fit_kwargs, + all_args=all_args, + can_be_fit=can_be_fit, + cannot_be_fit=cannot_be_fit, + has_kwargs=has_kwargs) + + # Go through fittable params. + fit_param_names = [] + guesses = [] + for p in fit_parameters: + + fit_param_names.append(p) + + # if **kwargs is defined, p could be in fit_parameters but not in + # can_be_fit. + if p in can_be_fit: + guesses.append(can_be_fit[p]) + else: + guesses.append(None) + + # Remove any 'None' guesses and replace with default + final_guesses = [] + for g in guesses: + if g is None: + final_guesses.append(self._default_guess) + else: + final_guesses.append(g) + + # Fix the order of the fit parameters + self._fit_params_in_order = fit_param_names[:] + + # Build a param_df dataframe + param_df = pd.DataFrame({"name":fit_param_names, + "guess":final_guesses}) + self._param_df = validate_dataframe(param_df, + param_in_order=self._fit_params_in_order, + default_guess=self._default_guess) + + # Go through non-fittable parameters and record their keyword arguments + # in _non_fit_kwargs. Look in 'can_be_fit', then 'cannot_be_fit'. If + # no default argument from either of those, set to 'None'. Finally, + # look in 'non_fit_kwargs.' If defined here, it will take precedence + # over the default values. + self._non_fit_kwargs_keys = [] + for p in not_fittable_parameters: + + if p in can_be_fit: + non_fit_param_value = can_be_fit[p] + elif p in cannot_be_fit: + non_fit_param_value = cannot_be_fit[p] + else: + non_fit_param_value = None + + if p in non_fit_kwargs: + non_fit_param_value = non_fit_kwargs[p] + + self._non_fit_kwargs[p] = non_fit_param_value + self._non_fit_kwargs_keys.append(p) + + # This set holds the expected set of kwargs keys. This allows us to + # make sure the user does not add or remove a key with the setter. + self._non_fit_kwargs_keys = set(self._non_fit_kwargs_keys) + + # Finalize -- read to run the model + self.finalize_params() + + def _validate_non_fit_kwargs(self): + """ + Validate the current state of non_fit_kwargs + """ + + # Current state + current_non_fit_kwargs_keys = set(self._non_fit_kwargs) + + # If different from expected... + if current_non_fit_kwargs_keys != self._non_fit_kwargs_keys: + + err = "The keys in non_fit_kwargs have changed since initialization.\n" + err += "This is not allowed. Users can update the values passed\n" + err += "to the function by non_fit_kwargs, but not the keyword\n" + err += "arguments themselves.\n\n" + + extra_keys = current_non_fit_kwargs_keys.difference(self._non_fit_kwargs_keys) + if len(extra_keys) > 0: + err += f"extra keywords: {extra_keys}\n" + + missing_keys = self._non_fit_kwargs_keys.difference(current_non_fit_kwargs_keys) + if len(missing_keys) > 0: + err += f"missing keywords: {missing_keys}\n" + + raise ValueError(err) + + + def finalize_params(self): + """ + Validate current state of param_df and build map between parameters + and the model arguments. This will be called by a Fitter instance + before doing a fit. + """ + + # Make sure the parameter dataframe is sane. It could have problems + # because we let the user edit it directly. + self._param_df = validate_dataframe(param_df=self._param_df, + param_in_order=self._fit_params_in_order, + default_guess=self._default_guess) + + # Get currently un-fixed parameters + self._unfixed_mask = np.logical_not(self._param_df.loc[:,"fixed"]) + self._unfixed_param_names = np.array(self._param_df.loc[self._unfixed_mask,"name"]).copy() + + # Build a dictionary of keyword arguments to pass to the model when + # called. + self._mw_kwargs = {} + for p in self._fit_params_in_order: + self._mw_kwargs[p] = self._param_df.loc[p,"guess"] + + self._validate_non_fit_kwargs() + + self._mw_kwargs.update(self._non_fit_kwargs) + + + def update_params(self,param_input): + """ + Update the parameter features. + + Parameters + ---------- + param_input : pandas.DataFrame or dict or str + param_input should hold parameter features. If param_input is a + string, it will be treated as a filename and read by pandas (xslx, + csv, tsv, and txt are recognized). If param_input is a dataframe, + values will be read directly from the dataframe. If param_input is a + dict, it will be treated as a nested dictionary keying parameter + names to columns to values (param_input[parameter][column] -> value). + (Example: ``param_input={"K":{"guess":1.0}}`` would set the guess + for parameter "K" to 1.0). + + Notes + ----- + See the param_df docstring for details on parameter inputs. + + Parameter features specified in param_input will overwrite features in + param_df. Features *not* set in param_input will *not* alter existing + features in param_df. For example, you can safely specify a spreadsheet + with a 'guess' column without altering priors already set in param_df. + Or, you could send in a dictionary setting the lower_bound for a single + parameter without altering any other parameters. + """ + + # If a string, read as a spreadsheet + if issubclass(type(param_input),str): + param_input = read_spreadsheet(param_input) + + # Load the parameter input into the dataframe + param_df = param_into_existing(param_input=param_input, + param_df=self._param_df) + + # Validate the final dataframe and store it + self._param_df = validate_dataframe(param_df=param_df, + param_in_order=self._fit_params_in_order, + default_guess=self._default_guess) + + def model(self,params=None): + """ + Model observable. This function takes a numpy array either the number of + unfixed parameters long OR the total number of parameters long. If + parameters are fixed, their values in a params array with all fit + parameters are *ignored* and the fixed parameter guesses are used + instead. + + Parameters + ---------- + params : numpy.ndarray, optional + float numpy array with parameter values. If this is not specified, + the model is run using the parameter guess values. + """ + + # Update mapping between parameters and model arguments in case + # user has fixed value or made a change that has not propagated properly + self.finalize_params() + + # Create all param vector + all_params = np.array(self._param_df["guess"],dtype=float).copy() + + # no parameters specified, get all guesses + if params is None: + params = all_params + + # make sure the params array is a float array + params = np.array(params,dtype=float) + + # If this is as long as all_fit parameters, pull out only the fit + # parameters we care about. + if len(params) == len(all_params): + params = params[self._unfixed_mask] + + if len(params) != np.sum(self._unfixed_mask): + err = f"params length ({len(params)}) must either correspond to\n" + err += f"the total number of parameters ({len(self._param_df)})\n" + err += f"or the number of unfixed parameters ({np.sum(self._unfixed_mask)}).\n" + raise ValueError(err) + + # Update kwargs + for i in range(len(params)): + self._mw_kwargs[self._unfixed_param_names[i]] = params[i] + + try: + return self._model_to_fit(**self._mw_kwargs) + except Exception as e: + err = "\n\nThe wrapped model threw an error (see trace).\n\n" + raise RuntimeError(err) from e + + + def fast_model(self,params): + """ + Calculate model result with minimal error checking. params *must* be + an array the same length as the number of unfixed parameters. + + Parameters + ---------- + params : numpy.ndarray, optional + float numpy array the length of the number of unfixed parameters. + + Returns + ------- + out : numpy.ndarray + result of model(params) + """ + + # Update kwargs + for i in range(len(params)): + self._mw_kwargs[self._unfixed_param_names[i]] = params[i] + + return self._model_to_fit(**self._mw_kwargs) + + + @property + def param_df(self): + """ + Dataframe holding the fittable parameters in the model. This can be set + by ``mw.param_df = some_new_df``. It can also be edited in place + (e.g. ``mw.param_df.loc["K1","guess"] = 5``). + + The 'name' column is set when the dataframe is initialized. This defines + the names of the parameters, which cannot be changed later. The 'name' + column is used as the index for the dataframe. + + This dataframe will minimally have the following columns. Other + columns may be present if set by the user, but will be ignored. + + +---------------+-----------------------------------------------------+ + | key | value | + +===============+=====================================================+ + | 'name' | string name of the parameter. should not be changed | + | | by the user. | + +---------------+-----------------------------------------------------+ + | 'guess' | guess as single float value (must be non-nan and | + | | within bounds if specified) | + +---------------+-----------------------------------------------------+ + | 'fixed' | whether or not parameter can vary. True of False | + +---------------+-----------------------------------------------------+ + | 'lower_bound' | single float value; -np.inf allowed; None, nan or | + | | pd.NA interpreted as -np.inf. | + +---------------+-----------------------------------------------------+ + | 'upper_bound' | single float value; -np.inf allowed; None, nan or | + | | pd.NA interpreted as np.inf. | + +---------------+-----------------------------------------------------+ + | 'prior_mean' | single float value; np.nan allowed (see below) | + +---------------+-----------------------------------------------------+ + | 'prior_std' | single float value; np.nan allowed (see below) | + +---------------+-----------------------------------------------------+ + + Gaussian priors are specified using the 'prior_mean' and 'prior_std' + fields, declaring the prior mean and standard deviation. If both are + set to nan for a parameter, the prior is set to uniform between the + parameter bounds. If either 'prior_mean' or 'prior_std' is set to a + non-nan value, both must be non-nan to define the prior. When set, + 'prior_std' must be greater than zero. Neither can be np.inf. + """ + + return self._param_df + + @param_df.setter + def param_df(self,param_df): + + # Validate the parameter dataframe before setting it + self._param_df = validate_dataframe(param_df, + param_in_order=self._fit_params_in_order) + + @property + def non_fit_kwargs(self): + """ + A dictionary with the function keyword arguments that are not fit + paramters. + """ + + return self._non_fit_kwargs + + @property + def unfixed_mask(self): + """ + Mask for param_df that returns only floating (unfixed) parameters. + """ + + return self._unfixed_mask + + def __repr__(self): + """ + Useful summary of current model wrapper state. + """ + + self.finalize_params() + + out = [] + out = ["ModelWrapper\n------------\n"] + + # model name + out.append(f" wrapped_model: {self._model_to_fit.__name__}\n") + + # Non fittable arguments + out.append(f" non-fittable arguments:\n") + for p in self._non_fit_kwargs: + out.append(f" {p}:") + + # See if there are multiple lines on this repr... + variable_lines = repr(self._non_fit_kwargs[p]).split("\n") + if len(variable_lines) > 6: + to_add = variable_lines[:3] + to_add.append("...") + to_add.extend(variable_lines[-3:]) + else: + to_add = variable_lines + + for line in to_add: + out.append(f" {line}") + + out.append("\n") + + # Fittable arguments + out.append(f" fittable parameters:\n") + for dataframe_line in repr(self.param_df).split("\n"): + out.append(f" {dataframe_line}") + out.append("\n") + + return "\n".join(out) diff --git a/src/dataprob/model_wrapper/vector_model_wrapper.py b/src/dataprob/model_wrapper/vector_model_wrapper.py new file mode 100644 index 0000000..96405ff --- /dev/null +++ b/src/dataprob/model_wrapper/vector_model_wrapper.py @@ -0,0 +1,240 @@ +""" +Class for wrapping functions that use an array as their first argument for use +in likelihood calculations. +""" + +from dataprob.model_wrapper.model_wrapper import ModelWrapper + +from dataprob.model_wrapper._function_processing import analyze_vector_input_fcn +from dataprob.model_wrapper._dataframe_processing import validate_dataframe + + +from dataprob.util.check import check_float + +import numpy as np +import pandas as pd + +class VectorModelWrapper(ModelWrapper): + """ + Wrap a function that has an array as its first argument for use in + likelihood calculations. + """ + + def _load_model(self, + model_to_fit, + fit_parameters, + non_fit_kwargs): + """ + Load a model into the wrapper, putting all fittable parameters into the + param_df dataframe. Non-fittable arguments are set as attributes. + + Parameters + ---------- + model_to_fit : callable + a function or method to fit. + fit_parameters : list or dict + dictionary of fit parameters with guesses + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for model_to_fit that should + be fit but need to be specified to non-default values. + """ + + self._model_to_fit = model_to_fit + + # Parse function + param_arg, other_args, has_kwargs = analyze_vector_input_fcn(self._model_to_fit) + + # Make sure it has at least one argument + if param_arg is None: + err = f"model '{self._model_to_fit}' should take at least one argument\n" + raise ValueError(err) + + # Make sure fittable params has at least one param + try: + num_param = len(fit_parameters) + if num_param < 1: + raise ValueError + except Exception as e: + err = f"fit_parameters must be a list or dictionary with at least one\n" + err += "fittable parameter\n" + raise ValueError(err) from e + + # Make sure fittable param names do not conflict with argument param + # names + fit_set = set(fit_parameters) + args_set = set(other_args) + if len(fit_set.intersection(args_set)) > 0: + err = "fit_parameters must not include other arguments to the function\n" + raise ValueError(err) + + if param_arg in fit_parameters: + err = f"the first vector arg '{param_arg}' cannot be in fit_parameters.\n" + err += "fit_parameters should specify the names of every element\n" + err += "*within* this vector\n" + raise ValueError(err) + + # -------------------------------------------------------------------- + # Go through fittable params + + fit_param_names = [] + guesses = [] + for p in fit_parameters: + + # If a dictionary, grab the guess checking for float + if issubclass(type(fit_parameters),dict): + guess = check_float(value=fit_parameters[p], + variable_name=f"fit_parameters['{p}']") + + # If a list, set to default_guess + else: + guess = self._default_guess + + # Record fit parameter + fit_param_names.append(p) + guesses.append(guess) + + # Construct fit parameter dataframe + self._fit_params_in_order = fit_param_names[:] + param_df = pd.DataFrame({"name":fit_param_names, + "guess":guesses}) + self._param_df = validate_dataframe(param_df, + param_in_order=self._fit_params_in_order, + default_guess=self._default_guess) + + # -------------------------------------------------------------------- + # Deal with non_fit_kwargs + + # Construct not_fit_parameters from non_fit_kwargs keys + if non_fit_kwargs is not None: + not_fit_parameters = list(non_fit_kwargs.keys()) + else: + not_fit_parameters = [] + + # Make sure param_arg is not in not_fit_parameters + if param_arg in not_fit_parameters: + err = f"the first argument {param_arg} cannot be in non_fit_kwargs\n" + raise ValueError(err) + + # Go through non-fittable parameters. If they are not in other_args + # and the function does not have **kwargs, throw an error. + for p in not_fit_parameters: + if p not in other_args and not has_kwargs: + err = f"not_fittable parameter '{p}' is not in the function definition\n" + raise ValueError(err) + + # If we get here, overwrite whatever was in other_args (default from + # signature) with what hte user passed in. + other_args[p] = non_fit_kwargs[p] + + # Make sure that we don't have a situation where we have the same + # parameter name in both fittable and not_fittable + fittable_set = set(fit_parameters) + not_fittable_set = set(other_args) + intersect = fittable_set.intersection(not_fittable_set) + if len(intersect) != 0: + err = "a parameter cannot be in both fit_parameters and non_fit_kwargs.\n" + err += f"Bad parameters: {str(intersect)}\n" + raise ValueError(err) + + # Store the non fit parameter values. + self._non_fit_kwargs_keys = [] + for p in other_args: + self._non_fit_kwargs[p] = other_args[p] + self._non_fit_kwargs_keys.append(p) + + # This set holds the expected set of kwargs keys. This allows us to + # make sure the user does not add or remove a key with the setter. + self._non_fit_kwargs_keys = set(self._non_fit_kwargs_keys) + + # Finalize -- read to run the model + self.finalize_params() + + def finalize_params(self): + """ + Validate current state of param_df and build map between parameters + and the model arguments. This will be called by a Fitter instance + before doing a fit. + """ + + # Make sure the parameter dataframe is sane. It could have problems + # because we let the user edit it directly. + self._param_df = validate_dataframe(param_df=self._param_df, + param_in_order=self._fit_params_in_order, + default_guess=self._default_guess) + + # Get currently un-fixed parameters + self._unfixed_mask = np.array(np.logical_not(self._param_df["fixed"]),dtype=bool) + self._unfixed_param_names = np.array(self._param_df.loc[self._unfixed_mask,"name"]).copy() + + # Create all param vector + self._all_param_vector = np.array(self._param_df["guess"],dtype=float).copy() + + # Make sure the user has not altered non_fit_kwargs keys + self._validate_non_fit_kwargs() + + + def model(self,params=None): + """ + Model observable. This function takes a numpy array either the number of + unfixed parameters long OR the total number of parameters long. If + parameters are fixed, their values in a params array with all fit + parameters are *ignored* and the fixed parameter guesses are used + instead. + + Parameters + ---------- + params : numpy.ndarray, optional + float numpy array with parameter values. If this is not specified, + the model is run using the parameter guess values. + """ + + # Update mapping between parameters and model arguments in case + # user has fixed value or made a change that has not propagated properly + self.finalize_params() + + compiled_params = np.array(self._param_df["guess"],dtype=float).copy() + + if params is None: + params = compiled_params + + # make sure the params are a float array + params = np.array(params,dtype=float) + + # Copy in only unfixed params from full vector sent in + if len(params) == len(compiled_params): + compiled_params[self._unfixed_mask] = params[self._unfixed_mask] + + # Copy in all params into unfixed positions + elif len(params) == np.sum(self._unfixed_mask): + compiled_params[self._unfixed_mask] = params + else: + err = f"params length ({len(params)}) must either correspond to\n" + err += f"the total number of parameters ({len(self._param_df)})\n" + err += f"or the number of unfixed parameters ({np.sum(self._unfixed_mask)}).\n" + raise ValueError(err) + + try: + return self._model_to_fit(compiled_params, + **self._non_fit_kwargs) + except Exception as e: + err = "\n\nThe wrapped model threw an error (see trace).\n\n" + raise RuntimeError(err) from e + + def fast_model(self,params): + """ + Calculate model result with minimal error checking. + + Parameters + ---------- + params : numpy.ndarray + vector of unfixed parameter values + + Returns + ------- + out : numpy.ndarray + result of model(params) + """ + + self._all_param_vector[self._unfixed_mask] = params + return self._model_to_fit(self._all_param_vector, + **self._non_fit_kwargs) diff --git a/src/dataprob/model_wrapper/wrap_function.py b/src/dataprob/model_wrapper/wrap_function.py new file mode 100644 index 0000000..707c460 --- /dev/null +++ b/src/dataprob/model_wrapper/wrap_function.py @@ -0,0 +1,101 @@ +""" +Convenience function that initializes a ModelWrapper class from a user- +specified input function. +""" + +from dataprob.model_wrapper.model_wrapper import ModelWrapper +from dataprob.model_wrapper.vector_model_wrapper import VectorModelWrapper +from dataprob.util.read_spreadsheet import read_spreadsheet + +from dataprob.util.check import check_bool + +import pandas as pd + +def wrap_function(some_function, + fit_parameters=None, + non_fit_kwargs=None, + vector_first_arg=False): + """ + Wrap a function for regression or Bayesian sampling. + + Parameters + ---------- + some_function : callable + A function that takes at least one argument and returns a float numpy + array. Fitter objects will compare the outputs of this function against + y_obs. + fit_parameters : list, dict, str, pandas.DataFrame; optional + fit_parameters lets the user specify information about the parameters + in the fit. See Note below for details. + non_fit_kwargs : dict + non_fit_kwargs are keyword arguments for some_function that should not + be fit but need to be specified to non-default values. + vector_first_arg : bool, default=False + If True, the first argument of the function is taken as a vector of + parameters to fit. All other arguments to some_function are treated as + non-fittable parameters. fit_parameters must then specify the names of + each vector element. + + Returns + ------- + mw : ModelWrapper + ModelWrapper instance that can be used in a Fitter instance. + """ + + vector_first_arg = check_bool(value=vector_first_arg, + variable_name="vector_first_arg") + + # Select the appropriate ModelWrapper instance to use + if vector_first_arg: + mw_class = VectorModelWrapper + else: + mw_class = ModelWrapper + + # ------------------------------------------------------------------------- + # Figure out how to treat fit_parameters based on type + + fit_param_type = type(fit_parameters) + + if issubclass(fit_param_type,type(None)): + fit_param_list = None + fit_param_values = {} + + elif issubclass(fit_param_type,dict): + fit_param_list = list(fit_parameters.keys()) + fit_param_values = fit_parameters + + elif issubclass(fit_param_type,pd.DataFrame) or issubclass(fit_param_type,str): + + # Read fit_parameters spreadsheet (or get copy of dataframe) + fit_param_values = read_spreadsheet(fit_parameters) + if "name" not in fit_param_values.columns: + err = "fit_parameters DataFrame must have a 'name' column\n" + raise ValueError(err) + + # Get list of parameters from the dataframe + fit_param_list = list(fit_param_values["name"]) + + elif hasattr(fit_param_type,"__iter__"): + fit_param_list = fit_parameters + fit_param_values = {} + + else: + err = "fit_parameters not recognized. If specified, fit_parameters\n" + err += "must be a list, dictionary, pandas DataFrame, or filename\n" + err += "pointing to a spreadsheet. See the wrap_model docstring\n" + err += "for details.\n" + raise ValueError(err) + + + # Create class with appropriate parameters + mw = mw_class(model_to_fit=some_function, + fit_parameters=fit_param_list, + non_fit_kwargs=non_fit_kwargs) + + # Update fit parameters with values + mw.update_params(fit_param_values) + + return mw + + + \ No newline at end of file diff --git a/src/dataprob/plot/__init__.py b/src/dataprob/plot/__init__.py new file mode 100644 index 0000000..11c3b59 --- /dev/null +++ b/src/dataprob/plot/__init__.py @@ -0,0 +1,3 @@ +""" +Functions for plotting fit results. +""" diff --git a/src/dataprob/plot/_plot_utils.py b/src/dataprob/plot/_plot_utils.py new file mode 100644 index 0000000..16a8f45 --- /dev/null +++ b/src/dataprob/plot/_plot_utils.py @@ -0,0 +1,230 @@ +""" +Utility functions used internally by the plotting functions to calculate things +like the plot size, check variable types, etc. +""" + +from dataprob.util.check import check_int +from dataprob.plot import appearance + +import numpy as np + +import copy + +def get_plot_features(f, + x_label, + y_label, + num_samples): + """ + Get some generic information about plotting. + + Parameters + ---------- + f : Fitter + fitter for which fit() has successfully run + x_label : str or None + label for the x-axis. to omit, set to None + y_label : str or None + label for the y-axis. to omit, set to None + num_samples : int, default=50 + number of samples to plot + + Returns + ------- + x_label : str or None + validated x_label + y_label : str or None + validated y_label + num_samples : int + validated number of samples + """ + + # Make sure fit was successful before trying to plot anything + if not f.success: + err = "fit has not been successfully run. cannot generate plot.\n" + raise RuntimeError(err) + + if x_label is not None: + x_label = str(x_label) + + if y_label is not None: + y_label = str(y_label) + + num_samples = check_int(value=num_samples, + variable_name="num_samples", + minimum_allowed=0) + + if f.samples is None: + err = "could not get samples from this fit. cannot plot\n" + raise ValueError(err) + + if len(f.samples) < num_samples: + err = f"num_samples ({num_samples}) is more than the number of\n" + err += f"samples in the fitter ({len(f.samples)})\n" + raise ValueError(err) + + return x_label, y_label, num_samples + +def get_style(user_style,style_name): + """ + Validate and load some style dictionary. + + Parameters + ---------- + some_style : dict or None + user-specified style dictionary + some_style_name : str + name of style dictionary for error message + default_style : dict + dictionary holding default style information + + Returns + ------- + some_style : dict + dictionary with final style + """ + + if style_name not in appearance.default_styles: + err = f"style_name {style_name} was not found in appearance.default_styles\n" + err += "It should be one of:\n" + for k in appearance.default_styles: + err += f" {k}\n" + raise ValueError(err) + + output_style = copy.deepcopy(appearance.default_styles[style_name]) + + if user_style is None: + return output_style + + if not issubclass(type(user_style),dict): + err = f"{user_style} should be a dictionary of matplotlib plot styles\n" + raise ValueError(err) + + for k in user_style: + output_style[k] = user_style[k] + + return output_style + + +def get_vectors(f,x_axis=None): + """ + Get a set of vectors, all the same length, describing results. + + Parameters + ---------- + f : Fitter + fitter object for which fit has been run + x_axis : numpy.ndarray + numpy array the same length as f.data_df["y_obs"] that should be used + for the x-axis. if None, return a sequential array that is the right + length + + Returns + ------- + x_axis, y_obs, y_std, y_calc : numpy.ndarray + numpy arrays for the four indicated features + """ + + # Grab y_obs, y_std, y_calc + y_obs = np.array(f.data_df["y_obs"],dtype=float).copy() + y_std = np.array(f.data_df["y_std"],dtype=float).copy() + y_calc = np.array(f.data_df["y_calc"],dtype=float).copy() + + # If no x-axis sent in, build one + if x_axis is None: + x_axis = np.arange(len(y_obs),dtype=float) + + if len(x_axis) != len(y_obs): + err = "x_axis should be a numpy array the same length as y_obs\n" + raise ValueError(err) + + return x_axis, y_obs, y_std, y_calc + +def _get_edges(some_vector,scalar): + """ + Get buffered edges above the min and max of values in some_vector. + + Parameters + ---------- + some_vector : numpy array + array of non-nan values to bracket + scalar : float + fractional expansion to apply + + Returns + ------- + left : float + value for left-most edge + right : float + value for right-most edge + """ + + total_span = np.max(some_vector) - np.min(some_vector) + if total_span == 0: + err = "minimum and maximum of vector must differ\n" + raise ValueError(err) + + offset = total_span*scalar + + # Get left (or bottom) side + left = np.min(some_vector) - offset + + # Get right (or top) side + right = np.max(some_vector) + offset + + return left, right + +def get_plot_dimensions(x_values, + y_values, + scalar=0.05): + """ + Get the edges of a plot in matplotlib coordinates for drawing things based + on their fractional position. + + Parameters + ---------- + x_values : numpy.ndarray + numpy array of x_values that are being plotted + y_values : numpy.ndarray + numpy array of y_values that are being plotted + scalar : float, default = 0.05 + expand beyond the edges of x and y by this fraction + + Returns + ------- + x_left, x_right, y_bottom, y_top : float + far left, far right, far bottom, far top values for plotting. + """ + + x_left, x_right = _get_edges(x_values,scalar=scalar) + y_bottom, y_top = _get_edges(y_values,scalar=scalar) + + return x_left, x_right, y_bottom, y_top + + +def sync_axes(ax1,ax2,sync_axis): + """ + Synchronize the limits of two matplotlib.Axes objects. Sets to maximum + extent that covers both current axes. Update the axis objects in place. + + Parameters + ---------- + ax1, ax2: matplotlib.Axes, matplotlib.Axes + axes objects to sync + sync_axis : str + 'x' or 'y' -- which axis to synchronize between. + + Returns + ------- + None + """ + + getter = f"get_{sync_axis}lim" + lim1 = ax1.__getattribute__(getter)() + lim2 = ax2.__getattribute__(getter)() + + new_lim = [np.min([lim1[0],lim2[0]]), + np.max([lim1[1],lim2[1]])] + + setter = f"set_{sync_axis}lim" + ax1.__getattribute__(setter)(new_lim) + ax2.__getattribute__(setter)(new_lim) \ No newline at end of file diff --git a/src/dataprob/plot/appearance.py b/src/dataprob/plot/appearance.py new file mode 100644 index 0000000..2f0c2e4 --- /dev/null +++ b/src/dataprob/plot/appearance.py @@ -0,0 +1,50 @@ +""" +Styling information for dataprob plots. +""" + +default_styles = { + + "y_calc":{ + "linestyle":"-", + "color":"red", + "lw":2, + "zorder":10 + }, + "y_obs":{ + "marker":"o", + "markeredgecolor":"black", + "markerfacecolor":"none", + "markersize":4, + "lw":0, + "zorder":5 + }, + "y_std":{ + "lw":0, + "ecolor":"black", + "elinewidth":1, + "capsize":3, + "zorder":4 + }, + "sample_line":{ + "linestyle":"-", + "alpha":0.1, + "color":"black", + "zorder":0 + }, + "sample_point":{ + "marker":"o", + "alpha":0.1, + "markersize":4, + "markeredgecolor":"black", + "markerfacecolor":"gray", + "linewidth":0, + "zorder":0 + }, + "hist_bar":{ + "lw":1, + "edgecolor":"black", + "facecolor":"lightgray", + "zorder":5 + } + +} diff --git a/src/dataprob/plot/plot_corner.py b/src/dataprob/plot/plot_corner.py new file mode 100644 index 0000000..5a29d16 --- /dev/null +++ b/src/dataprob/plot/plot_corner.py @@ -0,0 +1,111 @@ +""" +Code to create a "corner plot" that shows distributions and correlations of +values for all fit parameters. +""" + +import corner +import numpy as np + +import re + +def plot_corner(f,filter_params=None,**kwargs): + """ + Create a "corner plot" that shows distributions and correlations of + values for all fit parameters. This can only be run if the analysis + has generated samples. + + Parameters + ---------- + f : dataprob.Fitter + dataprob.Fitter instance for which .fit() has been run + filter_params : list-like, optional + strings used to search parameter names. If a parameter name matches + one of the patterns, it is *not* plotted. + **kwargs : + any extra keyword arguments are passed directly to corner.corner + to tune formatting, etc. To learn more, ``import corner`` then + ``help(corner.corner)``. + + Returns + ------- + fig : matplotlib.Figure + matplotlib figure instance generated by calling corner.corner + """ + + # Make sure fit was successful before trying to plot anything + if not f.success: + err = "fit has not been successfully run. cannot generate plot.\n" + raise RuntimeError(err) + + # if filter parameters are not specified, no skip_pattern + if filter_params is None: + skip_pattern = None + + # otherwise + else: + + # If the user passes a string (instead of a list or tuple of patterns), + # convert it to a list up front. + if type(filter_params) is str: + filter_params = (filter_params,) + + # Make sure it's strings + filter_params = [str(p) for p in filter_params] + + # compile a pattern to look for + skip_pattern = re.compile("|".join(filter_params)) + + # Check for samples + if f.samples is None: + err = "Fit does not have samples. Could not generate a corner plot.\n" + raise RuntimeError(err) + + # Go through samples + keep_indexes = [] + corner_range = [] + names = [] + est_values = [] + for i in range(f.samples.shape[1]): + + idx = f.fit_df.index[i] + + # Get name and estimate + name = f.fit_df.loc[idx,"name"] + estimate = f.fit_df.loc[idx,"estimate"] + + # look for patterns to skip + if skip_pattern is not None and skip_pattern.search(name): + print("not doing corner plot for parameter ",name) + continue + + names.append(name) + keep_indexes.append(i) + + # use nanmin in case there is a failed sample in there somewhere + corner_range.append(tuple([np.nanmin(f.samples[:,i])-0.5, + np.nanmax(f.samples[:,i])+0.5])) + est_values.append(estimate) + + # make sure we kept at least one parameter + if len(keep_indexes) == 0: + err = "filter_params removed all parameters. Could not generate\n" + err += "corner plot\n" + raise ValueError(err) + + # Create array to plot samples + to_plot = f.samples[:,np.array(keep_indexes,dtype=int)] + + # Load labels, range, and truths into kwargs only if the user has not + # defined them as explicit kwargs. User corner.corner to check sanity + # of their inputs. + if "labels" not in kwargs: + kwargs["labels"] = names + if "range" not in kwargs: + kwargs["range"] = corner_range + if "truths" not in kwargs: + kwargs["truths"] = est_values + + # Call corner + fig = corner.corner(to_plot,**kwargs) + + return fig \ No newline at end of file diff --git a/src/dataprob/plot/plot_fit.py b/src/dataprob/plot/plot_fit.py new file mode 100644 index 0000000..ca061a6 --- /dev/null +++ b/src/dataprob/plot/plot_fit.py @@ -0,0 +1,124 @@ +""" +Function to plot the fit results as a line through y_obs points. +""" + +from dataprob.plot._plot_utils import get_plot_features +from dataprob.plot._plot_utils import get_style +from dataprob.plot._plot_utils import get_vectors + +import matplotlib +from matplotlib import pyplot as plt + +def plot_fit(f, + x_axis=None, + x_label=None, + y_label=None, + num_samples=50, + y_obs_style=None, + y_std_style=None, + y_calc_style=None, + sample_line_style=None, + legend=True, + ax=None): + """ + Plot the fit results as a line through y_obs points. + + Parameters + ---------- + f : dataprob.Fitter + dataprob.Fitter instance for which .fit() has been run + x_axis : list-like, optional + plot y_obs, y_std, and y_calc, against these x-axis values. If this + is not specified, plot against 0 -> len(y_obs)-1 + x_label : str, optional + label for the x-axis + y_label : str, optional + label for the y-axis + num_samples : int, default=50 + number of samples to plot. To not plot samples, set to 0. + y_obs_style : dict, optional + matplotlib plot style keys to override the defaults for y_obs. Used via + plt.plot(**y_obs_style). + y_std_style : dict, optional + matplotlib plot style keys to override the defaults for y_std. Used via + plt.errorbar(**y_std_style). + y_calc_style : dict, optional + matplotlib plot style here to override the defaults for y_calc. Used via + plt.plot(**y_calc_style). + sample_line_style : dict, optional + matplotlib plot style keys to override the defaults for samples lines + plt.plot(**sample_line_style). + legend : bool, default=True + add a legend to the plot + ax : matplotlib.Axes, optional + plot on a pre-defined axes + + Returns + ------- + fig, ax : matplotlib.Figure, matplotlib.Axes + matplotlib figure and axes on which the plot was done + """ + + # Validate inputs and prep for plotting + x_label, y_label, num_samples = get_plot_features(f, + x_label, + y_label, + num_samples) + + # Get styles for series + y_obs_style = get_style(y_obs_style,"y_obs") + y_std_style = get_style(y_std_style,"y_std") + y_calc_style = get_style(y_calc_style,"y_calc") + sample_line_style = get_style(sample_line_style,"sample_line") + + # Get series information (as numpy arrays) + x_axis, y_obs, y_std, y_calc = get_vectors(f,x_axis) + + # Define plot axis + if ax is None: + fig, ax = plt.subplots(1,figsize=(6,6)) + + if not issubclass(type(ax),matplotlib.axes.Axes): + err = "ax should be a matplotlib Axes instance\n" + raise ValueError(err) + + # Create core plot + ax.plot(x_axis,y_obs,**y_obs_style,label="y_obs") + ax.errorbar(x=x_axis,y=y_obs,yerr=y_std,**y_std_style) + ax.plot(x_axis,y_calc,**y_calc_style,label="y_calc") + + # Plot the samples + if num_samples > 0: + + # Get a sample dataframe + sample_df = f.get_sample_df(num_samples=num_samples) + + # Plot every sample column + label = "samples" + for c in sample_df.columns: + + # Skip y_obs, y_std, y_calc + if c[0] == "y": + continue + + # Grab sample + s = sample_df.loc[:,c] + + # Plot sample + ax.plot(x_axis,s,label=label,**sample_line_style) + + # After the first loop, turn off sample label to keep legend sane + if label == "samples": + label = None + + # plot legend if requested + if legend: + ax.legend() + + # Set labels + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + + fig = ax.get_figure() + + return fig, ax \ No newline at end of file diff --git a/src/dataprob/plot/plot_residuals.py b/src/dataprob/plot/plot_residuals.py new file mode 100644 index 0000000..b08c039 --- /dev/null +++ b/src/dataprob/plot/plot_residuals.py @@ -0,0 +1,177 @@ +""" +Function to plot the fit residuals. +""" + +from dataprob.plot._plot_utils import get_plot_features +from dataprob.plot._plot_utils import get_style +from dataprob.plot._plot_utils import get_vectors +from dataprob.plot._plot_utils import get_plot_dimensions +from dataprob.util.check import check_bool + +import matplotlib +from matplotlib import pyplot as plt +import numpy as np + +def plot_residuals(f, + x_axis=None, + x_label=None, + y_label=None, + num_samples=50, + y_obs_style=None, + y_std_style=None, + y_calc_style=None, + sample_point_style=None, + plot_y_residuals=False, + plot_unweighted=False, + ax=None): + """ + Plot the fit residuals. + + Parameters + ---------- + f : dataprob.Fitter + dataprob.Fitter instance for which .fit() has been run + x_axis : list-like, optional + plot y_obs, y_std, and y_calc, against these x-axis values. If this + is not specified, plot against 0 -> len(y_obs)-1 + x_label : str, default="x" + label for the x-axis. to omit, set to None + y_label : str, default="y" + label for the y-axis. to omit, set to None + num_samples : int, default=50 + number of samples to plot. To not plot samples, set to 0. + y_obs_style : dict, optional + matplotlib plot style keys to override the defaults for y_obs. Used via + plt.plot(**y_obs_style). + y_std_style : dict, optional + matplotlib plot style keys to override the defaults for y_std. Used via + plt.errorbar(**y_std_style). + y_calc_style : dict, optional + matplotlib plot style here to override the defaults for y_calc. Used via + plt.plot(**y_calc_style). + sample_point_style : dict, optional + matplotlib plot style keys to override the defaults for samples points + plt.plot(**sample_point_style). + plot_y_residuals : bool, default=False + the default plots residual vs. x-axis. if True, this plots y-obs vs. + residual + plot_unweighted : bool, default=False + plot unweighted (rather than weighted) residuals + ax : matplotlib.Axes, optional + plot on the pre-defined axes + + Returns + ------- + fig, ax : matplotib.Figure, matplotlib.Axes + matplotlib figure and axes on which the plot was done + """ + + x_label, y_label, num_samples = get_plot_features(f, + x_label, + y_label, + num_samples) + + # Get styles for series + y_obs_style = get_style(y_obs_style,"y_obs") + y_std_style = get_style(y_std_style,"y_std") + y_calc_style = get_style(y_calc_style,"y_calc") + sample_point_style = get_style(sample_point_style,"sample_point") + + x_axis, y_obs, y_std, _ = get_vectors(f,x_axis=x_axis) + + plot_y_residuals = check_bool(value=plot_y_residuals, + variable_name="plot_y_residuals") + + plot_unweighted = check_bool(value=plot_unweighted, + variable_name="plot_unweighted") + + # Get residual samples + if num_samples > 0: + + sample_df = f.get_sample_df(num_samples=num_samples) + + if plot_unweighted: + denominator = 1 + else: + denominator = y_std + + for c in sample_df.columns: + if c[0] == "y": continue # skip y_obs, etc. + sample_df[c] = (sample_df[c] - y_obs)/denominator + + + # ----------------------------------------------------------------------- + # Generate plot + + if ax is None: + fig, ax = plt.subplots(1,figsize=(6,6)) + + if not issubclass(type(ax),matplotlib.axes.Axes): + err = "ax should be a matplotlib Axes instance\n" + raise ValueError(err) + + if plot_unweighted: + residual = f.data_df["unweighted_residuals"] + else: + residual = f.data_df["weighted_residuals"] + + x_left, x_right, y_bottom, y_top = get_plot_dimensions(x_axis,y_obs) + mean_r = np.mean(residual) + + if plot_y_residuals: + + main_x = residual + main_y = y_obs + mean_x = [mean_r,mean_r] + mean_y = [y_bottom,y_top] + zero_x = [0,0] + zero_y = [y_bottom,y_top] + + sample_is_x = True + + + + else: + + main_x = x_axis + main_y = residual + mean_x = [x_left,x_right] + mean_y = [mean_r,mean_r] + zero_x = [x_left,x_right] + zero_y = [0,0] + sample_is_x = False + + + ax.plot(main_x,main_y,**y_obs_style) + ax.errorbar(x=main_x, + y=main_y, + yerr=y_std, + **y_std_style) + ax.plot(mean_x,mean_y,**y_calc_style) + ax.plot(zero_x,zero_y,'--',color="gray",zorder=0) + + if num_samples > 0: + + for c in sample_df.columns: + + if c[0] == "y": continue # skip y_obs, etc. + + s = sample_df[c] + + # Skip nan values + if np.sum(np.isnan(s)) > 0: + continue + + if sample_is_x: + ax.plot(s,main_y,**sample_point_style) + else: + ax.plot(main_x,s,**sample_point_style) + + + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + + fig = ax.get_figure() + + return fig, ax + \ No newline at end of file diff --git a/src/dataprob/plot/plot_residuals_hist.py b/src/dataprob/plot/plot_residuals_hist.py new file mode 100644 index 0000000..a59f87a --- /dev/null +++ b/src/dataprob/plot/plot_residuals_hist.py @@ -0,0 +1,113 @@ +""" +Function to plot a histogram of residuals. +""" + +from dataprob.util.check import check_bool +from dataprob.plot._plot_utils import get_plot_dimensions +from dataprob.plot._plot_utils import get_plot_features +from dataprob.plot._plot_utils import get_style + +import matplotlib +from matplotlib import pyplot as plt +import numpy as np + +def plot_residuals_hist(f, + x_label=None, + y_label=None, + hist_bins=None, + y_calc_style=None, + hist_bar_style=None, + plot_unweighted=False, + ax=None): + """ + Plot a histogram of residuals. + + Parameters + ---------- + f : dataprob.Fitter + dataprob.Fitter instance for which .fit() has been run + x_label : str, default="x" + label for the x-axis. to omit, set to None + y_label : str, default="y" + label for the y-axis. to omit, set to None + hist_bins : bool, optional + customize bins in histogram. if specified, this will be passed directly + to numpy.histogram via the "bins" argument. + y_calc_style : dict, optional + matplotlib plot style here to override the defaults for y_calc. Used via + plt.plot(**y_calc_style). + hist_bar_style : dict, optional + matplotlib plot style keys here to override the defaults for the + histogram bars. Used via plt.fill(**hist_bar_style). + plot_unweighted : bool, False + plot unweighted (rather than weighted) residuals + ax : matplotlib.Axes, optional + plot on the pre-defined axes + + Returns + ------- + fig, ax : matplotib.Figure, matplotlib.Axes + matplotlib figure and axes on which the plot was done + """ + + + # Validate inputs and prep for plotting + x_label, y_label, _ = get_plot_features(f, + x_label, + y_label, + num_samples=0) + + plot_unweighted = check_bool(value=plot_unweighted, + variable_name="plot_unweighted") + + y_calc_style = get_style(user_style=y_calc_style, + style_name="y_calc") + hist_bar_style = get_style(user_style=hist_bar_style, + style_name="hist_bar") + + # ----------------------------------------------------------------------- + # Generate plot + + # create ax + if ax is None: + fig, ax = plt.subplots(1,figsize=(6,6)) + + if not issubclass(type(ax),matplotlib.axes.Axes): + err = "ax should be a matplotlib Axes instance\n" + raise ValueError(err) + + # Figure out what to plot + if plot_unweighted: + residual = f.data_df["unweighted_residuals"] + else: + residual = f.data_df["weighted_residuals"] + + # Generate histogram + if hist_bins is not None: + counts, edges = np.histogram(residual,bins=hist_bins) + else: + counts, edges = np.histogram(residual) + + # Plot histogram bars + for i in range(len(counts)): + + box_x = [edges[i],edges[i],edges[i+1],edges[i+1]] + box_y = [0,counts[i],counts[i],0] + + ax.fill(box_x,box_y,**hist_bar_style) + + # Get positioning information + x_left, x_right, y_bottom, y_top = get_plot_dimensions(edges,counts) + + # Plot mean + m = np.mean(residual) + ax.plot([m,m],[y_bottom,y_top],**y_calc_style) + ax.plot([0,0],[y_bottom,y_top],'--',color="gray",zorder=6) + + # Set axis labels + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + + fig = ax.get_figure() + + return fig, ax \ No newline at end of file diff --git a/src/dataprob/plot/plot_summary.py b/src/dataprob/plot/plot_summary.py new file mode 100644 index 0000000..3212b5c --- /dev/null +++ b/src/dataprob/plot/plot_summary.py @@ -0,0 +1,153 @@ +""" +Function to generate summary plot for fit. +""" + +from dataprob.plot.plot_fit import plot_fit +from dataprob.plot.plot_residuals import plot_residuals +from dataprob.plot.plot_residuals_hist import plot_residuals_hist +from dataprob.plot._plot_utils import get_vectors +from dataprob.plot._plot_utils import sync_axes + +from matplotlib import pyplot as plt + +def plot_summary(f, + x_axis=None, + x_label=None, + y_label=None, + num_samples=50, + y_obs_style=None, + y_std_style=None, + y_calc_style=None, + sample_line_style=None, + sample_point_style=None, + hist_bar_style=None, + plot_unweighted=False): + """ + Create a fit summary plot showing the main fit and residuals. + + Parameters + ---------- + f : dataprob.Fitter + dataprob.Fitter instance for which .fit() has been run + x_axis : list-like, optional + plot y_obs, y_std, and y_calc, against these x-axis values. If this + is not specified, plot against 0 -> len(y_obs)-1 + x_label : str, optional + label for the x-axis + y_label : str, optional + label for the y-axis + num_samples : int, default=50 + number of samples to plot. To not plot samples, set to 0. + y_obs_style : dict, optional + matplotlib plot style keys to override the defaults for y_obs. Used via + plt.plot(**y_obs_style). + y_std_style : dict, optional + matplotlib plot style keys to override the defaults for y_std. Used via + plt.errorbar(**y_std_style). + y_calc_style : dict, optional + matplotlib plot style here to override the defaults for y_calc. Used via + plt.plot(**y_calc_style). + sample_line_style : dict, optional + matplotlib plot style keys to override the defaults for samples lines + plt.plot(**sample_line_style). + sample_point_style : dict, optional + matplotlib plot style keys to override the defaults for samples points + plt.plot(**sample_point_style). + hist_bar_style : dict, optional + matplotlib plot style keys here to override the defaults for the + histogram bars. Used via plt.fill(**hist_bar_style). + plot_unweighted : bool, default=False + plot unweighted (rather than weighted) residuals + + Returns + ------- + fig : matplotlib.figure.Figure + matplotlib Figure holding plot (with four gridspec axes) + """ + + + gs_kw = dict(width_ratios=[4,1], + height_ratios=[4,1]) + + fig, axd = plt.subplot_mosaic([['main_plot', 'y_residuals'], + ['x_residuals', 'residuals_hist']], + gridspec_kw=gs_kw, + figsize=(7.5, 7.5), + layout="tight") + + plot_fit(f, + x_axis=x_axis, + num_samples=num_samples, + y_obs_style=y_obs_style, + y_std_style=y_std_style, + y_calc_style=y_calc_style, + sample_line_style=sample_line_style, + legend=False, + ax=axd["main_plot"]) + + plot_residuals(f, + x_axis=x_axis, + num_samples=num_samples, + y_obs_style=y_obs_style, + y_std_style=y_std_style, + y_calc_style=y_calc_style, + sample_point_style=sample_point_style, + plot_y_residuals=False, + plot_unweighted=plot_unweighted, + ax=axd["x_residuals"]) + + plot_residuals(f, + num_samples=num_samples, + y_obs_style=y_obs_style, + y_std_style=y_std_style, + y_calc_style=y_calc_style, + sample_point_style=sample_point_style, + plot_y_residuals=True, + plot_unweighted=plot_unweighted, + ax=axd["y_residuals"]) + + plot_residuals_hist(f, + y_calc_style=y_calc_style, + hist_bar_style=hist_bar_style, + plot_unweighted=plot_unweighted, + ax=axd["residuals_hist"]) + + # sync limits for x-axis of main plot and x residuals + sync_axes(axd["main_plot"], + axd["x_residuals"], + sync_axis="x") + + # sync limits for y-axis of main plot and y residuals + sync_axes(axd["main_plot"], + axd["y_residuals"], + sync_axis="y") + + # sync limits for x-axis of residuals histogram and y residuals + sync_axes(axd["residuals_hist"], + axd["y_residuals"], + sync_axis="x") + + # Clean up axes and spines + axd["main_plot"].get_xaxis().set_visible(False) + axd["main_plot"].spines['right'].set_visible(False) + axd["main_plot"].spines['top'].set_visible(False) + axd["main_plot"].spines['bottom'].set_visible(False) + axd["main_plot"].set_ylabel(y_label) + + axd["x_residuals"].spines['right'].set_visible(False) + axd["x_residuals"].spines['top'].set_visible(False) + axd["x_residuals"].set_xlabel(x_label) + axd["x_residuals"].set_ylabel("residual") + + axd["y_residuals"].set_axis_off() + + axd["residuals_hist"].get_yaxis().set_visible(False) + axd["residuals_hist"].spines['right'].set_visible(False) + axd["residuals_hist"].spines['top'].set_visible(False) + axd["residuals_hist"].spines['left'].set_visible(False) + axd["residuals_hist"].set_xlabel("residual") + + fig.tight_layout() + + return fig + \ No newline at end of file diff --git a/src/dataprob/util/__init__.py b/src/dataprob/util/__init__.py new file mode 100644 index 0000000..c72f697 --- /dev/null +++ b/src/dataprob/util/__init__.py @@ -0,0 +1,4 @@ +""" +Utility functions used internally by the library to check variable types, do +file input output, etc. +""" \ No newline at end of file diff --git a/src/dataprob/check.py b/src/dataprob/util/check.py similarity index 74% rename from src/dataprob/check.py rename to src/dataprob/util/check.py index 1d758d4..77e2da5 100644 --- a/src/dataprob/check.py +++ b/src/dataprob/util/check.py @@ -4,8 +4,7 @@ """ import numpy as np - -import re +import pandas as pd def check_bool(value,variable_name=None): """ @@ -73,7 +72,8 @@ def check_float(value, minimum_allowed=-np.inf, maximum_allowed=np.inf, minimum_inclusive=True, - maximum_inclusive=True): + maximum_inclusive=True, + allow_nan=False): """ Process a `float` argument and do error checking. @@ -91,6 +91,8 @@ def check_float(value, whether lower bound is inclusive maximum_inclusive : bool, default=True whether upper bound is inclusive + allow_nan : bool, default=False + allow nan (or pd.NA or None), which are all coerced to np.nan Returns ------- @@ -103,6 +105,7 @@ def check_float(value, If value cannot be interpreted as a float """ + try: # Try to cast as string to an integer @@ -112,16 +115,20 @@ def check_float(value, # See if this is an iterable if hasattr(value,"__iter__"): raise ValueError - + # See if this is a naked type if issubclass(type(value),type): raise ValueError + + # If this is nan, null or None... If we are allowing nan, + # return nan and do not do further checks. Otherwise, throw an error + if pd.isnull(value) or value is None: + if allow_nan: + return np.nan + raise ValueError value = float(value) - if np.isnan(value): - raise ValueError - if minimum_inclusive: if value < minimum_allowed: raise ValueError @@ -269,7 +276,8 @@ def check_int(value, def check_array(value, variable_name=None, expected_shape=None, - expected_shape_names=None): + expected_shape_names=None, + nan_allowed=True): """ Do a sanity check on arguments that send in parameters (ln_like, etc.). @@ -285,6 +293,8 @@ def check_array(value, present but does not have a specified length expected_shape_names : str name of dimensions (string, for error message) + name_allowed : bool, default=True + if True, allow nan. If False, throw an error on nan Returns ------- @@ -308,11 +318,19 @@ def check_array(value, if not hasattr(value,"__iter__"): raise ValueError(err) + # Initial conversion to an object array, then filter pd.NA into np.nan. + # The initial conversion should eb extraordinarily robust. + value = np.array(value,dtype=object) + value[pd.isna(value)] = np.nan + + # Coerce to float (could have np.nan) try: value = np.array(value,dtype=float) except Exception as e: + err = f"{err} Could not coerce to a float numpy array\n" raise ValueError(err) from e + # Check final shape if expected_shape is not None: if len(value.shape) != len(expected_shape): @@ -323,79 +341,10 @@ def check_array(value, if value.shape[i] != expected_shape[i]: raise ValueError(err) - return value - - - -def column_to_bool(column,column_name): - """ - Convert a generic pandas column to bool. If already bool, just return. If - not, try to convert and return as a numpy bool array. - - Parameters - ---------- - column : pandas.Series - column from dataframe that should be boolean - column_name : str - name of column (for error message) - - Returns - ------- - column : numpy.array - boolean numpy array. - """ - - # Do a pass trying to infer the datatype of the column. (This is useful if - # we dropped empty rows that made the original pandas read this column in - # as a mix of bool and object). - column = column.infer_objects() - - # If it's not a boolean column, try to turn into one - if not np.dtype(column.dtypes) is np.dtype(bool): - - # Base message. If everything works great, let user know what - # happened as warning. If things go awry, use as start of error - # message - w = "\n\n" - w += f"The '{column_name}' column must be boolean (True/False). pandas\n" - w += "did not recognize the column as boolean, so we're parsing it\n" - w += "manually by looking for 0/1, yes/no, true/false, etc.\n\n" - - new_column = [] - look_for_true = re.compile("[1yt]",re.IGNORECASE) - look_for_false = re.compile("[0nf]",re.IGNORECASE) - for k in column: - if issubclass(type(k),bool): - is_true = True and k - is_false = not is_true - looks_like_a = "bool" - elif issubclass(type(k),str): - is_true = look_for_true.search(k) is not None - is_false = look_for_false.search(k) is not None - looks_like_a = "string" - elif issubclass(type(k),int): - is_true = (k != 0) - is_false = (k == 0) - looks_like_a = "int" - elif issubclass(type(k),float): - is_true = np.logical_not(np.isclose(k,0)) - is_false = np.isclose(k,0) - looks_like_a = "float" - else: - w += f"Could not figure out how to parse '{k}'\n\n" - raise ValueError(w) - - if (is_true and is_false) or (not is_true and not is_false): - w += f"Trying to parse '{k}' as a {looks_like_a}, but\n" - w += f"could not figure out whether true or false.\n\n" - raise ValueError(w) - else: - new_column.append(is_true) - - # Record newly boolean-ized values - column = np.array(new_column,dtype=bool) - - # Let user know we manually parsed the keep column... - print(w) + if not nan_allowed: + num_nan = np.sum(np.isnan(value)) + if num_nan > 0: + err = f"{err} without nan values. Array has {num_nan} nan entries.\n" + raise ValueError(err) - return column + return value diff --git a/src/dataprob/util/read_spreadsheet.py b/src/dataprob/util/read_spreadsheet.py new file mode 100644 index 0000000..177e7a4 --- /dev/null +++ b/src/dataprob/util/read_spreadsheet.py @@ -0,0 +1,53 @@ +""" +Code for dealing with spreadsheets in a user-friendly way. +""" + +import pandas as pd + +def read_spreadsheet(spreadsheet): + """ + Read a spreadsheet. Use pandas to read files of various types or, if + spreadsheet is already a dataframe, return a copy of the dataframe. + + Parameters + ---------- + spreadsheet : str or pandas.DataFrame + filename of spreadsheet to read or dataframe + + Returns + ------- + df : pandas.DataFrame + pandas dataframe read from filename or copied from input dataframe + """ + + # If this is a string, try to load it as a file + if issubclass(type(spreadsheet),str): + + filename = spreadsheet + + ext = filename.split(".")[-1].strip().lower() + + if ext in ["xlsx","xls"]: + df = pd.read_excel(filename) + elif ext == "csv": + df = pd.read_csv(filename,sep=",") + elif ext == "tsv": + df = pd.read_csv(filename,sep="\t") + else: + # Fall back -- try to guess delimiter + df = pd.read_csv(filename, + sep=None, + engine="python", + encoding="utf-8-sig") + + # If this is a pandas dataframe, create a copy of it. + elif issubclass(type(spreadsheet),pd.DataFrame): + df = spreadsheet.copy() + + # Otherwise, fail + else: + err = f"\n\n'spreadsheet' {spreadsheet} not recognized. Should be the\n" + err += "filename of a spreadsheet or a pandas dataframe.\n" + raise ValueError(err) + + return df diff --git a/tests/conftest.py b/tests/conftest.py index 415788e..97487d9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,102 @@ import pytest -import dataprob - import pandas as pd -import numpy as np -import os, json, pickle +import os +import json +import glob + +def get_files(base_dir): + """ + Traverse base_dir and return a dictionary that keys all files and some + rudimentary *.ext expressions to absolute paths to those files. They keys + will be things like "some_dir/test0/rocket.txt" mapping to + "c:/some_dir/life/base_dir/some_dir/test0/rocket.txt". The idea is to have + easy-to-read cross-platform keys within unit tests. + + Classes of keys: + + + some_dir/test0/rocket.txt maps to a file (str) + + some_dir/test0/ maps to the test0 directory itself (str) + + some_dir/test0/*.txt maps to all .txt (list) + + some_dir/test0/* maps to all files or directories in the directory + (list) + + Note that base_dir is *not* included in the keys. All are relative to that + directory by :code:`os.path.basename(__file__)/{base_dir}`. + + Parameters + ---------- + base_dir : str + base directory for search. should be relative to test file location. + + Returns + ------- + output : dict + dictionary keying string paths to absolute paths + """ + + containing_dir = os.path.dirname(os.path.realpath(__file__)) + starting_dir = os.path.abspath(os.path.join(containing_dir,base_dir)) + + base_length = len(starting_dir.split(os.sep)) + + # Traverse starting_dir + output = {} + for root, dirs, files in os.walk(starting_dir): + + # path relative to base_dir as a list + this_path = root.split(os.sep)[base_length:] + + # Build paths to specific files + local_files = [] + for file in files: + local_files.append(os.path.join(root,file)) + new_key = this_path[:] + new_key.append(file) + output["/".join(new_key)] = local_files[-1] + + # Build paths to patterns of file types + patterns = {} + ext = list(set([f.split(".")[-1] for f in local_files])) + for e in ext: + new_key = this_path[:] + new_key.append(f"*.{e}") + output["/".join(new_key)] = glob.glob(os.path.join(root,f"*.{e}")) + + # Build path to all files in this directory + new_key = this_path[:] + new_key.append("*") + output["/".join(new_key)] = glob.glob(os.path.join(root,f"*")) + + # Build paths to directories in this directory + for this_dir in dirs: + new_key = this_path[:] + new_key.append(this_dir) + # dir without terminating / + output["/".join(new_key)] = os.path.join(root,this_dir) + + # dir with terminating / + new_key.append("") + output["/".join(new_key)] = os.path.join(root,this_dir) + + # make sure output is sorted stably + for k in output: + if issubclass(type(output[k]),str): + continue + + new_output = list(output[k]) + new_output.sort() + output[k] = new_output + + return output + +@pytest.fixture(scope="module") +def spreadsheets(): + + files = get_files(os.path.join("test_data","spreadsheets")) + + return files @pytest.fixture(scope="module") def binding_curve_test_data(): @@ -15,7 +106,7 @@ def binding_curve_test_data(): # Find directory with test files base_dir = os.path.dirname(os.path.abspath(__file__)) - example_dir = os.path.abspath(os.path.join(base_dir,"examples")) + example_dir = os.path.abspath(os.path.join(base_dir,"test_data","binding_curve")) # Load json describing test informations json_file = os.path.join(example_dir,"binding-curves.json") @@ -26,22 +117,6 @@ def binding_curve_test_data(): f = os.path.join(example_dir,test_file) json_data["df"] = pd.read_csv(f,index_col=0) - # ------------------------------------------------------------ - # Generic method that can be fit (observable takes a single - # numpy array of arguments and returns an array of y_calc) - # ------------------------------------------------------------ - class BindingCurve: - """ - Pre-wrapped binding model. - """ - def __init__(self,X): - self.X = X - def observable(self,K): - return K[0]*self.X/(1 + K[0]*self.X) - - lm = BindingCurve(X=json_data["df"].X) - json_data["generic_model"] = lm.observable - # ------------------------------------------------------------ # Save a model that should be readily wrapped by ModelWrapper # ------------------------------------------------------------ @@ -50,19 +125,10 @@ def wrappable_model(K=1,df=None): """ A form of the model that should be wrappable by ModelWrapper. """ - return K*df.X/(1 + K*df.X) + return K*df.x/(1 + K*df.x) json_data["wrappable_model"] = wrappable_model - def model_to_test_wrap(K1,K2=20,extra_stuff="test",K3=42): - - K1 = float(K1) - K2 = float(K2) - K3 = float(K3) - - return K1*K2*K3 - - json_data["model_to_test_wrap"] = model_to_test_wrap return json_data @@ -73,58 +139,7 @@ def fit_tolerance_fixture(): """ return 0.1 -@pytest.fixture(scope="module") -def fitter_object(binding_curve_test_data): - """ - Do a successful fit that can be passed into other functions - """ - - out_dict = {} - - # Do a generic fit where the input function (generic_model) is run without - # an intervening ModelWrapper - - generic_fit = dataprob.MLFitter() - - model = binding_curve_test_data["generic_model"] - guesses = binding_curve_test_data["guesses"] - df = binding_curve_test_data["df"] - - generic_fit.fit(model=model, - guesses=guesses, - y_obs=df.Y) - - if not generic_fit.success: - raise RuntimeError("generic test fit did not converge!") - - out_dict["generic_fit"] = generic_fit - - # Do a fit where the input function is wrapped by ModelWrapper - - wrapped_fit = dataprob.MLFitter() - - model = binding_curve_test_data["wrappable_model"] - model = dataprob.ModelWrapper(model) - df = binding_curve_test_data["df"] - model.df = df - - guesses = binding_curve_test_data["guesses"] - - - wrapped_fit.fit(model=model, - guesses=guesses, - y_obs=df.Y) - - if not wrapped_fit.success: - raise RuntimeError("wrapped test fit did not converge!") - - out_dict["wrapped_fit"] = wrapped_fit - - - return out_dict - ## Code for skipping slow tests. - def pytest_addoption(parser): parser.addoption("--runslow", action="store_true", diff --git a/tests/dataprob/fitters/bayesian/test__prior_processing.py b/tests/dataprob/fitters/bayesian/test__prior_processing.py new file mode 100644 index 0000000..549afb8 --- /dev/null +++ b/tests/dataprob/fitters/bayesian/test__prior_processing.py @@ -0,0 +1,604 @@ + +import pytest + + +from dataprob.fitters.bayesian._prior_processing import find_normalization +from dataprob.fitters.bayesian._prior_processing import reconcile_bounds_and_priors +from dataprob.fitters.bayesian._prior_processing import find_uniform_value +from dataprob.fitters.bayesian._prior_processing import _sample_gaussian +from dataprob.fitters.bayesian._prior_processing import _cover_uniform +from dataprob.fitters.bayesian._prior_processing import create_walkers +from dataprob.model_wrapper.model_wrapper import ModelWrapper + +import numpy as np +from scipy import stats + +def test__find_normalization(): + + # Calculate cdf and pdf over different interval (and in slightly different + # way). Make sure the log_pdf is within 1% of log_cdf ground truth. + for scale in np.power(10.0,np.arange(-5,6)): + + frozen_rv = stats.norm(loc=0,scale=scale) + res = np.finfo(frozen_rv.pdf(0).dtype).resolution + offset = find_normalization(scale=scale, + rv=stats.norm) + + cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) + pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) + if cdf == 0 or pdf == 0: + print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") + continue + + log_cdf = np.log(cdf) + log_pdf = np.log(pdf) + offset + + pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) + + print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) + + assert pct_diff < 0.01 + + # Calculate cdf and pdf over different interval (and in slightly different + # way). Make sure the log_pdf is within 1% of log_cdf ground truth. Move + # loc to make sure it still works + loc = 3 + for scale in np.power(10.0,np.arange(-1,6)): + + frozen_rv = stats.norm(loc=loc,scale=scale) + res = np.finfo(frozen_rv.pdf(loc).dtype).resolution + offset = find_normalization(scale=scale, + rv=stats.norm) + + cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) + pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) + if cdf == 0 or pdf == 0: + print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") + continue + + log_cdf = np.log(cdf) + log_pdf = np.log(pdf) + offset + + pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) + + print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) + + assert pct_diff < 0.01 + + # Calculate cdf and pdf over different interval (and in slightly different + # way). Make sure the log_pdf is within 1% of log_cdf ground truth. Move + # loc to make sure it still works + loc = -3 + for scale in np.power(10.0,np.arange(8)): + + frozen_rv = stats.norm(loc=loc,scale=scale) + res = np.finfo(frozen_rv.pdf(loc).dtype).resolution + offset = find_normalization(scale=scale, + rv=stats.norm) + + cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) + pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) + if cdf == 0 or pdf == 0: + print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") + continue + + log_cdf = np.log(cdf) + log_pdf = np.log(pdf) + offset + + pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) + + print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) + + assert pct_diff < 0.01 + + +def test__reconcile_bounds_and_priors(): + + frozen_rv = stats.norm(loc=0,scale=1) + + res = np.finfo(frozen_rv.pdf(0).dtype).resolution + + result = reconcile_bounds_and_priors(bounds=None,frozen_rv=frozen_rv) + assert result == 0 + + same_bounds = [[-1,-1],[0,0],[1,1]] + for bounds in same_bounds: + with pytest.warns(): + v = reconcile_bounds_and_priors(bounds=bounds,frozen_rv=frozen_rv) + assert v == 0 + + frozen_rv = stats.norm(loc=0,scale=0.001) + left = frozen_rv.cdf(1) + for i in range(1,50): + + # Find a divisor of res that is sufficient to make the cdf different + right = frozen_rv.cdf(1 + res/i) + if left == right: + super_close_bounds = [1,1+res/i] + + # If the bounds are the same within numerical error, we can't do this + # test -- break out + if super_close_bounds[0] == super_close_bounds[1]: + break + + print(f"Testing {super_close_bounds}") + + # Make sure the function warns they are numerically identical and + # returns infinity + with pytest.warns(): + v = reconcile_bounds_and_priors(bounds=super_close_bounds, + frozen_rv=frozen_rv) + assert v == 0 + + break + + frozen_rv = stats.norm(loc=0,scale=1) + v = reconcile_bounds_and_priors(bounds=[-1,1],frozen_rv=frozen_rv) + expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(1)))) + + frozen_rv = stats.norm(loc=0,scale=1) + v = reconcile_bounds_and_priors(bounds=[0,1],frozen_rv=frozen_rv) + expected = np.log(1/(1 - (frozen_rv.cdf(0) + frozen_rv.sf(1)))) + + frozen_rv = stats.norm(loc=0,scale=1) + v = reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) + expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) + + frozen_rv = stats.norm(loc=0,scale=10) + v = reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) + expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) + + frozen_rv = stats.norm(loc=-2,scale=10) + v = reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) + expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) + + assert np.isclose(v,expected) + +def test__find_uniform_value(): + + finfo = np.finfo(np.ones(1,dtype=float)[0].dtype) + log_resolution = np.log(finfo.resolution) + log_max = np.log(finfo.max) + max_value = finfo.max + + bounds = None + expected_value = log_resolution - (np.log(2) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [-np.inf,np.inf] + expected_value = log_resolution - (np.log(2) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = np.array([0,1]) + expected_value = log_resolution - np.log((bounds[1] - bounds[0])) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + with pytest.warns(): + v = find_uniform_value([1,1]) + assert v == 0.0 + + bounds = [-np.inf,0] + expected_value = log_resolution - (log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [-np.inf,-max_value/2] + expected_value = log_resolution - (np.log(0.5) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [-np.inf,max_value/2] + expected_value = log_resolution - (np.log(1.5) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [0,np.inf] + expected_value = log_resolution - (log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [max_value/2,np.inf] + expected_value = log_resolution - (np.log(0.5) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + + bounds = [-max_value/2,np.inf] + expected_value = log_resolution - (np.log(1.5) + log_max) + value = find_uniform_value(bounds) + assert np.isclose(value,expected_value) + +def test__sample_gaussian(): + + # Generate with mean and std + gaussian_priors = _sample_gaussian(prior_mean=1, + prior_std=2, + lower_bound=-np.inf, + upper_bound=np.inf, + num_walkers=10000) + m = np.round(np.mean(gaussian_priors),0) + s = np.round(np.std(gaussian_priors),0) + assert np.allclose([m,s],[1,2]) + assert gaussian_priors.shape == (10000,) + + # Move mean and std + gaussian_priors = _sample_gaussian(prior_mean=-1, + prior_std=1, + lower_bound=-np.inf, + upper_bound=np.inf, + num_walkers=10000) + m = np.round(np.mean(gaussian_priors),0) + s = np.round(np.std(gaussian_priors),0) + assert np.allclose([m,s],[-1,1]) + assert gaussian_priors.shape == (10000,) + + # Crunch with very tight lower and upper bound --> should return None + gaussian_priors = _sample_gaussian(prior_mean=0, + prior_std=1, + lower_bound=-0.00001, + upper_bound=0.00001, + num_walkers=10) + assert gaussian_priors is None + + +def test__cover_uniform(): + + # --------------------------------------------------------------------- + # should create four walkers with "simple" case because both are on the + # same side of zero + walkers = _cover_uniform(lower_bound=1e6, + upper_bound=1e9, + num_walkers=4, + infinity_proxy=1e9) + + s = np.exp(np.linspace(0,10,4)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + expected = s*(1e9 - 1e6) + 1e6 + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "simple" case because both are on the + # same side of zero + walkers = _cover_uniform(lower_bound=-1e9, + upper_bound=-1e6, + num_walkers=4, + infinity_proxy=1e9) + + s = np.exp(np.linspace(0,10,4)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + expected = s*(-1e6 - -1e9) + -1e9 + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "simple" case because both are on the + # same side of zero. Should use 1e10 because of infinity proxy + walkers = _cover_uniform(lower_bound=1e6, + upper_bound=np.inf, + num_walkers=4, + infinity_proxy=1e10) + + s = np.exp(np.linspace(0,10,4)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + expected = s*(1e10 - 1e6) + 1e6 + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "simple" case because both are on the + # same side of zero. Should use 1e10 because of infinity proxy + walkers = _cover_uniform(lower_bound=0, + upper_bound=np.inf, + num_walkers=4, + infinity_proxy=1e10) + + s = np.exp(np.linspace(0,10,4)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + expected = s*(1e10 - 0) + 0 + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "simple" case because both are on the + # same side of zero. Should use 1e10 because of infinity proxy + walkers = _cover_uniform(lower_bound=-np.inf, + upper_bound=0, + num_walkers=4, + infinity_proxy=1e10) + + s = np.exp(np.linspace(0,10,4)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + expected = s*(0 - -1e10) + -1e10 + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create single walker at mean position because only one walker + # requested + walkers = _cover_uniform(lower_bound=-1e9, + upper_bound=1e9, + num_walkers=1, + infinity_proxy=1e9) + + expected = [0] + assert np.allclose(expected,walkers) + + # --------------------------------------------------------------------- + # should create single walker at mean position because only one walker + # requested + walkers = _cover_uniform(lower_bound=1, + upper_bound=3, + num_walkers=1, + infinity_proxy=1e9) + + expected = [2] + assert np.allclose(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "complicated" case because wee're on + # opposite sides of zero + walkers = _cover_uniform(lower_bound=-np.inf, + upper_bound=np.inf, + num_walkers=4, + infinity_proxy=1e10) + + # Two below + s = np.exp(np.linspace(0,10,2)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + below = s*-1e10 + + # Two above + t = np.exp(np.linspace(0,10,2)) + t = (t - np.min(t))/(np.max(t) - np.min(t)) + above = t*1e10 + + # Get expected + expected = list(below) + expected.extend(list(above)) + expected = np.array(expected) + expected = np.sort(expected) + + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "complicated" case because wee're on + # opposite sides of zero + walkers = _cover_uniform(lower_bound=-1, + upper_bound=np.inf, + num_walkers=4, + infinity_proxy=1e10) + + # One below + below = [-1] + + # Three above + t = np.exp(np.linspace(0,10,3)) + t = (t - np.min(t))/(np.max(t) - np.min(t)) + above = t*1e10 + + # Get expected + expected = list(below) + expected.extend(list(above)) + expected = np.array(expected) + expected = np.sort(expected) + + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + # --------------------------------------------------------------------- + # should create four walkers with "complicated" case because wee're on + # opposite sides of zero + walkers = _cover_uniform(lower_bound=-np.inf, + upper_bound=1, + num_walkers=4, + infinity_proxy=1e10) + + # Three below + s = np.exp(np.linspace(0,10,3)) + s = (s - np.min(s))/(np.max(s) - np.min(s)) + below = s*-1e10 + + # One above + above = [1] + + # Get expected + expected = list(below) + expected.extend(list(above)) + expected = np.array(expected) + expected = np.sort(expected) + + walkers = np.sort(walkers) + assert np.array_equal(expected,walkers) + + + walkers = _cover_uniform(lower_bound=-1, + upper_bound=0, + num_walkers=1000, + infinity_proxy=1e9) + +def test_create_walkers(): + + # test function to use + def test_fcn(a,b,c): return a*b*c + + # --------------------------------------------------------------------- + # Create a lot of walkers with gaussian priors and make sure the sampling + # occurred properly + + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"prior_mean"] = [1,10,100] + mw.param_df.loc[:,"prior_std"] = [3,2,1] + mw.finalize_params() + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + assert walkers.shape == (1000,3) + assert np.isclose(np.round(np.mean(walkers[:,0]),0),1) + assert np.isclose(np.round(np.mean(walkers[:,1]),0),10) + assert np.isclose(np.round(np.mean(walkers[:,2]),0),100) + + assert np.isclose(np.round(np.std(walkers[:,0]),0),3) + assert np.isclose(np.round(np.std(walkers[:,1]),0),2) + assert np.isclose(np.round(np.std(walkers[:,2]),0),1) + + # --------------------------------------------------------------------- + # fix a parameter and make sure it's ignored + + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"prior_mean"] = [1,10,100] + mw.param_df.loc[:,"prior_std"] = [3,2,1] + mw.param_df.loc["a","fixed"] = True + mw.finalize_params() + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + assert walkers.shape == (1000,2) + assert np.isclose(np.round(np.mean(walkers[:,0]),0),10) + assert np.isclose(np.round(np.mean(walkers[:,1]),0),100) + + assert np.isclose(np.round(np.std(walkers[:,0]),0),2) + assert np.isclose(np.round(np.std(walkers[:,1]),0),1) + + # --------------------------------------------------------------------- + # uniform priors spanning 0 + + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"lower_bound"] = [-1,-2,-3] + mw.param_df.loc[:,"upper_bound"] = [1,2,3] + mw.finalize_params() + assert np.sum(np.isnan(mw.param_df["prior_mean"])) == 3 + assert np.sum(np.isnan(mw.param_df["prior_std"])) == 3 + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + + # make sure we're sampling a big whack of the space, but only that space + assert np.min(walkers[:,0]) >= -1 + assert np.min(walkers[:,0]) < -0.9 + assert np.max(walkers[:,0]) <= 1 + assert np.max(walkers[:,0]) > 0.9 + + assert np.min(walkers[:,1]) >= -2 + assert np.min(walkers[:,1]) < -1.9 + assert np.max(walkers[:,1]) <= 2 + assert np.max(walkers[:,1]) > 1.9 + + assert np.min(walkers[:,2]) >= -3 + assert np.min(walkers[:,2]) < -2.9 + assert np.max(walkers[:,2]) <= 3 + assert np.max(walkers[:,2]) > 2.9 + + # --------------------------------------------------------------------- + # uniform priors below zero (important to check because slightly different + # algorithm for uniform priors spanning zero vs. being on one side) + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"lower_bound"] = [-1,-2,-3] + mw.param_df.loc[:,"upper_bound"] = [0,0,0] + mw.finalize_params() + assert np.sum(np.isnan(mw.param_df["prior_mean"])) == 3 + assert np.sum(np.isnan(mw.param_df["prior_std"])) == 3 + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + + # make sure we're sampling a big whack of the space, but only that space + assert np.min(walkers[:,0]) >= -1 + assert np.min(walkers[:,0]) < -0.9 + assert np.max(walkers[:,0]) <= 0 + assert np.max(walkers[:,0]) > -0.1 + + assert np.min(walkers[:,1]) >= -2 + assert np.min(walkers[:,1]) < -1.9 + assert np.max(walkers[:,1]) <= 0 + assert np.max(walkers[:,1]) > -0.1 + + assert np.min(walkers[:,2]) >= -3 + assert np.min(walkers[:,2]) < -2.9 + assert np.max(walkers[:,2]) <= 0 + assert np.max(walkers[:,2]) > -0.1 + + # --------------------------------------------------------------------- + # uniform priors above zero (important to check because slightly different + # algorithm for uniform priors spanning zero vs. being on one side) + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"lower_bound"] = [0,0,0] + mw.param_df.loc[:,"upper_bound"] = [1,2,3] + mw.finalize_params() + assert np.sum(np.isnan(mw.param_df["prior_mean"])) == 3 + assert np.sum(np.isnan(mw.param_df["prior_std"])) == 3 + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + + # make sure we're sampling a big whack of the space, but only that space + assert np.min(walkers[:,0]) >= 0.0 + assert np.min(walkers[:,0]) < 0.1 + assert np.max(walkers[:,0]) <= 1.0 + assert np.max(walkers[:,0]) > 0.9 + + assert np.min(walkers[:,1]) >= 0.0 + assert np.min(walkers[:,1]) < 0.1 + assert np.max(walkers[:,1]) <= 2.0 + assert np.max(walkers[:,1]) > 1.9 + + assert np.min(walkers[:,2]) >= 0.0 + assert np.min(walkers[:,2]) < 0.1 + assert np.max(walkers[:,2]) <= 3.0 + assert np.max(walkers[:,2]) > 2.9 + + + # --------------------------------------------------------------------- + # gaussian priors that have tiny bounds and thus become uniform + + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"prior_mean"] = 0 + mw.param_df.loc[:,"prior_std"] = 3 + mw.param_df.loc[:,"lower_bound"] = -0.0001 + mw.param_df.loc[:,"upper_bound"] = 0.0001 + mw.finalize_params() + assert np.sum(np.isnan(mw.param_df["prior_mean"])) == 0 + assert np.sum(np.isnan(mw.param_df["prior_std"])) == 0 + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + + assert np.min(walkers[:,0]) >= -0.0001 + assert np.max(walkers[:,0]) <= 0.0001 + + # --------------------------------------------------------------------- + # mix of gaussian and uniform priors + + mw = ModelWrapper(test_fcn) + mw.param_df.loc[:,"guess"] = [0,0,1.5] + mw.param_df.loc[:,"prior_mean"] = [0,np.nan,np.nan] + mw.param_df.loc[:,"prior_std"] = [1,np.nan,np.nan] + mw.param_df.loc[:,"lower_bound"] = [-np.inf,-1,1] + mw.param_df.loc[:,"upper_bound"] = [np.inf,1,2] + mw.finalize_params() + assert np.sum(np.isnan(mw.param_df["prior_mean"])) == 2 + assert np.sum(np.isnan(mw.param_df["prior_std"])) == 2 + + walkers = create_walkers(param_df=mw.param_df, + num_walkers=1000) + + assert np.isclose(np.round(np.mean(walkers[:,0]),0),0) + assert np.isclose(np.round(np.std(walkers[:,0]),0),1) + + assert np.min(walkers[:,1]) >= -1.0 + assert np.min(walkers[:,1]) < -0.9 + assert np.max(walkers[:,1]) <= 1.0 + assert np.max(walkers[:,1]) > 0.9 + + assert np.min(walkers[:,2]) >= 1.0 + assert np.min(walkers[:,2]) < 1.1 + assert np.max(walkers[:,2]) <= 2.0 + assert np.max(walkers[:,2]) > 1.9 + + + + + diff --git a/tests/dataprob/fitters/bayesian/test_bayesian_sampler.py b/tests/dataprob/fitters/bayesian/test_bayesian_sampler.py new file mode 100644 index 0000000..220e8c4 --- /dev/null +++ b/tests/dataprob/fitters/bayesian/test_bayesian_sampler.py @@ -0,0 +1,798 @@ + +import pytest + +import numpy as np +import pandas as pd +from scipy import stats +import emcee + +from dataprob.fitters.bayesian.bayesian_sampler import BayesianSampler +from dataprob.fitters.bayesian._prior_processing import find_normalization +from dataprob.fitters.bayesian._prior_processing import reconcile_bounds_and_priors +from dataprob.fitters.bayesian._prior_processing import find_uniform_value + +from dataprob.model_wrapper.model_wrapper import ModelWrapper + + +def test_BayesianSampler__init__(): + + def test_fcn(a,b): return a*b + + # default args work. check to make sure super().__init__ actually ran. + f = BayesianSampler(some_function=test_fcn) + assert f.num_obs is None + +def test__setup_priors(): + + # Two parameter test function to wrap + def test_fcn(a=1,b=2): return a*b + + # ---------------------------------------------------------------------- + # basic functionality with a uniform and gaussian prior + + f = BayesianSampler(some_function=test_fcn) + assert not hasattr(f,"_prior_frozen_rv") + assert not hasattr(f,"_uniform_priors") + assert not hasattr(f,"_gauss_prior_means") + assert not hasattr(f,"_gauss_prior_stds") + assert not hasattr(f,"_gauss_prior_offsets") + assert not hasattr(f,"_gauss_prior_mask") + assert not hasattr(f,"_lower_bounds") + assert not hasattr(f,"_upper_bounds") + + # Load model and set priors & bounds + f.param_df["prior_mean"] = [0,np.nan] + f.param_df["prior_std"] = [1,np.nan] + f.param_df["lower_bound"] = [-np.inf,-np.inf] + f.param_df["upper_bound"] = [np.inf,np.inf] + f._model.finalize_params() + + f._setup_priors() + + assert f._prior_frozen_rv is not None + assert np.isclose(stats.norm(loc=0,scale=1).logpdf(0), + f._prior_frozen_rv.logpdf(0)) + assert issubclass(type(f._uniform_priors),float) + assert f._uniform_priors < 0 + + assert len(f._gauss_prior_means) == 1 + assert f._gauss_prior_means[0] == 0 + assert len(f._gauss_prior_stds) == 1 + assert f._gauss_prior_stds[0] == 1 + assert len(f._gauss_prior_offsets) == 1 + assert f._gauss_prior_offsets[0] < 0 + assert np.array_equal(f._gauss_prior_mask,[True,False]) + + # ---------------------------------------------------------------------- + # No gaussian priors + + # Load model and set priors & bounds + f = BayesianSampler(some_function=test_fcn) + f.param_df["prior_mean"] = [np.nan,np.nan] + f.param_df["prior_std"] = [np.nan,np.nan] + f.param_df["lower_bound"] = [-np.inf,-np.inf] + f.param_df["upper_bound"] = [np.inf,np.inf] + f._model.finalize_params() + + f._setup_priors() + + assert len(f._gauss_prior_means) == 0 + assert len(f._gauss_prior_stds) == 0 + assert len(f._gauss_prior_offsets) == 0 + assert np.array_equal(f._gauss_prior_mask,[False,False]) + + # ---------------------------------------------------------------------- + # No uniform priors + + # Load model and set priors & bounds + f = BayesianSampler(some_function=test_fcn) + f.param_df["prior_mean"] = [1.0,2.0] + f.param_df["prior_std"] = [3.0,4.0] + f.param_df["lower_bound"] = [-np.inf,-np.inf] + f.param_df["upper_bound"] = [np.inf,np.inf] + f._model.finalize_params() + + f._setup_priors() + + assert np.isclose(f._uniform_priors,0) + assert np.allclose(f._gauss_prior_means,[1.0,2.0]) + assert np.allclose(f._gauss_prior_stds,[3.0,4.0]) + assert len(f._gauss_prior_offsets) == 2 + assert np.sum(f._gauss_prior_offsets < 0) == 2 + assert np.array_equal(f._gauss_prior_mask,[True,True]) + + # ---------------------------------------------------------------------- + # Two gauss, two uniform, one of each fixed + + def four_param(a,b,c,d): return a*b*c*d + + # Load model and set priors & bounds + f = BayesianSampler(some_function=four_param) + f.param_df["prior_mean"] = [1.0,2.0,np.nan,np.nan] + f.param_df["prior_std"] = [3.0,4.0,np.nan,np.nan] + f.param_df["lower_bound"] = [-np.inf,-np.inf,-np.inf,-np.inf] + f.param_df["upper_bound"] = [np.inf,np.inf,np.inf,np.inf] + f.param_df["fixed"] = [True,False,True,False] + f._model.finalize_params() + + f._setup_priors() + + assert np.allclose(f._gauss_prior_means,[2.0]) + assert np.allclose(f._gauss_prior_stds,[4.0]) + assert len(f._gauss_prior_offsets) == 1 + assert np.sum(f._gauss_prior_offsets < 0) == 1 + assert np.array_equal(f._gauss_prior_mask,[True,False]) + + + # ---------------------------------------------------------------------- + # check internal bounds calculation adjustment calculation + + # Load model and set priors & bounds + def single_param(a): return a + f = BayesianSampler(some_function=single_param) + f.param_df["prior_mean"] = [10.0] + f.param_df["prior_std"] = [5.0] + f.param_df["lower_bound"] = [0.0] + f.param_df["upper_bound"] = [20.0] + f._model.finalize_params() + + f._setup_priors() + + # Check parsing/basic run + assert np.isclose(f._uniform_priors,0) + assert np.array_equal(f._gauss_prior_means,[10]) + assert np.array_equal(f._gauss_prior_stds,[5]) + assert np.array_equal(f._gauss_prior_mask,[True]) + + # Make sure final offset from the code matches what we calculate here. (Not + # really testing math bit -- that's in the _find_normalization and + # _reconcile_bounds_and_priors tests). + base_offset = find_normalization(scale=1,rv=stats.norm) + bounds = np.array([0,20]) + bounds_offset = reconcile_bounds_and_priors(bounds=(bounds - 10)/5, + frozen_rv=stats.norm(loc=0,scale=1)) + assert np.isclose(base_offset + bounds_offset,f._gauss_prior_offsets[0]) + + # Make sure the code is really pulling the bounds from the param_df (needed + # for fast prior calcs). + assert np.array_equal(f._lower_bounds,f.param_df["lower_bound"]) + assert np.array_equal(f._upper_bounds,f.param_df["upper_bound"]) + +def test_BayesianSampler__ln_prior(): + + # ---------------------------------------------------------------------- + # single parameter priors, bounded, numerical test + + # Load model and set priors & bounds + def single_param(a): return a + f = BayesianSampler(some_function=single_param) + f.param_df["prior_mean"] = [0] + f.param_df["prior_std"] = [1] + f.param_df["lower_bound"] = [-1] + f.param_df["upper_bound"] = [1] + f._model.finalize_params() + f._setup_priors() + + # Set up local calculation + frozen_rv = stats.norm(loc=0,scale=1) + base_offset = find_normalization(scale=1,rv=stats.norm) + bounds = np.array([-1,1]) + bounds_offset = reconcile_bounds_and_priors(bounds=(bounds-0)/1, + frozen_rv=frozen_rv) + + # Try a set of values + for v in [-0.9,-0.1,0.0,0.1,0.9]: + + print("testing",v) + expected = frozen_rv.logpdf(v) + base_offset + bounds_offset + value = f._ln_prior(param=np.array([v])) + assert np.isclose(expected,value) + + # Go outside of bounds + expected = -np.inf + value = f._ln_prior(param=np.array([2])) + assert np.isclose(expected,value) + + expected = -np.inf + value = f._ln_prior(param=np.array([-2])) + assert np.isclose(expected,value) + + # ---------------------------------------------------------------------- + # Now set up two priors, one gauss with one infinite bound, one uniform with + # infinte bound + + def two_parameter(a=1,b=2): return a*b + f = BayesianSampler(some_function=two_parameter) + f.param_df["guess"] = [-5,-5] + f.param_df["prior_mean"] = [2,np.nan] + f.param_df["prior_std"] = [10,np.nan] + f.param_df["lower_bound"] = [-np.inf,-np.inf] + f.param_df["upper_bound"] = [10,0] + f._model.finalize_params() + f._setup_priors() + + # Set up local calculation + frozen_rv = stats.norm(loc=0,scale=1) + base_offset = find_normalization(scale=1,rv=stats.norm) + bounds = np.array([-np.inf,10]) + bounds_offset = reconcile_bounds_and_priors(bounds=(bounds-2)/10, + frozen_rv=frozen_rv) + + total_gauss_offset = base_offset + bounds_offset + uniform_prior = find_uniform_value(bounds=np.array([-np.inf,0])) + + for v in [-1e6,-1,0,8]: + print("testing",v) + z = (v - 2)/10 + expected = frozen_rv.logpdf(z) + total_gauss_offset + uniform_prior + value = f._ln_prior(np.array([v,-5])) + assert np.isclose(expected,value) + + # Outside of bounds + value = f._ln_prior(np.array([-1,2])) + assert np.isclose(-np.inf,value) + +def test_BayesianSampler_ln_prior(): + + # test error checking. __ln_prior test checks numerical results + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + expected_result = np.array([2,-1]) + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + + v = f.ln_prior(expected_result) + assert v < 0 + + with pytest.raises(ValueError): + f.ln_prior(["a","b"]) + + with pytest.raises(ValueError): + f.ln_prior([1]) + + with pytest.raises(ValueError): + f.ln_prior([1,2,3]) + + +def test_BayesianSampler__ln_prob(): + + # Not really a numeric test, but makes sure the code is in fact summing + # ln_prior and ln_like and recognizing nan/inf correctly + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + expected_result = np.array([2,-1]) + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + f.param_df["guess"] = expected_result + f.param_df["prior_mean"] = [2,1] + f.param_df["prior_std"] = [2,2] + f.param_df["lower_bound"] = [-np.inf,-np.inf] + f.param_df["upper_bound"] = [np.inf,np.inf] + f._model.finalize_params() + f._setup_priors() + + ln_like = f.ln_like(expected_result) + ln_prob = f.ln_prior(expected_result) + + assert f._ln_prob(expected_result) == ln_like + ln_prob + assert np.isinf(f._ln_prob(np.array([np.nan,1]))) + +def test_BayesianSampler_ln_prob(): + + # test error checking. __ln_prob test checks numerical results + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + expected_result = np.array([2,-1]) + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + + # should not work -- no y_obs, y_std loaded + with pytest.raises(RuntimeError): + f.ln_prob(expected_result) + + f.data_df = data_df + + # should work -- all needed features defined + v = f.ln_prob(expected_result) + assert v < 0 + + with pytest.raises(ValueError): + f.ln_prob(["a","b"]) + + with pytest.raises(ValueError): + f.ln_prob([1]) + + with pytest.raises(ValueError): + f.ln_prob([1,2,3]) + +def test_BayesianSampler_fit(): + + def test_fcn(m,b,x): return m*x + b + + f = BayesianSampler(some_function=test_fcn, + non_fit_kwargs={"x":np.arange(10)}) + y_obs = np.arange(10)*1 + 2 + y_std = 1.0 + + f.fit(y_obs=y_obs, + y_std=y_std, + num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=1) + + assert f._num_walkers == 10 + assert f._use_ml_guess is True + assert f._num_steps == 10 + assert np.isclose(f._burn_in,0.1) + assert f._num_threads == 1 + + # check num threads passing + with pytest.raises(NotImplementedError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=0) + + with pytest.raises(NotImplementedError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=10) + + # Pass bad value into each kwarg to make sure checker is running + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_walkers=0) + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + use_ml_guess="not a bool") + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_steps=1.2) + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + burn_in=0.0) + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_threads=-2) + + with pytest.raises(TypeError): + f.fit(y_obs=y_obs, + y_std=y_std, + not_an_emcee_kwarg="five") + + +def test_BayesianSampler__fit(): + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + # ------------------------------------------------------------------------- + # basic run; checking use_ml_guess = True effect + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,2) + assert np.array_equal(f.samples.shape,[90,2]) + assert f._lnprob.shape == (90,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # basic run; checking use_ml_guess = False effect + + # Very small analysis, starting from ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # set guess to 1, 1. works, but differs from ML guess of 2, 1 and can thus + # be distinguished below + f.param_df["guess"] = [1,1] + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=False, + num_steps=10, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # look for non-ML guess + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,2) + assert np.array_equal(f.samples.shape,[90,2]) + assert f._lnprob.shape == (90,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # basic run; checking effects of altered num_steps and num_walkers + + # Very small analysis, starting from ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=9, + use_ml_guess=True, + num_steps=20, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (9,2) + assert np.array_equal(f.samples.shape,[162,2]) + assert f._lnprob.shape == (162,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # basic run; altered burn in + + # Very small analysis, starting from ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.5, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,2) + assert np.array_equal(f.samples.shape,[50,2]) + assert f._lnprob.shape == (50,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # basic run; fixed parameter; no ml + + # Very small analysis, starting from no ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + f.param_df.loc["b","fixed"] = True + f.param_df.loc["m","prior_mean"] = 2 + f.param_df.loc["m","prior_std"] = 5 + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert np.array_equal(f.param_df["fixed"],[False,True]) # make sure fixed + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=False, + num_steps=10, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,1) + assert np.array_equal(f.samples.shape,[90,1]) + assert f._lnprob.shape == (90,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + assert f.fit_df.loc["b","estimate"] == f.fit_df.loc["b","guess"] + + # ------------------------------------------------------------------------- + # basic run; fixed parameter; ml + + # Very small analysis, starting from ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + f.param_df.loc["b","fixed"] = True + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert np.array_equal(f.param_df["fixed"],[False,True]) # make sure fixed + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,1) + assert np.array_equal(f.samples.shape,[90,1]) + assert f._lnprob.shape == (90,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + assert f.fit_df.loc["b","estimate"] == f.fit_df.loc["b","guess"] + + # ------------------------------------------------------------------------- + # run twice in a row to check for sample appending + + # Very small analysis, starting from ML + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert not hasattr(f,"_initial_state") + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,2) + assert np.array_equal(f.samples.shape,[90,2]) + assert f._lnprob.shape == (90,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # now run again + f.fit(num_walkers=10, + use_ml_guess=True, + num_steps=10, + burn_in=0.1, + num_threads=1) + + assert issubclass(type(f._fit_result),emcee.ensemble.EnsembleSampler) + assert f._initial_state.shape == (10,2) + assert np.array_equal(f.samples.shape,[180,2]) + assert f._lnprob.shape == (180,) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + +def test_BayesianSampler__update_fit_df(): + + # Create a BayesianSampler with a model loaded (and _fit_df implicitly + # created) + + def test_fcn(a=1,b=2): return a*b + f = BayesianSampler(some_function=test_fcn) + + # add some fake samples + f._samples = np.random.normal(loc=0,scale=1,size=(10000,2)) + + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert np.sum(np.isnan(f._fit_df["std"])) == 2 + assert np.sum(np.isnan(f._fit_df["low_95"])) == 2 + assert np.sum(np.isnan(f._fit_df["high_95"])) == 2 + + f._update_fit_df() + + # Make sure mean/std/95 calc is write given fake samples we stuffed in + assert np.allclose(np.round(f._fit_df["estimate"],1),[0,0]) + assert np.allclose(np.round(f._fit_df["std"],1),[1,1]) + assert np.allclose(np.round(f._fit_df["low_95"],0),[-2,-2]) + assert np.allclose(np.round(f._fit_df["high_95"],0),[2,2]) + + + # -------------------------------------------------------------------------- + # make sure the updater properly copies in parameter values the user may + # have altered after defining the model but before finalizing the fit. + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # fit_df should have been populated with default values from param_df + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # update param_df + f.param_df.loc["b","fixed"] = True + f.param_df.loc["b","guess"] = 1 + f.param_df.loc["b","prior_mean"] = 5 + f.param_df.loc["b","prior_std"] = 3 + f.param_df.loc["m","upper_bound"] = 10 + f.param_df.loc["m","lower_bound"] = -10 + + # no change in fit_df yet + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit(num_walkers=10, + num_steps=10, + use_ml_guess=False) + assert f._fit_has_been_run is True + + # now fit_df should have been updated with guesses etc. + assert np.array_equal(f.fit_df["fixed"],[False,True]) + assert np.array_equal(f.fit_df["guess"],[0,1]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,5],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,3],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-10,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[10,np.inf]) + + + # -------------------------------------------------------------------------- + # make sure the function handles a tiny number of samples + + f = BayesianSampler(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit(num_walkers=10, + num_steps=10, + use_ml_guess=False) + assert f._fit_has_been_run is True + + assert f.samples.shape == (90,2) + f._samples = f._samples[:5,:] + f._update_fit_df() + + with pytest.raises(TypeError): + f.fit(num_walkers=10, + num_steps=10, + use_ml_guess=False, + not_an_emcee_kwarg=5) + + +def test_BayesianSampler_fit_info(): + + def test_fcn(m,b,x): return m*x + b + f = BayesianSampler(some_function=test_fcn, + non_fit_kwargs={"x":np.arange(10)}) + y_obs = 2*np.arange(10) + 1 + y_std = 0.1 + + assert len(f.fit_info) == 1 + assert f.fit_info["Final sample number"] is None + + f.fit(y_obs=y_obs, + y_std=y_std, + num_walkers=10, + num_steps=10, + burn_in=0.1) + + assert f.fit_info["Num walkers"] == f._num_walkers + assert f.fit_info["Use ML guess"] == f._use_ml_guess + assert f.fit_info["Num steps"] == f._num_steps + assert f.fit_info["Burn in"] == f._burn_in + assert f.fit_info["Num threads"] == f._num_threads + + assert f.fit_info["Final sample number"] == 90 + f._samples = np.zeros((100,2)) + assert f.fit_info["Final sample number"] == 100 + + +def test_BayesianSampler___repr__(): + + # Stupidly simple fitting problem. find slope + def model_to_wrap(m=1,x=np.array([1,2,3])): return m*x + + # Run _fit_has_been_run, success branch + f = BayesianSampler(some_function=model_to_wrap) + f.fit(y_obs=np.array([2,4,6]), + y_std=[0.1,0.1,0.1], + num_steps=10) + + out = f.__repr__().split("\n") + assert len(out) == 23 + + # hack, run _fit_has_been_run, _fit_failed branch + f._success = False + + out = f.__repr__().split("\n") + assert len(out) == 18 + + # Run not _fit_has_been_run + f = BayesianSampler(some_function=model_to_wrap) + + out = f.__repr__().split("\n") + assert len(out) == 9 + diff --git a/tests/dataprob/fitters/test_base.py b/tests/dataprob/fitters/test_base.py index 38d3a42..c50ec67 100644 --- a/tests/dataprob/fitters/test_base.py +++ b/tests/dataprob/fitters/test_base.py @@ -2,36 +2,108 @@ import pytest from dataprob.fitters.base import Fitter -from dataprob.model_wrapper import ModelWrapper +from dataprob.model_wrapper.model_wrapper import ModelWrapper +from dataprob.model_wrapper.vector_model_wrapper import VectorModelWrapper +from dataprob.fitters.base import _pretty_zeropad_str import numpy as np import pandas as pd +import matplotlib import os import pickle import copy -# ---------------------------------------------------------------------------- # -# Test __init__ -# ---------------------------------------------------------------------------- # +def test__pretty_zeropad_str(): + + x = _pretty_zeropad_str(0) + assert x == "s{:02d}" + + x = _pretty_zeropad_str(1) + assert x == "s{:02d}" + + x = _pretty_zeropad_str(9) + assert x == "s{:02d}" + + x = _pretty_zeropad_str(10) + assert x == "s{:03d}" + + x = _pretty_zeropad_str(99) + assert x == "s{:03d}" + + x = _pretty_zeropad_str(100) + assert x == "s{:04d}" def test_Fitter__init__(): """ Test model initialization. """ - f = Fitter() + # Basic test of functionality + def test_model(m,b,x): return m*x + b + base_kwargs = {"some_function":test_model, + "fit_parameters":{"m":{"guess":1}, + "b":{"guess":0}}, + "non_fit_kwargs":{"x":np.arange(10)}, + "vector_first_arg":False} + + kwargs = copy.deepcopy(base_kwargs) + f = Fitter(**kwargs) - assert f._num_obs is None - assert f._num_params is None - assert f._model_is_model_wrapper is False + assert f.num_obs is None + assert f.num_params == 2 + assert f.param_df.loc["m","guess"] == 1 + assert f.param_df.loc["b","guess"] == 0 + assert issubclass(type(f._model),ModelWrapper) + assert f._fit_has_been_run is False - assert f._fit_type == "" + + # Make sure fit_parameters, non_fit_kwargs are being passed + def test_model(m,b,x): return m*x + b + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = {"m":{"guess":10}, + "b":{"guess":20}} + f = Fitter(**kwargs) + assert f.param_df.loc["m","guess"] == 10 + assert f.param_df.loc["b","guess"] == 20 + assert np.array_equal(f._model.non_fit_kwargs["x"],np.arange(10)) + + # make sure vector_first_arg is being passed + kwargs = copy.deepcopy(base_kwargs) + kwargs["vector_first_arg"] = True + kwargs["fit_parameters"] = ["q","r","s"] + f = Fitter(**kwargs) + assert issubclass(type(f._model),VectorModelWrapper) + assert len(f.param_df) == 3 + assert np.array_equal(f.param_df["name"],["q","r","s"]) + assert len(f._model._non_fit_kwargs) == 2 + assert f._model.non_fit_kwargs["b"] is None + assert np.array_equal(f._model.non_fit_kwargs["x"],np.arange(10)) + + # Send in pre-wrapped model + def test_model(m=10,b=1,x=[]): return m*x + b + mw = ModelWrapper(test_model, + non_fit_kwargs={"x":np.arange(10)}) + f = Fitter(some_function=mw) + assert f.param_df.loc["m","guess"] == 10 + assert f.param_df.loc["b","guess"] == 1 def test_Fitter__sanity_check(): - f = Fitter() - f._sanity_check("some error",["fit_type"]) + def test_model(m,b,x): return m*x + b + base_kwargs = {"some_function":test_model, + "fit_parameters":{"m":{"guess":1}, + "b":{"guess":0}}, + "non_fit_kwargs":{"x":np.arange(10)}, + "vector_first_arg":False} + + kwargs = copy.deepcopy(base_kwargs) + f = Fitter(**kwargs) + + # should always work + f._sanity_check("some error",["fit_has_been_run"]) + + # Won't work with pytest.raises(RuntimeError): f._sanity_check("some error",["not_an_attribute"]) @@ -41,954 +113,654 @@ def test_Fitter__sanity_check(): f._sanity_check("some error",["test_attribute"]) -def test_Fitter_fit(fitter_object,binding_curve_test_data): - - def dummy_fit(f,N,*args,**kwargs): - """ - This function takes f and N and uses that to set fit results without - actually doing anything. It should be invoked by - - f = Fitter() - f._fit = dummy_fit - - then - - f.fit(f=f,N=N) +def test_Fitter__process_obs_args(): - f and N are passed to dummy fit, which updates the fitter attributes - appropriately fro the test. - """ - f._fit_result = {} - f._success = True - - f._estimate = np.zeros(N,dtype=float) - f._stdev = 0.5*np.ones(N,dtype=float) - f._ninetyfive = 1.0*np.ones((2,N),dtype=float) - - N = len(binding_curve_test_data["guesses"]) - kwargs = {"N":N, - "model":binding_curve_test_data["generic_model"], - "y_obs":binding_curve_test_data["df"].Y, - "y_stdev":binding_curve_test_data["df"].Y_stdev, - "guesses":[5], - "names":["blah"], - "priors":[[0],[10]], - "bounds":[[-100],[100]]} - - # Send in a generic model that will make us specify everything, and make - # sure specifications are working - f = Fitter() - f._fit = dummy_fit + def test_model(m,b,x): return m*x + b + base_kwargs = {"some_function":test_model, + "fit_parameters":{"m":{"guess":1}, + "b":{"guess":0}}, + "non_fit_kwargs":{"x":np.arange(10)}, + "vector_first_arg":False} + + kwargs = copy.deepcopy(base_kwargs) + f_base = Fitter(**kwargs) - test_kwargs = copy.deepcopy(kwargs) + # ---------------------------------------------------------------------- + # basic check that it runs + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None - f.fit(f=f,**test_kwargs) + f._process_obs_args(y_obs=[1,2,3], + y_std=[1,1,1]) - assert np.array_equal(f.y_obs,binding_curve_test_data["df"].Y) - assert np.array_equal(f.y_stdev,binding_curve_test_data["df"].Y_stdev) - assert np.array_equal(f.guesses,[5]) - assert np.array_equal(f.priors,[[0],[10]]) - assert np.array_equal(f.names,["blah"]) - assert f._fit_has_been_run is True + assert np.array_equal(f.y_obs,[1,2,3]) + assert np.array_equal(f.y_std,[1,1,1]) + + # ---------------------------------------------------------------------- + # No y_obs, fail + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None - # Send in a generic model that will make us specify everything, but send in - # badness for each and make sure it throws error. - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["model"] = "not_callable" + # Fail and make sure nothing changed with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) - - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["y_obs"] = "not_yobs" + f._process_obs_args(y_obs=None, + y_std=[1,1,1]) + assert f.y_obs is None + assert f.y_std is None + + # now set _y_obs with setter + f._y_obs = [1,2,3] + f._process_obs_args(y_obs=None, + y_std=[1,1,1]) + assert np.array_equal(f.y_obs,[1,2,3]) + assert np.array_equal(f.y_std,[1,1,1]) + + # ---------------------------------------------------------------------- + # No y_std, warn + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None + + # Fail and make sure nothing changed with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) + f._process_obs_args(y_obs=[1,2,3], + y_std=None) - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["y_stdev"] = "not_stdev" - with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) + # ---------------------------------------------------------------------- + # y_std via setter, warn + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None + f._y_std = [1,1,1] - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["guesses"] = [1,2,3] - with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) + # Should work fine, no warning because y_std defined previously + f._process_obs_args(y_obs=[1,2,3],y_std=None) + assert np.array_equal(f.y_obs,[1,2,3]) + assert np.array_equal(f.y_std,[1,1,1]) - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["names"] = ["a","b"] - with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) + # ---------------------------------------------------------------------- + # setters do sanity checking; don't test exhaustively but make sure the + # checks are running - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["priors"] = "not_prior" + # nan in y_obs + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) - - f = Fitter() - f._fit = dummy_fit - test_kwargs = copy.deepcopy(kwargs) - test_kwargs["bounds"] = "not_bounds" + f._process_obs_args(y_obs=[np.nan,2,3], + y_std=[1,1,1]) + + # negative value in y_std + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None with pytest.raises(ValueError): - f.fit(f=f,**test_kwargs) + f._process_obs_args(y_obs=[1,2,3], + y_std=[-1,1,1]) - # Default run should fail because model is not specified - f = Fitter() - f._fit = dummy_fit - with pytest.raises(RuntimeError): - f.fit(f=f,N=N) + # ---------------------------------------------------------------------- + # make sure y_std expands appropriately (done by setter, so quick check) - # Send in an unwrapped model. Should fail because no guesses. - f = Fitter() - f._fit = dummy_fit - f.model = binding_curve_test_data["generic_model"] - with pytest.raises(RuntimeError): - f.fit(f=f,N=N) - - # Default run will work with wrapped model because it will bring in all - # values - f = Fitter() - f._fit = dummy_fit - mw = ModelWrapper(binding_curve_test_data["wrappable_model"]) - f.model = mw - f.y_obs = binding_curve_test_data["df"].Y - f.fit(f=f,N=N) - - assert np.array_equal(f.guesses,np.ones(N)) - assert np.array_equal(f.priors,np.nan*np.ones((2,N)),equal_nan=True) - assert np.array_equal(f.names,["K"]) - assert np.array_equal(f.y_stdev,np.ones(len(f.y_obs))) - assert f._fit_has_been_run is True + f = copy.deepcopy(f_base) + assert f.y_obs is None + assert f.y_std is None + f._process_obs_args(y_obs=[1,2,3], + y_std=1) + assert np.array_equal(f.y_obs,[1,2,3]) + assert np.array_equal(f.y_std,[1,1,1]) - # Send in a generic model that will make us pre-specify many features - f = Fitter() - f._fit = dummy_fit - f.model = binding_curve_test_data["generic_model"] - f.y_obs = binding_curve_test_data["df"].Y - with pytest.raises(RuntimeError): - f.fit(f=f,N=N) - # works with guesses sent in - f.fit(f=f, - N=N, - guesses=[0]) + +def test_Fitter_fit(): + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + base_kwargs = {"y_obs":data_df.y_obs, + "y_std":data_df.y_std, + "fit_kwarg":5} + + def new_fitter(): + + # Create a fitter with a model, then hacked _fit, _fit_result, + # and _update_fit_df + f = Fitter(some_function=linear_fcn) + f._fit = lambda **kwargs: None + f._fit_result = {} + f._update_fit_df = lambda *args: None + + return f - assert np.array_equal(f.guesses,np.zeros(N)) - assert np.array_equal(f.priors,np.nan*np.ones((2,N)),equal_nan=True) - assert np.array_equal(f.names,["p0"]) - assert np.array_equal(f.y_stdev,np.ones(len(f.y_obs))) + f = new_fitter() + kwargs = copy.deepcopy(base_kwargs) + kwargs["names"] = None + + assert not hasattr(f,"_success") + assert f._fit_has_been_run is False + + f.fit(**kwargs) + + assert f._success is None assert f._fit_has_been_run is True - # fix all parameters. should now fail because nothing is floating - f = Fitter() - f._fit = dummy_fit - mw = ModelWrapper(binding_curve_test_data["wrappable_model"]) - for p in mw.fit_parameters: - mw.fit_parameters[p].fixed = True - f.model = mw - f.y_obs = binding_curve_test_data["df"].Y - with pytest.raises(RuntimeError): - f.fit(f=f,N=N) + # ---------------------------------------------------------------------- + # make sure _process_obs_args is running with incompatible y_obs argument + + f = new_fitter() + kwargs = copy.deepcopy(base_kwargs) + kwargs["y_obs"] = [1,2,3,4] + with pytest.raises(ValueError): + f.fit(**kwargs) + + f = new_fitter() # have to reset fitter b/c model set above + kwargs["y_obs"] = data_df["y_obs"] + f.fit(**kwargs) + +def test_Fitter__fit(): -def test__fit(): - f = Fitter() - with pytest.raises(NotImplementedError): - f._fit() + def test_model(m,b,x): return m*x + b + base_kwargs = {"some_function":test_model, + "fit_parameters":{"m":{"guess":1}, + "b":{"guess":0}}, + "non_fit_kwargs":{"x":np.arange(10)}, + "vector_first_arg":False} + + kwargs = copy.deepcopy(base_kwargs) + f_base = Fitter(**kwargs) -def test__update_estimates(): - f = Fitter() + f = copy.deepcopy(f_base) with pytest.raises(NotImplementedError): - f._update_estimates() + f._fit() -def test__unweighted_residuals(binding_curve_test_data): +def test_Fitter__unweighted_residuals(): """ - Test unweighted residuals call against "manual" code used to generate - test data. Just make sure answer is right; no error checking on this - function. + Test unweighted residuals call with linear function. """ - f = Fitter() - input_params = binding_curve_test_data["input_params"] - f.model = binding_curve_test_data["generic_model"] - df = binding_curve_test_data["df"] - f.y_obs = df.Y - r = f._unweighted_residuals(input_params) + test_params = np.array([10,20]) + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + + f.data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(15)}) - assert np.allclose(r,df.residual) + assert np.allclose(linear_fcn(10,20,x) - linear_fcn(m=2,b=-1,x=x), + f._unweighted_residuals(test_params)) -def test_unweighted_residuals(binding_curve_test_data): +def test_Fitter_unweighted_residuals(): """ - Test unweighted residuals call against "manual" code used to generate - test data. + Test unweighted residuals like _unweighted_residuals, but test error + checking. """ - f = Fitter() - - input_params = binding_curve_test_data["input_params"] - - # Should fail, haven't loaded a model, y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.unweighted_residuals(input_params) - - f.model = binding_curve_test_data["generic_model"] + test_params = np.array([10,20]) + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) - # Should fail, haven't loaded y_obs or y_stdev yet + # Should fail, haven't loaded y_obs or y_std yet with pytest.raises(RuntimeError): - f.unweighted_residuals(input_params) - - df = binding_curve_test_data["df"] - f.y_obs = df.Y + f.unweighted_residuals(test_params) - r = f.unweighted_residuals(input_params) + # Load in y_obs and y_std + f.data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(15)}) - assert np.allclose(r,df.residual) + # Should work now + assert np.allclose(linear_fcn(10,20,x) - linear_fcn(m=2,b=-1,x=x), + f.unweighted_residuals(test_params)) - # Make sure error check is running - f._num_params = 2 + # Make sure error check is running by sending in too many parameters with pytest.raises(ValueError): - f.unweighted_residuals([1,]) + f.unweighted_residuals([1,2,3,4]) -def test__weighted_residuals(binding_curve_test_data): +def test_Fitter__weighted_residuals(): """ - Test weighted residuals call against "manual" code used to generate - test data. Just make sure answer is right; no error checking on this - function. + Test weighted residuals call with linear function. """ - f = Fitter() - input_params = np.array(binding_curve_test_data["input_params"]) - f.model = binding_curve_test_data["generic_model"] - df = binding_curve_test_data["df"] - f.y_obs = df.Y - f.y_stdev = df.Y_stdev - - r = f._weighted_residuals(input_params) + test_params = np.array([10,20]) + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + + f.data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(15)}) - assert np.allclose(r,df.weighted_residual) + assert np.allclose((linear_fcn(10,20,x) - linear_fcn(m=2,b=-1,x=x))/0.1, + f._weighted_residuals(test_params)) -def test_weighted_residuals(binding_curve_test_data): +def test_Fitter_weighted_residuals(): """ - Test weighted residuals call against "manual" code used to generate - test data. + Test weighted residuals like _weighted_residuals, but test error + checking. """ - f = Fitter() + test_params = np.array([10,20]) + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) - input_params = binding_curve_test_data["input_params"] - - # Should fail, haven't loaded a model, y_obs or y_stdev yet + # Should fail, haven't loaded y_obs or y_std yet with pytest.raises(RuntimeError): - f.weighted_residuals(input_params) - - f.model = binding_curve_test_data["generic_model"] + f.weighted_residuals(test_params) - # Should fail, haven't loaded y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.weighted_residuals(input_params) + # Load in y_obs and y_std + f.data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(15)}) - df = binding_curve_test_data["df"] - f.y_obs = df.Y + # Should work now + assert np.allclose((linear_fcn(10,20,x) - linear_fcn(m=2,b=-1,x=x))/0.1, + f.weighted_residuals(test_params)) - # Should fail, haven't loaded y_stdev yet - with pytest.raises(RuntimeError): - f.weighted_residuals(input_params) - - f.y_stdev = df.Y_stdev - r = f.weighted_residuals(input_params) - - assert np.allclose(r,df.weighted_residual) - - # Make sure error check is running - f._num_params = 2 + # Make sure error check is running by sending in too many parameters with pytest.raises(ValueError): - f.weighted_residuals([1,]) + f.weighted_residuals([1,2,3,4]) -def test__ln_like(binding_curve_test_data): +def test_Fitter__ln_like(): """ Test internal function -- no error checking. """ - f = Fitter() - input_params = binding_curve_test_data["input_params"] - f.model = binding_curve_test_data["generic_model"] - df = binding_curve_test_data["df"] - f.y_obs = df.Y - f.y_stdev = df.Y_stdev - L = f.ln_like(input_params) - assert np.allclose(L,binding_curve_test_data["ln_like"]) - -def test_ln_like(binding_curve_test_data): - """ - Test log likelihood call against "manual" code used to generate - test data. - """ - f = Fitter() + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + y_obs = linear_fcn(m=2,b=-1,x=x) + y_std = 0.1*np.ones(15) + y_calc = linear_fcn(m=10,b=20,x=x) + test_params = np.array([10,20]) - input_params = binding_curve_test_data["input_params"] + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + f.data_df = pd.DataFrame({"y_obs":y_obs, + "y_std":y_std}) - # Should fail, haven't loaded a model, y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.ln_like(input_params) + sigma2 = y_std**2 + ln_like = -0.5*(np.sum((y_calc - y_obs)**2/sigma2 + np.log(2*np.pi*sigma2))) - f.model = binding_curve_test_data["generic_model"] + assert np.isclose(f._ln_like(test_params),ln_like) - # Should fail, haven't loaded y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.ln_like(input_params) +def test_Fitter_ln_like(): + """ + Test ln_like like _ln_like, but test error checking. + """ - df = binding_curve_test_data["df"] - f.y_obs = df.Y + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,15) + y_obs = linear_fcn(m=2,b=-1,x=x) + y_std = 0.1*np.ones(15) + y_calc = linear_fcn(m=10,b=20,x=x) + test_params = np.array([10,20]) - # Should fail, haven't loaded y_stdev yet + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":x}) + + # Should fail, haven't loaded y_obs or y_std yet with pytest.raises(RuntimeError): - f.ln_like(input_params) + f.ln_like(test_params) - f.y_stdev = df.Y_stdev - assert f.num_params is None - L = f.ln_like(input_params) - assert f.num_params == 1 - - assert np.allclose(L,binding_curve_test_data["ln_like"]) + f.data_df = pd.DataFrame({"y_obs":y_obs, + "y_std":y_std}) + + # should work now + sigma2 = y_std**2 + ln_like = -0.5*(np.sum((y_calc - y_obs)**2/sigma2 + np.log(2*np.pi*sigma2))) + assert np.isclose(f._ln_like(test_params),ln_like) + # make sure input params sanity check is running - input_params = [1,2,3] with pytest.raises(ValueError): - f.ln_like(input_params) - - # Now run again to make sure it still has right number of params - assert f.num_params == 1 - L = f.ln_like([1]) - assert f.num_params == 1 - - + f.ln_like([1,2,3,4]) # ---------------------------------------------------------------------------- # # Test setters, getters, and internal sanity checks # ---------------------------------------------------------------------------- # -def test_model_setter_getter(binding_curve_test_data): +def test_Fitter_y_obs(): """ - Test the model setter. + Test the y_obs setter. """ - f = Fitter() + def test_fcn(x=1,y=2): return x*y + f = Fitter(some_function=test_fcn) + assert f.y_obs is None + f._y_obs = "something" + assert f.y_obs == "something" - # Not a function - with pytest.raises(ValueError): - f.model = "a" - - # Function with no arguments - def dummy(): pass - with pytest.raises(ValueError): - f.model = dummy - - # Test passing a generic model (not a ModelWrapper) - f.model = binding_curve_test_data["generic_model"] - assert f.model is not None - assert f.model == binding_curve_test_data["generic_model"] - assert f.guesses is None - assert f.bounds is None - assert f.names is None - - # Test passing a ModelWrapper instance. Should update guesses, bounds, - # names - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw - assert f.model == mw._mw_observable - assert np.array_equal(f.guesses,np.array([0,20])) - assert np.array_equal(f.bounds,np.array([[-np.inf,-np.inf],[np.inf,np.inf]])) - assert np.array_equal(f.names,np.array(["K1","K2"])) - - # Test passing a ModelWrapper.model method. Should update guesses, bounds, - # names - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw.model - assert f.model == mw._mw_observable - assert np.array_equal(f.guesses,np.array([0,20])) - assert np.array_equal(f.bounds,np.array([[-np.inf,-np.inf],[np.inf,np.inf]])) - assert np.array_equal(f.names,np.array(["K1","K2"])) - - # Test passing a ModelWrapper.model method. Should update guesses, bounds, - # names - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - # Make sure that number of parameters validation works - f = Fitter() - f._num_params = 10 - with pytest.raises(ValueError): - f.model = mw.model - -def test_guesses_setter_getter(binding_curve_test_data): + +def test_Fitter_y_std(): """ - Test the guesses setter. + Test the y_std setter. """ - f = Fitter() - assert f.guesses is None - assert f.num_params is None - f.guesses = np.ones(3) - assert np.array_equal(f.guesses,[1,1,1]) - assert f._fit_has_been_run is False - assert f.num_params == 3 + def test_fcn(x=1,y=2): return x*y + f = Fitter(some_function=test_fcn) + assert f.y_std is None + f._y_std = "something" + assert f.y_std == "something" - f = Fitter() - with pytest.raises(ValueError): - f.guesses = "a" - with pytest.raises(ValueError): - f.guesses = ["a",1.5] - with pytest.raises(ValueError): - f.guesses = 1.0 - f = Fitter() - assert f.guesses is None - f.guesses = np.ones(3) - with pytest.raises(ValueError): - f.guesses = np.ones(2) +def test_Fitter_param_df(): - f = Fitter() - assert f.guesses is None - assert f.names is None - f.names = ["a","b"] - with pytest.raises(ValueError): - f.guesses = np.ones(3) - f.guesses = [1,2] - assert np.array_equal(f.guesses,[1,2]) - - # Test passing a ModelWrapper.model method. - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw.model - assert f.model == mw._mw_observable - assert np.array_equal(f.guesses,np.array([0,20])) - - f.guesses = [2,40] - assert np.array_equal(f.guesses,np.array([2,40])) - assert mw.K1.guess == 2 - assert mw.K2.guess == 40 - - with pytest.raises(TypeError): - mw.guesses = [4,80] - mw.K1.guess = 4 - mw.K2.guess = 80 - - assert np.array_equal(mw.guesses,np.array([4,80])) - assert np.array_equal(f.guesses,np.array([4,80])) - -def test_bounds_setter_getter(binding_curve_test_data): - """ - Test the bounds setter. - """ - - f = Fitter() + def test_fcn(a=1,b=2): return a*b + f = Fitter(some_function=test_fcn) + + assert len(f.param_df) == 2 + assert np.array_equal(f.param_df["name"],["a","b"]) + not_good = pd.DataFrame({'name':["x","y"]}) with pytest.raises(ValueError): - f.bounds = "a" - with pytest.raises(ValueError): - def dummy(): pass - f.bounds = dummy + f.param_df = not_good + + assert np.array_equal(f.param_df["guess"],[1,2]) + good_df = pd.DataFrame({"name":["a","b"],"guess":[3,4]}) + f.param_df = good_df + assert np.array_equal(f.param_df["guess"],[3,4]) + - # Base low-dimensional array + +def test_Fitter_non_fit_kwargs(): + + def test_fcn(a=1,b=2,c="test"): return a*b + f = Fitter(some_function=test_fcn) + assert len(f.non_fit_kwargs) == 1 + assert f.non_fit_kwargs["c"] == "test" + f.non_fit_kwargs["c"] = "something_else" + assert f.non_fit_kwargs["c"] == "something_else" + + # should work + f._model.finalize_params() + + # should fail + f.non_fit_kwargs.pop("c") with pytest.raises(ValueError): - f.bounds = [0,1] + f._model.finalize_params() - bnds = np.ones((2,len(binding_curve_test_data["guesses"])),dtype=float) - bnds[0,:] *= -np.inf - bnds[1,:] *= np.inf + # should work + f.non_fit_kwargs["c"] = 14 + f._model.finalize_params() - f.bounds = bnds - assert f.bounds is not None - assert np.array_equal(f.bounds,bnds) - # Test setting bounds with a model wrapper - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw.model - assert f.model == mw._mw_observable +def test_Fitter_data_df(): - assert np.isinf(mw.fit_parameters[mw.names[0]].bounds[0]) - - num_param = len(mw.fit_parameters) - bnds = np.ones((2,num_param),dtype=float) - bnds[0,:] *= -np.inf - bnds[1,:] *= np.inf - bnds[0,0] = 0 - - f.bounds = bnds - assert mw.fit_parameters[mw.names[0]].bounds[0] == 0 - -def test_priors_setter_getter(binding_curve_test_data): - """ - Test the priors setter. - """ - - # Good pass of priors - f = Fitter() - f.priors is None - priors = np.ones((2,len(binding_curve_test_data["guesses"])),dtype=float) - f.priors = priors - assert f.priors is not None - assert np.array_equal(f.priors,priors) - - # bad value - f = Fitter() - with pytest.raises(ValueError): - f.priors = "a" - - # bad value - f = Fitter() - with pytest.raises(ValueError): - def dummy(): pass - f.priors = dummy - - # single dimensional array - f = Fitter() + # test getter + + def test_fcn(a=1,b=2): return a*b + f = Fitter(some_function=test_fcn) + + out_df = f.data_df + assert len(out_df) == 0 + + y_obs = np.arange(10,dtype=float) + y_std = np.ones(10,dtype=float) + + f = Fitter(some_function=test_fcn) + f._y_obs = y_obs + out_df = f.data_df + assert len(out_df) == 10 + assert len(out_df.columns) == 1 + assert np.array_equal(out_df["y_obs"],y_obs) + + f = Fitter(some_function=test_fcn) + f._y_obs = y_obs + f._y_std = y_std + out_df = f.data_df + assert len(out_df) == 10 + assert len(out_df.columns) == 2 + assert np.array_equal(out_df["y_obs"],y_obs) + assert np.array_equal(out_df["y_std"],y_std) + + # Create real function and fitter + def linear_fcn(m=1,b=2,x=None): return m*x + b + f = Fitter(some_function=linear_fcn, + non_fit_kwargs={"x":np.arange(10)}) + y_obs = 1*np.arange(10) + 2 + y_std = np.ones(10,dtype=float)*0.1 + y_calc = 1*np.arange(10) + 3 + f._y_obs = y_obs + f._y_std = y_std + f._success = True + f._fit_df = pd.DataFrame({"estimate":[1,3]}) + f._model._unfixed_mask = np.ones(2,dtype=bool) + + # check final data_df + out_df = f.data_df + assert len(out_df) == 10 + assert len(out_df.columns) == 5 + assert np.array_equal(out_df["y_obs"],y_obs) + assert np.array_equal(out_df["y_std"],y_std) + assert np.array_equal(out_df["y_calc"],y_calc) + assert np.array_equal(out_df["unweighted_residuals"], + y_calc - y_obs) + assert np.array_equal(out_df["weighted_residuals"], + (y_calc - y_obs)/y_std) + + # set setter + def test_fcn(a=1,b=2): return a*b + f = Fitter(some_function=test_fcn) + f._fit_has_been_run = True # hack to True to check that it gets set to F + + tmp_df = pd.DataFrame({"y_obs":[1,2], + "y_std":[3,4]}) + f.data_df = tmp_df + assert np.array_equal(f._y_obs,[1,2]) + assert np.array_equal(f._y_std,[3,4]) + assert np.array_equal(f.data_df["y_obs"],[1,2]) + assert np.array_equal(f.data_df["y_std"],[3,4]) + assert not f._fit_has_been_run + + # missing column + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs":[1,2]}) + with pytest.raises(ValueError): + f.data_df = tmp_df + + # missing column + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_std":[1,2]}) with pytest.raises(ValueError): - f.priors = [0,1] + f.data_df = tmp_df - # has an infinity - f = Fitter() - priors = np.ones((2,len(binding_curve_test_data["guesses"])),dtype=float) - priors[0,0] = np.inf + # bad column name + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs_y":[1,2], + "y_std":[3,4]}) with pytest.raises(ValueError): - f.priors = priors - - # Pass in new otherwise valid priors with wrong dimensions - f = Fitter() - priors = np.ones((2,len(binding_curve_test_data["guesses"])),dtype=float) - f.priors = priors - assert np.array_equal(f.priors,priors) - priors = np.ones((2,len(binding_curve_test_data["guesses"])+1),dtype=float) - with pytest.raises(ValueError): - f.priors = priors + f.data_df = tmp_df - # Test match with the number of parameters - f = Fitter() - f.names = ["A","B"] - assert f.num_params == 2 + # non-numeric column + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs":["not",2], + "y_std":[3,4]}) with pytest.raises(ValueError): - f.priors = [[1],[1]] - with pytest.raises(ValueError): - f.priors = [[1,2,3],[1,2,3]] - f.priors = [[1,2],[1,2]] - assert np.array_equal(f.priors,np.array([[1,2],[1,2]])) - - # Test setting priors with a model wrapper - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw.model - assert f.model == mw._mw_observable - assert np.isinf(mw.fit_parameters[mw.names[0]].bounds[0]) - - num_param = len(mw.fit_parameters) - bnds = np.ones((2,num_param),dtype=float) - bnds[0,:] *= -np.inf - bnds[1,:] *= np.inf - bnds[0,0] = 0 - - f.bounds = bnds - assert mw.fit_parameters[mw.names[0]].bounds[0] == 0 - - f = Fitter() - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - f.model = mw - - # Set priors - assert np.array_equal(f.priors,np.nan*np.ones((2,2)),equal_nan=True) - f.priors = [[1,2],[3,4]] - assert np.array_equal(f.priors,[[1,2],[3,4]]) - - assert np.array_equal(mw.priors,[[1,2],[3,4]]) - for i, p in enumerate(mw.fit_parameters): - assert np.array_equal(mw.fit_parameters[p].prior,f.priors[:,i]) + f.data_df = tmp_df - - -def test_names_setter_getter(binding_curve_test_data): - """ - Test the names setter. - """ - - f = Fitter() - assert f.names is None - - names = ["p{}".format(i) - for i in range(len(binding_curve_test_data["guesses"]))] - f.names = names - assert f.names is not None - assert np.array_equal(f.names,names) - assert f.num_params == len(names) - - f = Fitter() - assert f.names is None - f.names = ["yo"] - assert np.array_equal(f.names,["yo"]) - assert f.num_params == 1 - - f = Fitter() - assert f.names is None - f.names = "yo" - assert np.array_equal(f.names,["yo"]) - assert f.num_params == 1 - - f = Fitter() - assert f.names is None + # nan column + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs":[np.nan,2], + "y_std":[3,4]}) with pytest.raises(ValueError): - f.names = ["a","a"] - - # mismatch in number of parameters and number of parameter names - f = Fitter() - assert f.names is None - assert f._num_params is None - f._num_params = 10 - assert f.num_params == 10 - with pytest.raises(ValueError): - f.names = ["a","b"] - - # Test setting names with a model wrapper - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - - f = Fitter() - f.model = mw.model - assert f.model == mw._mw_observable - assert np.array_equal(f.names,["K1","K2"]) - assert mw.fit_parameters["K1"].name == "K1" - assert mw.fit_parameters["K2"].name == "K2" + f.data_df = tmp_df - f.names = ["A","B"] - assert np.array_equal(f.names,["A","B"]) - assert mw.fit_parameters["K1"].name == "A" - assert mw.fit_parameters["K2"].name == "B" - -def test_y_obs_setter_getter(binding_curve_test_data): - """ - Test the y_obs setter. - """ - - f = Fitter() - - f.y_obs = binding_curve_test_data["df"].Y - assert f.y_obs is not None - assert np.array_equal(f.y_obs,binding_curve_test_data["df"].Y) - assert f._fit_has_been_run is False - - f = Fitter() + # inf column + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs":[np.inf,2], + "y_std":[3,4]}) with pytest.raises(ValueError): - f.y_obs = "a" - with pytest.raises(ValueError): - f.y_obs = ["a","b"] - - f = Fitter() - input_data = np.array(binding_curve_test_data["df"].Y) - f.y_obs = input_data - assert np.array_equal(f.y_obs,input_data) - assert f.num_obs == input_data.shape[0] + f.data_df = tmp_df - # Send in data with incorrect number of observations + # bad std + f = Fitter(some_function=test_fcn) + tmp_df = pd.DataFrame({"y_obs":[1,2], + "y_std":[0,4]}) with pytest.raises(ValueError): - f.y_obs = input_data[:-1] - -def test_y_stdev_setter_getter(binding_curve_test_data): - """ - Test the y_stdev setter. - """ - - y_obs_input = np.array(binding_curve_test_data["df"].Y) - y_stdev_input = np.array(binding_curve_test_data["df"].Y_stdev) + f.data_df = tmp_df - f = Fitter() - assert f.y_stdev is None - assert f.num_obs is None - f.y_stdev = y_stdev_input - assert np.array_equal(y_stdev_input,f.y_stdev) - assert f.num_obs == len(y_stdev_input) - assert f._fit_has_been_run is False - f = Fitter() - assert f.y_stdev is None - with pytest.raises(ValueError): - f.y_stdev = "a" - with pytest.raises(ValueError): - f.y_stdev = ["a","b"] +def test_Fitter__initialize_fit_df(): - # Obs and stdev - f = Fitter() - assert f.y_obs is None - assert f.y_stdev is None - f.y_obs = y_obs_input - f.y_stdev = y_stdev_input - assert np.array_equal(y_obs_input,f.y_obs) - assert np.array_equal(y_stdev_input,f.y_stdev) + # test on fake class + class TestClass: + def __init__(self): + self.param_df = {"name":["a","b"], + "guess":[10,10], + "fixed":[True,False], + "lower_bound":[-np.inf,0], + "upper_bound":[np.inf,100], + "prior_mean":[1,np.nan], + "prior_std":[1,np.nan]} - # Obs and stdev, reverse order of adding - f = Fitter() - assert f.y_obs is None - assert f.y_stdev is None - f.y_stdev = y_stdev_input - f.y_obs = y_obs_input - assert np.array_equal(y_obs_input,f.y_obs) - assert np.array_equal(y_stdev_input,f.y_stdev) + tc = TestClass() + Fitter._initialize_fit_df(tc) + assert np.array_equal(tc.param_df["name"],tc._fit_df["name"]) + assert np.sum(np.isnan(tc._fit_df["estimate"])) + assert np.sum(np.isnan(tc._fit_df["std"])) + assert np.sum(np.isnan(tc._fit_df["low_95"])) + assert np.sum(np.isnan(tc._fit_df["high_95"])) - # Length checks - f = Fitter() - assert f.y_stdev is None - assert f.num_obs is None - f.y_stdev = y_stdev_input - with pytest.raises(ValueError): - f.y_stdev = y_stdev_input[:-1] - - f = Fitter() - assert f.y_stdev is None - assert f.num_obs is None - f.y_obs = y_obs_input - with pytest.raises(ValueError): - f.y_stdev = y_stdev_input[:-1] - -def test_num_params(binding_curve_test_data): - - f = Fitter() - assert f.num_params is None - - f.guesses = np.array([1,2]) - assert f.num_params == 2 - - with pytest.raises(ValueError): - f.guesses = np.array([7,8,9,10]) - - f = Fitter() - f.guesses = np.array([1,2,3]) - assert f.num_params == 3 - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) + columns = ["guess","fixed", + "lower_bound","upper_bound", + "prior_mean","prior_std"] + for k in columns: + assert np.array_equal(tc.param_df[k],tc._fit_df[k],equal_nan=True) - f = Fitter() - assert f.num_params is None - f.model = mw.model - assert f.num_params == len(mw.fit_parameters) +def test_Fitter__update_fit_df(): -def test_num_obs(): - - f = Fitter() - assert f.num_obs is None - - f.y_obs = np.arange(10) - assert f.num_obs == 10 + def test_fcn(a=1,b=2): return a*b + f = Fitter(some_function=test_fcn) + with pytest.raises(NotImplementedError): + f._update_fit_df() - with pytest.raises(ValueError): - f.y_obs = np.arange(2) +def test_Fitter_fit_df(): - f = Fitter() - f.y_obs = np.array([]) - assert f.num_obs == 0 + # This checks initialization. Need to write implementation-specific tests -def test_base_properties(): - """ - Test properties that can only be None in the base class. - """ + def test_fcn(a=1,b=2,x="array"): return x*a + b + x = np.arange(10) + y_obs = x*2 + 1 + + f = Fitter(some_function=test_fcn, + non_fit_kwargs={"x":x}) + + assert len(f.fit_df) == 2 + assert np.array_equal(f.fit_df["name"],["a","b"]) + assert np.array_equal(f.fit_df.columns, + ["name","estimate","std","low_95","high_95", + "guess","fixed","lower_bound","upper_bound", + "prior_mean","prior_std"]) - f = Fitter() - assert f.estimate is None - assert f.stdev is None - assert f.ninetyfive is None - assert f.fit_result is None - assert f.success is None - assert f.fit_info is None +def test_Fitter_samples(): + + def test_fcn(a=1,b=2,x="array"): return x*a + b + f = Fitter(some_function=test_fcn) assert f.samples is None - assert f.fit_df is None - -def test_fit_df(binding_curve_test_data,fitter_object): + f._samples = "something" + assert f.samples == "something" - def dummy_fit(f,N,*args,**kwargs): - """ - This function takes f and N and uses that to set fit results without - actually doing anything. It should be invoked by - - f = Fitter() - f._fit = dummy_fit - - then - - f.fit(f=f,N=N) - f and N are passed to dummy fit, which updates the fitter attributes - appropriately fro the test. - """ - f._fit_result = {} - f._success = True - - f._estimate = np.zeros(N,dtype=float) - f._stdev = 0.5*np.ones(N,dtype=float) - f._ninetyfive = 1.0*np.ones((2,N),dtype=float) - f._ninetyfive[0,:] = -2 - f._ninetyfive[1,:] = 2 - - N = len(binding_curve_test_data["guesses"]) - kwargs = {"N":N, - "model":binding_curve_test_data["generic_model"], - "y_obs":binding_curve_test_data["df"].Y, - "y_stdev":binding_curve_test_data["df"].Y_stdev, - "guesses":[5], - "names":["blah"], - "priors":[[0],[10]], - "bounds":[[-100],[100]]} - - generic_fit = fitter_object["generic_fit"] - assert generic_fit.success - - f = Fitter() - - # Check success gatekeeper - assert f.success is None - f._success = False - assert f.success is False - value = f.fit_df - assert value is None - - # ------------------------------------------------------------------------- - # Check non-model wrapper case - - test_kwargs = copy.deepcopy(kwargs) - f = Fitter() - f._fit = dummy_fit - - assert f.fit_df is None - f.fit(f=f,**test_kwargs) - df = f.fit_df - assert issubclass(type(df),pd.DataFrame) - - assert np.array_equal(df["param"],["blah"]) - assert np.array_equal(df["estimate"],[0.0]) - assert np.array_equal(df["stdev"],[0.5]) - assert np.array_equal(df["low_95"],[-2.0]) - assert np.array_equal(df["high_95"],[2.0]) - assert np.array_equal(df["guess"],[5]) - assert np.array_equal(df["prior_mean"],[0.0]) - assert np.array_equal(df["prior_std"],[10.0]) - assert np.array_equal(df["lower_bound"],[-100]) - assert np.array_equal(df["upper_bound"],[100]) - - test_kwargs = copy.deepcopy(kwargs) - f = Fitter() - f._fit = dummy_fit - assert f.fit_df is None - f.fit(f=f,**test_kwargs) - f._ninetyfive = None - df = f.fit_df - assert issubclass(type(df),pd.DataFrame) - assert np.array_equal(df["low_95"],[np.nan],equal_nan=True) - assert np.array_equal(df["high_95"],[np.nan],equal_nan=True) - assert "fixed" not in df.columns - - # ------------------------------------------------------------------------- - # Check model wrapper case +def test_Fitter_get_sample_df(): - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) + # some test data + y_obs = np.arange(10) + y_std = np.ones(10) + def test_fcn(a=1,b=2): return a*b*np.ones(10) + fake_samples = np.ones((1000,2),dtype=float) - N = len(mw.fit_parameters) - kwargs = {"N":N, - "model":mw, - "y_obs":binding_curve_test_data["df"].Y, - "y_stdev":binding_curve_test_data["df"].Y_stdev} - - - test_kwargs = copy.deepcopy(kwargs) - f = Fitter() - f._fit = dummy_fit - assert f.fit_df is None - f.fit(f=f,**test_kwargs) - df = f.fit_df - assert issubclass(type(df),pd.DataFrame) - assert np.array_equal(df["fixed"],[False,False]) - assert np.array_equal(df["low_95"],[-2,-2]) - assert np.array_equal(df["high_95"],[2,2]) - - # Wipe out ninetyfive in model and fitter classes and make sure the df - # turns into nan properly - f._ninetyfive = None - for p in mw.fit_parameters: - f.model.__self__.fit_parameters[p]._ninetyfive = None - - df = f.fit_df - assert np.array_equal(df["low_95"],[np.nan,np.nan],equal_nan=True) - assert np.array_equal(df["high_95"],[np.nan,np.nan],equal_nan=True) - - # reset model wrapper and fix variables - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - mw = ModelWrapper(model_to_test_wrap) - mw.fit_parameters["K1"].fixed = True - mw.fit_parameters["K1"].prior = [1,10] - mw.fit_parameters["K2"].prior = [1,10] - - N = len(mw.fit_parameters) - kwargs = {"N":N, - "model":mw, - "y_obs":binding_curve_test_data["df"].Y, - "y_stdev":binding_curve_test_data["df"].Y_stdev} - - test_kwargs = copy.deepcopy(kwargs) - f = Fitter() - f._fit = dummy_fit - assert f.fit_df is None - f.fit(f=f,**test_kwargs) - df = f.fit_df - - assert np.array_equal(df["param"],["K1","K2"]) - assert np.array_equal(df["estimate"],[0.0,0.0]) - assert np.array_equal(pd.isna(df["stdev"]),[True,False]) - assert np.array_equal(pd.isna(df["low_95"]),[True,False]) - assert np.array_equal(pd.isna(df["high_95"]),[True,False]) - assert np.array_equal(pd.isna(df["guess"]),[True,False]) - assert np.array_equal(pd.isna(df["prior_mean"]),[True,False]) - assert np.array_equal(pd.isna(df["prior_std"]),[True,False]) - assert np.array_equal(pd.isna(df["lower_bound"]),[True,False]) - assert np.array_equal(pd.isna(df["upper_bound"]),[True,False]) - - -def xtest_corner_plot(): - pass - -def test_write_samples(tmpdir): + # Error checking on num_samples + f = Fitter(some_function=test_fcn) + with pytest.raises(ValueError): + f.get_sample_df(num_samples=-1) + with pytest.raises(ValueError): + f.get_sample_df(num_samples="a") + + # empty class - return empty dataframe + f = Fitter(some_function=test_fcn) + sample_df = f.get_sample_df() + assert issubclass(type(sample_df),pd.DataFrame) + assert len(sample_df) == 0 + + # add y_obs, should be in dataframe by itself + f._y_obs = y_obs + sample_df = f.get_sample_df() + assert issubclass(type(sample_df),pd.DataFrame) + assert len(sample_df) == 10 + assert np.array_equal(sample_df["y_obs"],y_obs) + assert np.array_equal(sample_df.columns,["y_obs"]) + + # add y_std, should now be in dataframe + f._y_std = y_std + sample_df = f.get_sample_df() + assert issubclass(type(sample_df),pd.DataFrame) + assert len(sample_df) == 10 + assert np.array_equal(sample_df["y_obs"],y_obs) + assert np.array_equal(sample_df["y_std"],y_std) + assert np.array_equal(sample_df.columns,["y_obs","y_std"]) + + # Create a fitter that has apparently been run, but has no samples + f = Fitter(some_function=test_fcn) + f._y_obs = y_obs + f._y_std = y_std + f._fit_df = pd.DataFrame({"estimate":[10,20]}) + f._success = True + + sample_df = f.get_sample_df() + assert issubclass(type(sample_df),pd.DataFrame) + assert len(sample_df) == 10 + assert np.array_equal(sample_df["y_obs"],y_obs) + assert np.array_equal(sample_df["y_std"],y_std) + expected_y_calc = 10*20*np.ones(10) + assert np.array_equal(sample_df["y_calc"],expected_y_calc) + assert np.array_equal(sample_df.columns,["y_obs","y_std","y_calc"]) + + # Add some fake samples + f._samples = fake_samples + sample_df = f.get_sample_df() + assert len(sample_df) == 10 + assert np.array_equal(sample_df["y_obs"],y_obs) + assert np.array_equal(sample_df["y_std"],y_std) + expected_y_calc = 10*20*np.ones(10) + assert np.array_equal(sample_df["y_calc"],expected_y_calc) + assert np.array_equal(sample_df.columns[:4],["y_obs","y_std","y_calc","s00000"]) + assert sample_df.columns[-1] == "s00990" + assert len(sample_df.columns) == 103 + + # Get fewer samples + sample_df = f.get_sample_df(num_samples=10) + assert len(sample_df) == 10 + assert np.array_equal(sample_df["y_obs"],y_obs) + assert np.array_equal(sample_df["y_std"],y_std) + expected_y_calc = 10*20*np.ones(10) + assert np.array_equal(sample_df["y_calc"],expected_y_calc) + assert np.array_equal(sample_df.columns[:4],["y_obs","y_std","y_calc","s00000"]) + assert sample_df.columns[-1] == "s00999" + assert len(sample_df.columns) == 13 + + +def test_Fitter_write_samples(tmpdir): cwd = os.getcwd() os.chdir(tmpdir) test_file = "test-out.pickle" + def test_fcn(a,b,c,d,e): return a*b + # Should not write out because samples do not exist yet - f = Fitter() + f = Fitter(some_function=test_fcn) assert f.samples is None assert not os.path.exists(test_file) f.write_samples(test_file) @@ -1015,35 +787,49 @@ def test_write_samples(tmpdir): os.chdir(cwd) -def test_append_samples(tmpdir): +def test_Fitter_append_samples(tmpdir): cwd = os.getcwd() os.chdir(tmpdir) + # ----------------------------------------------------------------------- # make some files and arrays for testing + sample_array = np.ones((100,3),dtype=float) with open("test.pickle","wb") as p: pickle.dump(sample_array,p) with open("bad_file.txt","w") as g: g.write("yo") + # ----------------------------------------------------------------------- # Build a hacked Fitter object that has existing samples, three params, - # and an overwritten _update_estimates call that does nothing. - base_f = Fitter() + # and an overwritten _update_fit_df call that does nothing. + + # Create a three parameter model to assign to the fitter (setting the + # number of parameters) + def test_fcn(a,b,c): return a*b*c + + # Create fitter and assign model + base_f = Fitter(some_function=test_fcn) + + # Assign samples base_f._samples = sample_array.copy() - base_f._num_params = 3 assert np.array_equal(base_f.samples.shape,(100,3)) + + # add dummy function def dummy(*args,**kwargs): pass - base_f._update_estimates = dummy + base_f._update_fit_df = dummy - f = Fitter() + # ----------------------------------------------------------------------- + # Run tests # Nothing happens + f = Fitter(some_function=test_fcn) f.append_samples(sample_file=None, sample_array=None) # Check for existing samples (should fail without samples) - f = Fitter() + f = Fitter(some_function=test_fcn) assert f.samples is None with pytest.raises(ValueError): f.append_samples(sample_array=sample_array) @@ -1101,40 +887,95 @@ def dummy(*args,**kwargs): pass def dummy(*args,**kwargs): raise RuntimeError - f._update_estimates = dummy + f._update_fit_df = dummy with pytest.raises(RuntimeError): f.append_samples(sample_array=sample_array) + # ----------------------------------------------------------------------- + # Run test with a fixed parameter + + def test_fcn(a,b,c): return a*b*c + def dummy(*args,**kwargs): pass + f = Fitter(some_function=test_fcn) + f.param_df.loc["a","fixed"] = True + + # some hacks to put this into a state to append samples + f._samples = np.ones((100,2),dtype=float) + f._update_fit_df = dummy + + with pytest.raises(ValueError): + f.append_samples(sample_array=np.ones((100,3),dtype=float)) + + f.append_samples(sample_array=np.ones((100,2),dtype=float)) + os.chdir(cwd) -def test_fit_completeness_sanity_checking(binding_curve_test_data): +def test_Fitter_num_params(): - f = Fitter() + def test_fcn(a=2,b=3): return a*b + f = Fitter(some_function=test_fcn) + assert f.num_params == 2 - # This should not work because we have not specified a model, guesses, - # or y_obs yet - with pytest.raises(RuntimeError): - f.fit() + assert f.model() == 2*3 - f.model = binding_curve_test_data["generic_model"] + with pytest.raises(ValueError): + f.model([7,8,9]) - # This should not work because we have not specified guesses or y_obs - # yet. - with pytest.raises(RuntimeError): - f.fit() + def test_fcn(a=2,b=3,c=4): return a*b*c + f = Fitter(some_function=test_fcn) + assert f.num_params == 3 - f.guesses = binding_curve_test_data["guesses"] + assert f.model() == 2*3*4 - # This should not work because we have not specified y_obs yet - with pytest.raises(RuntimeError): - f.fit() + with pytest.raises(ValueError): + f.model([7,8,9,10]) - f.y_obs = binding_curve_test_data["df"].Y + def test_fcn(a=2,b=3,c=4): return a*b*c + f = Fitter(some_function=test_fcn) + assert f.num_params == 3 + + f.param_df.loc["a","fixed"] = True + f._model.finalize_params() + assert f.num_params == 2 - # Should now work because we've set everything essential (model, gueses, - # and y_obs). But it will throw NotImplementedError because it's the base - # class. + f.param_df.loc["b","fixed"] = True + f._model.finalize_params() + assert f.num_params == 1 + + +def test_Fitter_num_obs(): + + def test_fcn(a=2,b=3): return a*b + f = Fitter(some_function=test_fcn) + assert f.num_obs is None + + f._y_obs = np.arange(10) + assert f.num_obs == 10 + + f = Fitter(some_function=test_fcn) + f._y_obs = np.array([]) + assert f.num_obs == 0 + +def test_Fitter_success(): + + def test_fcn(a=2,b=3,c=4): return a*b*c + f = Fitter(some_function=test_fcn) + assert f.success is None + f._success = True + assert f.success is True + +def test_Fitter_fit_info(): + + def test_fcn(a=2,b=3,c=4): return a*b*c + f = Fitter(some_function=test_fcn) with pytest.raises(NotImplementedError): - f.fit() + f.fit_info +def test_Fitter_fit_result(): + + def test_fcn(a=2,b=3,c=4): return a*b*c + f = Fitter(some_function=test_fcn) + assert f.fit_result is None + f._fit_result = "something" + assert f.fit_result == "something" diff --git a/tests/dataprob/fitters/test_bayesian.py b/tests/dataprob/fitters/test_bayesian.py deleted file mode 100644 index 60000e4..0000000 --- a/tests/dataprob/fitters/test_bayesian.py +++ /dev/null @@ -1,515 +0,0 @@ - -import pytest - -import numpy as np -import pandas as pd -from scipy import stats - -from dataprob.fitters.bayesian import BayesianFitter -from dataprob.fitters.bayesian import _find_normalization -from dataprob.fitters.bayesian import _reconcile_bounds_and_priors -from dataprob.fitters.bayesian import _find_uniform_value - -from dataprob.model_wrapper import ModelWrapper - - -def test__find_normalization(): - - # Calculate cdf and pdf over different interval (and in slightly different - # way). Make sure the log_pdf is within 1% of log_cdf ground truth. - for scale in np.power(10.0,np.arange(-5,6)): - - frozen_rv = stats.norm(loc=0,scale=scale) - res = np.finfo(frozen_rv.pdf(0).dtype).resolution - offset = _find_normalization(scale=scale, - rv=stats.norm) - - cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) - pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) - if cdf == 0 or pdf == 0: - print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") - continue - - log_cdf = np.log(cdf) - log_pdf = np.log(pdf) + offset - - pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) - - print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) - - assert pct_diff < 0.01 - - # Calculate cdf and pdf over different interval (and in slightly different - # way). Make sure the log_pdf is within 1% of log_cdf ground truth. Move - # loc to make sure it still works - loc = 3 - for scale in np.power(10.0,np.arange(-1,6)): - - frozen_rv = stats.norm(loc=loc,scale=scale) - res = np.finfo(frozen_rv.pdf(loc).dtype).resolution - offset = _find_normalization(scale=scale, - rv=stats.norm) - - cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) - pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) - if cdf == 0 or pdf == 0: - print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") - continue - - log_cdf = np.log(cdf) - log_pdf = np.log(pdf) + offset - - pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) - - print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) - - assert pct_diff < 0.01 - - # Calculate cdf and pdf over different interval (and in slightly different - # way). Make sure the log_pdf is within 1% of log_cdf ground truth. Move - # loc to make sure it still works - loc = -3 - for scale in np.power(10.0,np.arange(8)): - - frozen_rv = stats.norm(loc=loc,scale=scale) - res = np.finfo(frozen_rv.pdf(loc).dtype).resolution - offset = _find_normalization(scale=scale, - rv=stats.norm) - - cdf = frozen_rv.cdf(0) - frozen_rv.cdf(-500000*res) - pdf = np.sum(frozen_rv.pdf(np.linspace(-500000*res,0,500001))) - if cdf == 0 or pdf == 0: - print(f"skipping {scale} b/c of 0s: cdf {cdf}, pdf: {pdf}") - continue - - log_cdf = np.log(cdf) - log_pdf = np.log(pdf) + offset - - pct_diff = np.abs((log_pdf - log_cdf)/log_cdf) - - print(f"Trying {scale}",offset,log_pdf,log_cdf,pct_diff) - - assert pct_diff < 0.01 - - -def test__reconcile_bounds_and_priors(): - - frozen_rv = stats.norm(loc=0,scale=1) - - res = np.finfo(frozen_rv.pdf(0).dtype).resolution - - result =_reconcile_bounds_and_priors(bounds=None,frozen_rv=frozen_rv) - assert result == 0 - - same_bounds = [[-1,-1],[0,0],[1,1]] - for bounds in same_bounds: - with pytest.warns(): - v =_reconcile_bounds_and_priors(bounds=bounds,frozen_rv=frozen_rv) - assert v == 0 - - frozen_rv = stats.norm(loc=0,scale=0.001) - left = frozen_rv.cdf(1) - for i in range(1,50): - - # Find a divisor of res that is sufficient to make the cdf different - right = frozen_rv.cdf(1 + res/i) - if left == right: - super_close_bounds = [1,1+res/i] - - # If the bounds are the same within numerical error, we can't do this - # test -- break out - if super_close_bounds[0] == super_close_bounds[1]: - break - - print(f"Testing {super_close_bounds}") - - # Make sure the function warns they are numerically identical and - # returns infinity - with pytest.warns(): - v =_reconcile_bounds_and_priors(bounds=super_close_bounds,frozen_rv=frozen_rv) - assert v == 0 - - break - - frozen_rv = stats.norm(loc=0,scale=1) - v =_reconcile_bounds_and_priors(bounds=[-1,1],frozen_rv=frozen_rv) - expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(1)))) - - frozen_rv = stats.norm(loc=0,scale=1) - v =_reconcile_bounds_and_priors(bounds=[0,1],frozen_rv=frozen_rv) - expected = np.log(1/(1 - (frozen_rv.cdf(0) + frozen_rv.sf(1)))) - - frozen_rv = stats.norm(loc=0,scale=1) - v =_reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) - expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) - - frozen_rv = stats.norm(loc=0,scale=10) - v =_reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) - expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) - - frozen_rv = stats.norm(loc=-2,scale=10) - v =_reconcile_bounds_and_priors(bounds=[-1,0],frozen_rv=frozen_rv) - expected = np.log(1/(1 - (frozen_rv.cdf(-1) + frozen_rv.sf(0)))) - - assert np.isclose(v,expected) - -def test__find_uniform_value(): - - finfo = np.finfo(np.ones(1,dtype=float)[0].dtype) - log_resolution = np.log(finfo.resolution) - log_max = np.log(finfo.max) - max_value = finfo.max - - bounds = None - expected_value = log_resolution - (np.log(2) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [-np.inf,np.inf] - expected_value = log_resolution - (np.log(2) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = np.array([0,1]) - expected_value = log_resolution - np.log((bounds[1] - bounds[0])) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - with pytest.warns(): - v = _find_uniform_value([1,1]) - assert v == 0.0 - - bounds = [-np.inf,0] - expected_value = log_resolution - (log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [-np.inf,-max_value/2] - expected_value = log_resolution - (np.log(0.5) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [-np.inf,max_value/2] - expected_value = log_resolution - (np.log(1.5) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [0,np.inf] - expected_value = log_resolution - (log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [max_value/2,np.inf] - expected_value = log_resolution - (np.log(0.5) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - bounds = [-max_value/2,np.inf] - expected_value = log_resolution - (np.log(1.5) + log_max) - value = _find_uniform_value(bounds) - assert np.isclose(value,expected_value) - - -def test_BayesianFitter__init__(): - - # default args work. check to make sure super().__init__ actually ran. - f = BayesianFitter() - assert f.fit_type == "bayesian" - assert f._num_obs is None - - # args are being set - f = BayesianFitter(num_walkers=100, - initial_walker_spread=1e-4, - ml_guess=True, - num_steps=100, - burn_in=0.1, - num_threads=1) - - assert f._num_walkers == 100 - assert np.isclose(f._initial_walker_spread,1e-4) - assert f._ml_guess is True - assert f._num_steps == 100 - assert np.isclose(f._burn_in,0.1) - assert f._num_threads == 1 - assert f._success is None - assert f.fit_type == "bayesian" - - # check num threads passing - with pytest.raises(NotImplementedError): - f = BayesianFitter(num_walkers=100, - initial_walker_spread=1e-4, - ml_guess=True, - num_steps=100, - burn_in=0.1, - num_threads=0) - - with pytest.raises(NotImplementedError): - f = BayesianFitter(num_walkers=100, - initial_walker_spread=1e-4, - ml_guess=True, - num_steps=100, - burn_in=0.1, - num_threads=10) - - # Pass bad value into each kwarg to make sure checker is running - with pytest.raises(ValueError): - f = BayesianFitter(num_walkers=0) - with pytest.raises(ValueError): - f = BayesianFitter(initial_walker_spread="stupid") - with pytest.raises(ValueError): - f = BayesianFitter(ml_guess="not a bool") - with pytest.raises(ValueError): - f = BayesianFitter(num_steps=1.2) - with pytest.raises(ValueError): - f = BayesianFitter(burn_in=0.0) - with pytest.raises(ValueError): - f = BayesianFitter(num_threads=-2) - -def test__setup_priors(): - - # basic functionality with a uniform and gaussian prior - f = BayesianFitter() - assert not hasattr(f,"_prior_frozen_rv") - assert not hasattr(f,"_uniform_priors") - assert not hasattr(f,"_gauss_prior_means") - assert not hasattr(f,"_gauss_prior_stds") - assert not hasattr(f,"_gauss_prior_offsets") - assert not hasattr(f,"_gauss_prior_mask") - - f.priors = np.array([[0,np.nan],[1,np.nan]]) - f.bounds = np.array([[-np.inf,-np.inf],[np.inf,np.inf]]) - f._setup_priors() - - assert f._prior_frozen_rv is not None - assert np.isclose(stats.norm(loc=0,scale=1).logpdf(0), - f._prior_frozen_rv.logpdf(0)) - assert issubclass(type(f._uniform_priors),float) - assert f._uniform_priors < 0 - - assert len(f._gauss_prior_means) == 1 - assert f._gauss_prior_means[0] == 0 - assert len(f._gauss_prior_stds) == 1 - assert f._gauss_prior_stds[0] == 1 - assert len(f._gauss_prior_offsets) == 1 - assert f._gauss_prior_offsets[0] < 0 - assert np.array_equal(f._gauss_prior_mask,[True,False]) - - # No gaussian priors - f = BayesianFitter() - f.priors = np.array([[np.nan,np.nan],[np.nan,np.nan]]) - f.bounds = np.array([[-np.inf,-np.inf],[np.inf,np.inf]]) - f._setup_priors() - - assert len(f._gauss_prior_means) == 0 - assert len(f._gauss_prior_stds) == 0 - assert len(f._gauss_prior_offsets) == 0 - assert np.array_equal(f._gauss_prior_mask,[False,False]) - - # No uniform priors - f = BayesianFitter() - f.priors = np.array([[1,2],[3,4]]) - f.bounds = np.array([[-np.inf,-np.inf],[np.inf,np.inf]]) - f._setup_priors() - - assert np.isclose(f._uniform_priors,0) - assert np.allclose(f._gauss_prior_means,[1,2]) - assert np.allclose(f._gauss_prior_stds,[3,4]) - assert len(f._gauss_prior_offsets) == 2 - assert np.sum(f._gauss_prior_offsets < 0) == 2 - assert np.array_equal(f._gauss_prior_mask,[True,True]) - - # check internal bounds calculation adjustment calculation - f = BayesianFitter() - f.priors = np.array([[10],[5]]) - f.bounds = np.array([[0],[20]]) - f._setup_priors() - - # Check parsing/basic run - assert np.isclose(f._uniform_priors,0) - assert np.array_equal(f._gauss_prior_means,[10]) - assert np.array_equal(f._gauss_prior_stds,[5]) - assert np.array_equal(f._gauss_prior_mask,[True]) - - # Make sure final offset from the code matches what we calculate here. (Not - # really testing math bit -- that's in the _find_normalization and - # _reconcile_bounds_and_priors tests). - base_offset = _find_normalization(scale=1,rv=stats.norm) - bounds = np.array([0,20]) - bounds_offset = _reconcile_bounds_and_priors(bounds=(bounds - 10)/5, - frozen_rv=stats.norm(loc=0,scale=1)) - assert np.isclose(base_offset + bounds_offset,f._gauss_prior_offsets[0]) - -def test_BayesianFitter_ln_prior(): - - f = BayesianFitter() - f.priors = np.array([[0],[1]]) - f.bounds = np.array([[-1],[1]]) - f._setup_priors() - - # Set up local calculation - frozen_rv = stats.norm(loc=0,scale=1) - base_offset = _find_normalization(scale=1,rv=stats.norm) - bounds = np.array([-1,1]) - bounds_offset = _reconcile_bounds_and_priors(bounds=(bounds-0)/1, - frozen_rv=frozen_rv) - - - # Try a set of values - for v in [-0.9,-0.1,0.0,0.1,0.9]: - - print("testing",v) - expected = frozen_rv.logpdf(v) + base_offset + bounds_offset - value = f.ln_prior(param=np.array([v])) - assert np.isclose(expected,value) - - # Go outside of bounds - expected = -np.inf - value = f.ln_prior(param=np.array([2])) - assert np.isclose(expected,value) - - # Now set up two priors, one gauss with one infinite bound, one uniform with - # infinte bound - f = BayesianFitter() - f.priors = np.array([[2,np.nan],[10,np.nan]]) - f.bounds = np.array([[-np.inf,-np.inf],[10,0]]) - f._setup_priors() - - # Set up local calculation - frozen_rv = stats.norm(loc=0,scale=1) - base_offset = _find_normalization(scale=1,rv=stats.norm) - bounds = np.array([-np.inf,10]) - bounds_offset = _reconcile_bounds_and_priors(bounds=(bounds-2)/10, - frozen_rv=frozen_rv) - - total_gauss_offset = base_offset + bounds_offset - uniform_prior = _find_uniform_value(bounds=np.array([-np.inf,0])) - - for v in [-1e6,-1,0,8]: - print("testing",v) - z = (v - 2)/10 - expected = frozen_rv.logpdf(z) + total_gauss_offset + uniform_prior - value = f.ln_prior(np.array([v,-5])) - assert np.isclose(expected,value) - - # Outside of bounds - value = f.ln_prior(np.array([-1,2])) - assert np.isclose(-np.inf,value) - -def test_BayesianFitter__ln_prob(binding_curve_test_data): - pass - - -def test_BayesianFitter_ln_prob(binding_curve_test_data): - """ - Test calculation ,looking for proper error checking. - """ - - f = BayesianFitter() - - input_params = binding_curve_test_data["input_params"] - - # Should fail, haven't loaded a model, y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.ln_prob(input_params) - - f.model = binding_curve_test_data["generic_model"] - - # Should fail, haven't loaded y_obs or y_stdev yet - with pytest.raises(RuntimeError): - f.ln_prob(input_params) - - df = binding_curve_test_data["df"] - f.y_obs = df.Y - - # Should fail, haven't loaded y_stdev yet - with pytest.raises(RuntimeError): - f.ln_prob(input_params) - f.y_stdev = df.Y_stdev - - # Should fail, haven't loaded priors or bounds yet - with pytest.raises(RuntimeError): - f.ln_prob(input_params) - - # Set bounds and priors - f.bounds = [[-np.inf],[np.inf]] - f.priors = [[0],[2]] - f._setup_priors() - - L = f.ln_prob(input_params) - -def xtest_BayesianFitter__fit(): - pass - -def xtest_BayesianFitter__update_estimates(): - pass - -def xtest_BayesianFitter_fit_info(): - pass - - -@pytest.mark.slow -def test_fit(binding_curve_test_data,fit_tolerance_fixture): - """ - Test the ability to fit the test data in binding_curve_test_data. - """ - - # Do fit using a generic unwrapped model and then creating and using a - # ModelWrapper model instance - - for model_key in ["generic_model","wrappable_model"]: - - f = BayesianFitter() - model = binding_curve_test_data[model_key] - guesses = binding_curve_test_data["guesses"] - df = binding_curve_test_data["df"] - input_params = np.array(binding_curve_test_data["input_params"]) - - if model_key == "wrappable_model": - model = ModelWrapper(model) - model.df = df - model.K.bounds = [0,10] - else: - f.bounds = [[0],[10]] - - f.fit(model=model,guesses=guesses,y_obs=df.Y,y_stdev=df.Y_stdev) - - # Assert that we succesfully passed in bounds - assert np.allclose(f.bounds,np.array([[0],[10]])) - - # Make sure fit worked - assert f.success - - # Make sure fit gave right answer - assert np.allclose(f.estimate, - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure mean of sampled uncertainty gives right answer - sampled = np.mean(f.samples,axis=0) - assert np.allclose(f.estimate, - sampled, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure corner plot call works and generates a plot - corner_fig = f.corner_plot() - assert corner_fig is not None - - # Make sure data frame that comes out is correct - df = f.fit_df - - assert isinstance(df,pd.DataFrame) - assert np.allclose(df["estimate"].iloc[:], - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - assert np.array_equal(df["param"],f.names) - assert np.array_equal(df["estimate"],f.estimate) - assert np.array_equal(df["stdev"],f.stdev) - assert np.array_equal(df["low_95"],f.ninetyfive[0,:]) - assert np.array_equal(df["high_95"],f.ninetyfive[1,:]) - assert np.array_equal(df["guess"],f.guesses) - assert np.array_equal(df["lower_bound"],f.bounds[0,:]) - assert np.array_equal(df["upper_bound"],f.bounds[1,:]) - assert np.array_equal(f.samples.shape,(9000,1)) diff --git a/tests/dataprob/fitters/test_bootstrap.py b/tests/dataprob/fitters/test_bootstrap.py index cfaadc6..6688586 100644 --- a/tests/dataprob/fitters/test_bootstrap.py +++ b/tests/dataprob/fitters/test_bootstrap.py @@ -1,79 +1,337 @@ import pytest -import dataprob +from dataprob.fitters.bootstrap import BootstrapFitter +from dataprob.model_wrapper.model_wrapper import ModelWrapper import numpy as np import pandas as pd -def test_init(): +def test_BootstrapFitter__init(): - f = dataprob.BootstrapFitter() - assert f.fit_type == "bootstrap" + def test_fcn(a,b): return None -@pytest.mark.slow -def test_fit(binding_curve_test_data,fit_tolerance_fixture): - """ - Test the ability to fit the test data in binding_curve_test_data. - """ + f = BootstrapFitter(some_function=test_fcn) + assert f.num_obs is None + + +def test_BootstrapFitter_fit(): + + def test_fcn(m,b,x): return m*x + b + + f = BootstrapFitter(some_function=test_fcn, + non_fit_kwargs={"x":np.arange(10)}) + y_obs = np.arange(10)*1 + 2 + y_std = 1.0 + + f.fit(y_obs=y_obs, + y_std=y_std, + num_bootstrap=3) + + assert f._num_bootstrap == 3 + + # This will only warn because the fitter will catch the failure and record + # it as a failure. It will stick 3 nan values into the samples array + with pytest.warns(): + f.fit(y_obs=y_obs, + y_std=y_std, + num_bootstrap=3, + not_real_scipy_optimize_kwarg=5) + assert f.samples.shape == (6,2) + assert np.sum(np.isnan(f.samples[:3,:])) == 0 + assert np.sum(np.isnan(f.samples[3:,:])) == 6 + + # Make a new fitter because of wackiness above + f = BootstrapFitter(some_function=test_fcn, + non_fit_kwargs={"x":np.arange(10)}) + + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_bootstrap="not_an_integer") + + # Need at least two to work + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_bootstrap=1) + + f.fit(y_obs=y_obs, + y_std=y_std, + num_bootstrap=2) + + + +def test_BootstrapFitter__fit(): + + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + # ------------------------------------------------------------------------- + # basic run with small number of bootstraps + + f = BootstrapFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_bootstrap=10) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert issubclass(type(f._fit_result),dict) + assert np.array_equal(list(f.fit_result.keys()),["total_samples", + "num_success", + "num_failed"]) + assert np.array_equal(f.samples.shape,[10,2]) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # Run again to make sure bootstraps append properly + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + f.fit(num_bootstrap=10) + assert f._fit_has_been_run is True + + assert np.array_equal(f.samples.shape,[20,2]) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + + # ------------------------------------------------------------------------- + # run with a function that always sends out nan -- should warn and show + # success == False + + def bad_model(a,b): return np.ones(10)*np.nan + f = BootstrapFitter(some_function=bad_model) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + with pytest.warns(): + f.fit(num_bootstrap=10) + assert f._fit_has_been_run is True + + # Should not succeed and should not update fit_df + assert f.success is False + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + + # ------------------------------------------------------------------------- + # basic run by set number of steps so small it never converges. should have + # fit.success == False on each least squares + + f = BootstrapFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.array_equal(f.param_df["guess"],[0,0]) + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert f.fit_result is None + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. Make sure containing function ran completely. + with pytest.warns(): + f.fit(num_bootstrap=10, + max_nfev=1) + assert f._fit_has_been_run is True + + # These outputs are determined within ._fit + assert np.array_equal(f.samples.shape,[10,2]) + assert f._success is False + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + + # ------------------------------------------------------------------------- + # Now run fit again without the tiny number of reps --> should now update + # estimate because enough samples come in. But it should still warn + # because lots of samples are nan from last runs. + + with pytest.warns(): + f.fit(num_bootstrap=10) + assert f._fit_has_been_run is True + + assert np.array_equal(f.samples.shape,[20,2]) + assert f._success is True + assert np.sum(np.isnan(f.fit_df["estimate"])) == 0 + +def test_BootstrapFitter__update_fit_df(): + + # Create a BootstrapFitter with a model loaded (and _fit_df implicitly + # created) + def test_fcn(a=1,b=2): return a*b + f = BootstrapFitter(some_function=test_fcn) - # Do fit using a generic unwrapped model and then creating and using a - # ModelWrapper model instance - - for model_key in ["generic_model","wrappable_model"]: - - f = dataprob.BootstrapFitter() - model = binding_curve_test_data[model_key] - guesses = binding_curve_test_data["guesses"] - df = binding_curve_test_data["df"] - input_params = np.array(binding_curve_test_data["input_params"]) - - if model_key == "wrappable_model": - model = dataprob.ModelWrapper(model) - model.df = df - model.K.bounds = [0,10] - else: - f.bounds = [[0],[10]] - - f.fit(model=model,guesses=guesses,y_obs=df.Y,y_stdev=df.Y_stdev) - - # Assert that we succesfully passed in bounds - assert np.allclose(f.bounds,np.array([[0],[10]])) - - # Make sure fit worked - assert f.success - - # Make sure fit gave right answer - assert np.allclose(f.estimate, - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure mean of sampled uncertainty gives right answer - sampled = np.mean(f.samples,axis=0) - assert np.allclose(f.estimate, - sampled, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure corner plot call works and generates a plot - corner_fig = f.corner_plot() - assert corner_fig is not None - - # Make sure data frame that comes out is correct - df = f.fit_df - - assert isinstance(df,pd.DataFrame) - assert np.allclose(df["estimate"].iloc[:], - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - assert np.array_equal(df["param"],f.names) - assert np.array_equal(df["estimate"],f.estimate) - assert np.array_equal(df["stdev"],f.stdev) - assert np.array_equal(df["low_95"],f.ninetyfive[0,:]) - assert np.array_equal(df["high_95"],f.ninetyfive[1,:]) - assert np.array_equal(df["guess"],f.guesses) - assert np.array_equal(df["lower_bound"],f.bounds[0,:]) - assert np.array_equal(df["upper_bound"],f.bounds[1,:]) + # add some fake samples + f._samples = np.random.normal(loc=0,scale=1,size=(10000,2)) + + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert np.sum(np.isnan(f._fit_df["std"])) == 2 + assert np.sum(np.isnan(f._fit_df["low_95"])) == 2 + assert np.sum(np.isnan(f._fit_df["high_95"])) == 2 + + f._update_fit_df() + + # Make sure mean/std/95 calc is write given fake samples we stuffed in + assert np.allclose(np.round(f._fit_df["estimate"],1),[0,0]) + assert np.allclose(np.round(f._fit_df["std"],1),[1,1]) + assert np.allclose(np.round(f._fit_df["low_95"],0),[-2,-2]) + assert np.allclose(np.round(f._fit_df["high_95"],0),[2,2]) + + # -------------------------------------------------------------------------- + # Send in np.nan and make sure it handles gracefully -- up to a point + + # Create a BootstrapFitter with a model loaded (and _fit_df implicitly + # created) + def test_fcn(a=1,b=2): return a*b + f = BootstrapFitter(some_function=test_fcn) + + # add some fake samples, then some nans. Should have no effect because we + # have plenty of samples. + f._samples = np.random.normal(loc=0,scale=1,size=(10000,2)) + f._samples[:10,:] = np.nan + + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + assert np.sum(np.isnan(f._fit_df["std"])) == 2 + assert np.sum(np.isnan(f._fit_df["low_95"])) == 2 + assert np.sum(np.isnan(f._fit_df["high_95"])) == 2 + + f._update_fit_df() + + # Make sure mean/std/95 calc is write given fake samples we stuffed in + assert np.allclose(np.round(f._fit_df["estimate"],1),[0,0]) + assert np.allclose(np.round(f._fit_df["std"],1),[1,1]) + assert np.allclose(np.round(f._fit_df["low_95"],0),[-2,-2]) + assert np.allclose(np.round(f._fit_df["high_95"],0),[2,2]) + + # two non-nan, it should work. Not checking estimate values because there + # are so few samples + f._samples[:f._samples.shape[0]-2,:] = np.nan + assert np.sum(np.isnan(f._samples[:,0])) == 10000 - 2 + f._update_fit_df() + + # only one non-nan sample; should die + f._samples[:f._samples.shape[0]-1,:] = np.nan + assert np.sum(np.isnan(f._samples[:,0])) == 10000 - 1 + with pytest.raises(ValueError): + f._update_fit_df() + + # -------------------------------------------------------------------------- + # make sure the updater properly copies in parameter values the user may + # have altered after defining the model but before finalizing the fit. + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + # super small sampler + f = BootstrapFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # fit_df should have been populated with default values from param_df + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # update param_df + f.param_df.loc["b","fixed"] = True + f.param_df.loc["b","guess"] = 1 + f.param_df.loc["b","prior_mean"] = 5 + f.param_df.loc["b","prior_std"] = 3 + f.param_df.loc["m","upper_bound"] = 10 + f.param_df.loc["m","lower_bound"] = -10 + + # no change in fit_df yet + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit(num_bootstrap=5) + assert f._fit_has_been_run is True + + # now fit_df should have been updated with guesses etc. + assert np.array_equal(f.fit_df["fixed"],[False,True]) + assert np.array_equal(f.fit_df["guess"],[0,1]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,5],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,3],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-10,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[10,np.inf]) + + + # -------------------------------------------------------------------------- + # make sure the function handles a tiny number of samples + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + + # super small sampler + f = BootstrapFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit(num_bootstrap=5) + assert f._fit_has_been_run is True + + assert f.samples.shape == (5,2) + f._update_fit_df() + + +def test_BootstrapFitter___repr__(): + + # Stupidly simple fitting problem. find slope + def model_to_wrap(m=1,x=np.array([1,2,3])): return m*x + + # Run _fit_has_been_run, success branch + f = BootstrapFitter(some_function=model_to_wrap) + f.fit(y_obs=np.array([2,4,6]), + y_std=[0.1,0.1,0.1]) + + out = f.__repr__().split("\n") + assert len(out) == 18 + + # hack, run _fit_has_been_run, _fit_failed branch + f._success = False + + out = f.__repr__().split("\n") + assert len(out) == 13 + + # Run not _fit_has_been_run + f = BootstrapFitter(some_function=model_to_wrap) + + out = f.__repr__().split("\n") + assert len(out) == 8 \ No newline at end of file diff --git a/tests/dataprob/fitters/test_ml.py b/tests/dataprob/fitters/test_ml.py index 407deec..9639cdb 100644 --- a/tests/dataprob/fitters/test_ml.py +++ b/tests/dataprob/fitters/test_ml.py @@ -1,76 +1,308 @@ import pytest -import dataprob +from dataprob.fitters.ml import MLFitter +from dataprob.model_wrapper.model_wrapper import ModelWrapper import numpy as np import pandas as pd -def test_init(): - - f = dataprob.MLFitter() - assert f.fit_type == "maximum likelihood" - -def test_fit(binding_curve_test_data,fit_tolerance_fixture): - """ - Test the ability to fit the test data in binding_curve_test_data. - """ - - # Do fit using a generic model and then creating and using a ModelWrapper - # around wrappable_model - - for model_key in ["generic_model","wrappable_model"]: - - f = dataprob.MLFitter() - model = binding_curve_test_data[model_key] - guesses = binding_curve_test_data["guesses"] - df = binding_curve_test_data["df"] - input_params = np.array(binding_curve_test_data["input_params"]) - - if model_key == "wrappable_model": - model = dataprob.ModelWrapper(model) - model.df = df - model.K.bounds = [0,10] - else: - f.bounds = [[0],[10]] - - f.fit(model=model,guesses=guesses,y_obs=df.Y,y_stdev=df.Y_stdev) - - # Assert that we succesfully passed in bounds - assert np.allclose(f.bounds,np.array([[0],[10]])) - - # Make sure fit worked - assert f.success - - # Make sure fit gave right answer - assert np.allclose(f.estimate, - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure mean of sampled uncertainty gives right answer - sampled = np.mean(f.samples,axis=0) - assert np.allclose(f.estimate, - sampled, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - # Make sure corner plot call works and generates a plot - corner_fig = f.corner_plot() - assert corner_fig is not None - - # Make sure data frame that comes out is correct - df = f.fit_df - - assert isinstance(df,pd.DataFrame) - assert np.allclose(df["estimate"].iloc[:], - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - assert np.array_equal(df["param"],f.names) - assert np.array_equal(df["estimate"],f.estimate) - assert np.array_equal(df["stdev"],f.stdev) - assert np.array_equal(df["low_95"],f.ninetyfive[0,:]) - assert np.array_equal(df["high_95"],f.ninetyfive[1,:]) - assert np.array_equal(df["guess"],f.guesses) - assert np.array_equal(df["lower_bound"],f.bounds[0,:]) - assert np.array_equal(df["upper_bound"],f.bounds[1,:]) +def test_MLFitter___init__(): + + def test_fcn(a,b): return a*b + + f = MLFitter(some_function=test_fcn) + assert f.num_obs is None + +def test_MLFitter_fit(): + + def test_fcn(m,b,x): return m*x + b + + f = MLFitter(some_function=test_fcn, + non_fit_kwargs={"x":np.arange(10)}) + y_obs = np.arange(10)*1 + 2 + y_std = 1.0 + + f.fit(y_obs=y_obs, + y_std=y_std, + num_samples=100) + + assert f._num_samples == 100 + + # This tests that the scipy.optimize.least_squares pass is happening + # correctly. + with pytest.raises(TypeError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_samples=100, + not_real_scipy_optimize_kwarg=5) + + with pytest.raises(ValueError): + f.fit(y_obs=y_obs, + y_std=y_std, + num_samples="not_an_integer") + + +def test_MLFitter__fit(): + + # Basic functionality and logic tests. Numerical tests on more interesting + # fitting problems are below. Tests run through .fit() because that + # initializes everything then calls ._fit(). See the base-class for that. + + # -------------------------------------------------------------------------- + # Simple model to test + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + expected_result = np.array([2,-1]) + + # -------------------------------------------------------------------------- + # Run fit + + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + assert np.sum(np.isnan(f._fit_df["estimate"])) == 2 + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit() + assert f._fit_has_been_run is True + + # now check outputs set by _fit itself + assert issubclass(type(f._fit_result),dict) + assert f._fit_result["success"] == True + assert f._fit_result["status"] == 1 + assert np.allclose(f._fit_result["x"],expected_result) + + # check success flag + assert f._success is True + + # check that it is setting the fit_df + assert np.sum(np.isnan(f._fit_df["estimate"])) == 0 + + # -------------------------------------------------------------------------- + # This should also delete samples if we run twice. Make sure this is true. + + # There are no samples till we access the property. Check this. + assert not hasattr(f,"_samples") + preserved_samples = f.samples + assert hasattr(f,"_samples") + + f.fit() + assert not hasattr(f,"_samples") + new_samples = f.samples + assert hasattr(f,"_samples") + + assert preserved_samples is not new_samples + + # -------------------------------------------------------------------------- + # Make sure that parameter fixing is propagating properly + + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + f.param_df.loc["b","guess"] = 0 + f.param_df.loc["b","fixed"] = True + assert np.array_equal(f.param_df["fixed"],[False,True]) + f.fit() + + +def test_MLFitter__update_fit_df(): + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + expected_result = np.array([2,-1]) + + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit() + assert f._fit_has_been_run is True + + # Make sure the dataframe is being populated. Not really testing numerical + # values, but making sure column assignments make sense. + assert len(f._fit_df) == 2 + assert np.allclose(f._fit_df["estimate"],expected_result) + assert np.sum(np.isnan(f._fit_df["std"])) == 0 + assert np.sum(np.isnan(f._fit_df["low_95"])) == 0 + assert np.sum(np.isnan(f._fit_df["high_95"])) == 0 + assert np.sum(f._fit_df["low_95"] < f._fit_df["estimate"]) == 2 + assert np.sum(f._fit_df["high_95"] > f._fit_df["estimate"]) == 2 + assert np.sum(f._fit_df["low_95"] < (f._fit_df["estimate"] - f._fit_df["std"])) == 2 + assert np.sum(f._fit_df["high_95"] > (f._fit_df["estimate"] + f._fit_df["std"])) == 2 + + # Hack so the jacobian is now a singular matrix. This will cause the + # function to throw a warning and set values to nan + f._fit_result.jac = np.zeros(f._fit_result.jac.shape,dtype=float) + + with pytest.warns(): + f._update_fit_df() + assert np.allclose(f._fit_df["estimate"],expected_result) + assert np.sum(np.isnan(f._fit_df["std"])) == 2 + assert np.sum(np.isnan(f._fit_df["low_95"])) == 2 + assert np.sum(np.isnan(f._fit_df["high_95"])) == 2 + + # -------------------------------------------------------------------------- + # make sure the updater properly copies in parameter values the user may + # have altered after defining the model but before finalizing the fit. + + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # fit_df should have been populated with default values from param_df + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # update param_df + f.param_df.loc["b","fixed"] = True + f.param_df.loc["b","guess"] = 1 + f.param_df.loc["b","prior_mean"] = 5 + f.param_df.loc["b","prior_std"] = 3 + f.param_df.loc["m","upper_bound"] = 10 + f.param_df.loc["m","lower_bound"] = -10 + + # no change in fit_df yet + assert np.array_equal(f.fit_df["fixed"],[False,False]) + assert np.array_equal(f.fit_df["guess"],[0,0]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,np.nan],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[np.inf,np.inf]) + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit() + assert f._fit_has_been_run is True + + # now fit_df should have been updated + assert np.array_equal(f.fit_df["fixed"],[False,True]) + assert np.array_equal(f.fit_df["guess"],[0,1]) + assert np.array_equal(f.fit_df["prior_mean"],[np.nan,5],equal_nan=True) + assert np.array_equal(f.fit_df["prior_std"],[np.nan,3],equal_nan=True) + assert np.array_equal(f.fit_df["lower_bound"],[-10,-np.inf]) + assert np.array_equal(f.fit_df["upper_bound"],[10,np.inf]) + +def test_MLFitter_samples(): + + def linear_fcn(m,b,x): return m*x + b + x = np.linspace(-5,5,10) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.1*np.ones(10)}) + expected_result = np.array([2,-1]) + + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + f.data_df = data_df + + # no samples generated + assert f.samples is None + + # run containing fit function from base class; that sets fit_has_been_run to + # true. + f.fit() + assert f._fit_has_been_run is True + + # Get samples. Make sure has right shape, right means, and that they are + # all unique + samples = f.samples + assert np.array_equal(samples.shape,[f._num_samples,2]) + assert np.allclose(np.round(np.mean(samples,axis=0)),expected_result) + assert np.unique(samples).shape[0] == f._num_samples*2 + + # Get samples again, which should return the same object again instead of + # regenerating + assert samples is f.samples + + # -------------------------------------------------------------------------- + # test singular matrix exception + + # re-run fit to clear samples + f.fit() + assert f._fit_has_been_run is True + assert not hasattr(f,"_samples") + + # Hack so the jacobian is now a singular matrix. This will cause the + # function to throw a warning return no samples + f._fit_result.jac = np.zeros(f._fit_result.jac.shape,dtype=float) + + # Should not store new samples or return them + with pytest.warns(): + new_samples = f.samples + assert new_samples is None + assert not hasattr(f,"_samples") + + # -------------------------------------------------------------------------- + # test trimming due to parameters being outside of bounds + + # Generate a fit with strong constraints on m and b + def linear_fcn(m=2,b=-1,x=None): return m*x + b + f = MLFitter(some_function=linear_fcn, + fit_parameters=["m","b"], + non_fit_kwargs={"x":x}) + data_df = pd.DataFrame({"y_obs":linear_fcn(m=2,b=-1,x=x), + "y_std":0.2*np.ones(10)}) + f.data_df = data_df + + f.param_df.loc["m","lower_bound"] = 1.9 + f.param_df.loc["m","upper_bound"] = 2.1 + + f.param_df.loc["b","lower_bound"] = -1.1 + f.param_df.loc["b","upper_bound"] = -0.9 + + f.fit() + assert f._fit_has_been_run is True + + # no samples generated + assert not hasattr(f,"_samples") + + # Generate samples + samples = f.samples + + # There should be a ton of samples lost due to the lower and upper bounds + assert samples.shape[0] < f._num_samples + + +def test_MLFitter___repr__(): + + # Stupidly simple fitting problem. find slope + def model_to_wrap(m=1,x=np.array([1,2,3])): return m*x + + # Run _fit_has_been_run, success branch + f = MLFitter(some_function=model_to_wrap) + f.fit(y_obs=np.array([2,4,6]), + y_std=[0.1,0.1,0.1]) + + out = f.__repr__().split("\n") + assert len(out) == 14 + + # hack, run _fit_has_been_run, _fit_failed branch + f._success = False + + out = f.__repr__().split("\n") + assert len(out) == 9 + + # Run not _fit_has_been_run + f = MLFitter(some_function=model_to_wrap) + + out = f.__repr__().split("\n") + assert len(out) == 5 + diff --git a/tests/dataprob/fitters/test_setup.py b/tests/dataprob/fitters/test_setup.py new file mode 100644 index 0000000..9a8c390 --- /dev/null +++ b/tests/dataprob/fitters/test_setup.py @@ -0,0 +1,82 @@ + +import pytest + +from dataprob.fitters.setup import setup + +from dataprob.fitters.ml import MLFitter +from dataprob.fitters.bootstrap import BootstrapFitter +from dataprob.fitters.bayesian.bayesian_sampler import BayesianSampler + +from dataprob.model_wrapper.model_wrapper import ModelWrapper +from dataprob.model_wrapper.vector_model_wrapper import VectorModelWrapper + +import numpy as np + +def test_setup(): + + def test_fcn(a,b=2): return a*b + + with pytest.raises(ValueError): + setup(some_function="not_a_function") + + # Test method passing (including default) + f = setup(some_function=test_fcn) + assert issubclass(type(f),MLFitter) + + f = setup(some_function=test_fcn, + method="ml") + assert issubclass(type(f),MLFitter) + + f = setup(some_function=test_fcn, + method="bootstrap") + assert issubclass(type(f),BootstrapFitter) + + f = setup(some_function=test_fcn, + method="mcmc") + assert issubclass(type(f),BayesianSampler) + + with pytest.raises(ValueError): + f = setup(some_function=test_fcn, + method="not_a_method") + + # Test fit_parameters passing + f = setup(some_function=test_fcn) + assert issubclass(type(f),MLFitter) + assert len(f.non_fit_kwargs) == 0 + + f = setup(some_function=test_fcn,fit_parameters=["b"]) + assert issubclass(type(f),MLFitter) + assert len(f.non_fit_kwargs) == 1 + assert f.non_fit_kwargs["a"] is None + + # Test non_fit_kwargs passing + f = setup(some_function=test_fcn) + assert issubclass(type(f),MLFitter) + assert len(f.non_fit_kwargs) == 0 + + f = setup(some_function=test_fcn,non_fit_kwargs={"b":2}) + assert issubclass(type(f),MLFitter) + assert len(f.non_fit_kwargs) == 1 + assert f.non_fit_kwargs["b"] == 2 + + # test vector_first_arg passing + f = setup(some_function=test_fcn) + assert issubclass(type(f),MLFitter) + assert issubclass(type(f._model),ModelWrapper) + + # test vector_first_arg passing + f = setup(some_function=test_fcn, + vector_first_arg=False) + assert issubclass(type(f),MLFitter) + assert issubclass(type(f._model),ModelWrapper) + + # test vector_first_arg passing + f = setup(some_function=test_fcn, + fit_parameters=["x","y","z"], + vector_first_arg=True) + assert issubclass(type(f),MLFitter) + assert issubclass(type(f._model),VectorModelWrapper) + assert np.array_equal(f.param_df["name"],["x","y","z"]) + + + diff --git a/tests/dataprob/model_wrapper/test__dataframe_processing.py b/tests/dataprob/model_wrapper/test__dataframe_processing.py new file mode 100644 index 0000000..95c6ef0 --- /dev/null +++ b/tests/dataprob/model_wrapper/test__dataframe_processing.py @@ -0,0 +1,418 @@ + +import pytest + +from dataprob.model_wrapper._dataframe_processing import _check_name +from dataprob.model_wrapper._dataframe_processing import _build_columns +from dataprob.model_wrapper._dataframe_processing import _check_bounds +from dataprob.model_wrapper._dataframe_processing import _check_guesses +from dataprob.model_wrapper._dataframe_processing import _check_priors + +from dataprob.model_wrapper._dataframe_processing import _df_to_dict + +from dataprob.model_wrapper._dataframe_processing import validate_dataframe +from dataprob.model_wrapper._dataframe_processing import param_into_existing + +from dataprob.util.read_spreadsheet import read_spreadsheet + +import numpy as np +import pandas as pd + +def test__check_name(): + + # basic run, make sure working on a copy + good_df = pd.DataFrame({"name":["K1","K2","K3"], + "test":[1,2,3]}) + out_df = _check_name(param_df=good_df, + param_in_order=["K1","K2","K3"]) + assert good_df is not out_df + + # no name column + bad_df = good_df.drop(columns=["name"]) + with pytest.raises(ValueError): + _check_name(param_df=bad_df, + param_in_order=["K1","K2","K3"]) + + # name not in df + with pytest.raises(ValueError): + _check_name(param_df=good_df, + param_in_order=["K1","K2","K3","K4"]) + + # name not in param_in_order + with pytest.raises(ValueError): + _check_name(param_df=good_df, + param_in_order=["K1","K2"]) + + # not unique parameter names + bad_df = pd.DataFrame({"name":["K1","K2","K2"], + "test":[1,2,3]}) + with pytest.raises(ValueError): + _check_name(param_df=bad_df, + param_in_order=["K1","K2","K2"]) + + # check index assignment and ordering + good_df = pd.DataFrame({"name":["K3","K2","K1"], + "test":[1,2,3]}) + out_df = _check_name(param_df=good_df, + param_in_order=["K1","K2","K3"]) + assert out_df.loc["K1","test"] == 3 + assert out_df.loc["K2","test"] == 2 + assert out_df.loc["K3","test"] == 1 + assert np.array_equal(out_df.index,["K1","K2","K3"]) + +def test__build_columns(): + + # Test default dataframe column building + df = pd.DataFrame({"name":["a","b"]}) + out_df = _build_columns(param_df=df, + default_guess=10) + + assert np.array_equal(out_df.columns,["name","guess","fixed","lower_bound", + "upper_bound","prior_mean","prior_std"]) + assert np.array_equal(out_df["name"],["a","b"]) + assert np.array_equal(out_df["guess"],[10,10]) + assert np.array_equal(out_df["fixed"],[False,False]) + assert np.array_equal(out_df["lower_bound"],[-np.inf,-np.inf]) + assert np.array_equal(out_df["upper_bound"],[np.inf,np.inf]) + assert np.sum(np.isnan(out_df["prior_mean"])) == 2 + assert np.sum(np.isnan(out_df["prior_std"])) == 2 + + # make sure existing columns are left intact + df = pd.DataFrame({"name":["a","b"], + "guess":[20,20], + "fixed":[False,True], + "lower_bound":[-200,-200], + "upper_bound":[200,200], + "prior_mean":[np.nan,20], + "prior_std":[np.nan,10]}) + out_df = _build_columns(param_df=df, + default_guess=10) + assert np.array_equal(out_df.columns,["name","guess","fixed","lower_bound", + "upper_bound","prior_mean","prior_std"]) + assert np.array_equal(out_df["name"],["a","b"]) + assert np.array_equal(out_df["guess"],[20,20]) + assert np.array_equal(out_df["fixed"],[False,True]) + assert np.array_equal(out_df["lower_bound"],[-200,-200]) + assert np.array_equal(out_df["upper_bound"],[200,200]) + assert np.array_equal(out_df["prior_mean"],[np.nan,20],equal_nan=True) + assert np.array_equal(out_df["prior_std"],[np.nan,10],equal_nan=True) + + # float coercion check + df = pd.DataFrame({"name":["a","b"], + "guess":["20",20.0], + "fixed":[False,True], + "lower_bound":["-200",-200], + "upper_bound":["200",200], + "prior_mean":[np.nan,"20"], + "prior_std":[np.nan,"10"]}) + out_df = _build_columns(param_df=df, + default_guess=10) + assert np.array_equal(out_df.columns,["name","guess","fixed","lower_bound", + "upper_bound","prior_mean","prior_std"]) + assert np.array_equal(out_df["name"],["a","b"]) + assert np.array_equal(out_df["guess"],[20,20]) + assert np.array_equal(out_df["fixed"],[False,True]) + assert np.array_equal(out_df["lower_bound"],[-200.0,-200.0]) + assert np.array_equal(out_df["upper_bound"],[200,200]) + assert np.array_equal(out_df["prior_mean"],[np.nan,20],equal_nan=True) + assert np.array_equal(out_df["prior_std"],[np.nan,10],equal_nan=True) + + # We sent in guess above as an integer. Make sure it's being properly + # coerced to a float. We sent in lower_bound as a float. It should also + # be a float. + assert np.issubdtype(out_df["guess"].dtype, np.floating) + assert np.issubdtype(out_df["lower_bound"].dtype, np.floating) + + # bad float coercion check + for bad_key in ["guess","lower_bound","upper_bound","prior_mean","prior_std"]: + df = pd.DataFrame({"name":["a","b"], + bad_key:["fail",1]}) + with pytest.raises(ValueError): + out_df = _build_columns(param_df=df, + default_guess=10) + + # verify nan coercion because other functions assume nan rather than None or + # pd.NA. This replicates what happens in the code. Not optimal, but should + # at least catch changes due to altered pandas or numpy implementations + df = pd.DataFrame({"x":[np.nan,pd.NA,None,1]}) + # raise an error because not a strictly float column + with pytest.raises(TypeError): + np.isnan(df["x"]) + df["x"] = pd.to_numeric(df["x"]) + # works now because pd.NA and None were coerced to np.nan + assert np.array_equal(np.isnan(df["x"]),[True,True,True,False]) + + # fixed coercion + df = pd.DataFrame({"name":["a","b"], + "fixed":[0,"True"]}) + out_df = _build_columns(param_df=df, + default_guess=10) + assert np.array_equal(out_df["fixed"],[False,True]) + + # bad fixed coercion + df = pd.DataFrame({"name":["a","b"], + "fixed":[pd.NA,"True"]}) + with pytest.raises(ValueError): + out_df = _build_columns(param_df=df, + default_guess=10) + +def test__check_bounds(): + + # check automatic nan assignment + df = pd.DataFrame({"name":["a","b","c","d"], + "lower_bound":[np.nan,pd.NA,None,-1], + "upper_bound":[np.nan,pd.NA,None,1]}) + out_df = _check_bounds(param_df=df) + assert np.array_equal(out_df["lower_bound"],[-np.inf,-np.inf,-np.inf,-1]) + assert np.array_equal(out_df["upper_bound"],[np.inf,np.inf,np.inf,1]) + + # Same values + for same in [-np.inf,-10.0,0.0,10.0,np.inf]: + print("checking same: ") + df = pd.DataFrame({"name":["a"], + "lower_bound":[same], + "upper_bound":[same]}) + with pytest.raises(ValueError): + _check_bounds(df) + + # flipped values (floats) + df = pd.DataFrame({"name":["a"], + "lower_bound":[10.0], + "upper_bound":[0.0]}) + with pytest.raises(ValueError): + _check_bounds(df) + + # flipped values (float vs inf) + df = pd.DataFrame({"name":["a"], + "lower_bound":[np.inf], + "upper_bound":[0.0]}) + with pytest.raises(ValueError): + _check_bounds(df) + + # flipped values (float vs inf) + df = pd.DataFrame({"name":["a"], + "lower_bound":[10.0], + "upper_bound":[-np.inf]}) + with pytest.raises(ValueError): + _check_bounds(df) + +def test__check_guesses(): + + test_df = _build_columns(pd.DataFrame({"name":["a","b"]}), + default_guess=10) + + out_df = _check_guesses(test_df) + assert np.array_equal(out_df["guess"],[10,10]) + + # above lower bound + df = test_df.copy() + df["lower_bound"] = 20 + with pytest.raises(ValueError): + _check_guesses(df) + + # below upper bound + df = test_df.copy() + df["upper_bound"] = 1 + with pytest.raises(ValueError): + _check_guesses(df) + + # nan guess + df = test_df.copy() + df["guess"] = [np.nan,np.nan] + with pytest.raises(ValueError): + _check_guesses(df) + +def test__check_priors(): + + test_df = pd.DataFrame({"name":["a","b"], + "prior_mean":[np.nan,np.nan], + "prior_std":[np.nan,np.nan]}) + + # both nan (okay) + df = test_df.copy() + df["prior_mean"] = [np.nan,np.nan] + df["prior_std"] = [np.nan,np.nan] + out_df = _check_priors(test_df) + assert np.sum(np.isnan(out_df["prior_mean"])) == 2 + assert np.sum(np.isnan(out_df["prior_std"])) == 2 + + # mean nan only (not okay) + df = test_df.copy() + df["prior_mean"] = [1.0,np.nan] + df["prior_std"] = [np.nan,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + + # std nan only (not okay) + df = test_df.copy() + df["prior_mean"] = [np.nan,np.nan] + df["prior_std"] = [1.0,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + + # both non-nan (okay) + df = test_df.copy() + df["prior_mean"] = [1.0,np.nan] + df["prior_std"] = [1.0,np.nan] + out_df = _check_priors(df) + assert np.array_equal(out_df["prior_mean"],[1.0,np.nan],equal_nan=True) + assert np.array_equal(out_df["prior_std"],[1.0,np.nan],equal_nan=True) + + # negative std, fail + df = test_df.copy() + df["prior_mean"] = [1.0,np.nan] + df["prior_std"] = [-1.0,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + + # inf bad, fail + df = test_df.copy() + df["prior_mean"] = [np.inf,np.nan] + df["prior_std"] = [1,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + + # inf bad, fail + df = test_df.copy() + df["prior_mean"] = [1,np.nan] + df["prior_std"] = [np.inf,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + + # inf bad, fail + df = test_df.copy() + df["prior_mean"] = [np.inf,np.nan] + df["prior_std"] = [np.inf,np.nan] + with pytest.raises(ValueError): + _check_priors(df) + +def test__df_to_dict(): + + # name column check + some_df = pd.DataFrame({"blah":[1,2]}) + with pytest.raises(ValueError): + _df_to_dict(some_df) + + # validate string coercion + some_df = pd.DataFrame({"name":[1,2]}) + out = _df_to_dict(some_df) + assert len(out.keys()) == 2 + assert np.array_equal(list(out.keys()),["1","2"]) + + # validate uniqueness check + some_df = pd.DataFrame({"name":["test","test"]}) + with pytest.raises(ValueError): + _df_to_dict(some_df) + + # should work + some_df = pd.DataFrame({"name":["a","b"], + "test":[1,2], + "this":["c","d"]}) + some_dict = _df_to_dict(some_df) + + assert len(some_dict.keys()) == 2 + assert np.array_equal(list(some_dict.keys()),["a","b"]) + assert some_dict["a"]["test"] == 1 + assert some_dict["b"]["test"] == 2 + assert some_dict["a"]["this"] == "c" + assert some_dict["b"]["this"] == "d" + +def test_validate_dataframe(spreadsheets): + + test_spreadsheet = spreadsheets["basic-spreadsheet.xlsx"] + + # validate dataframe check + with pytest.raises(ValueError): + validate_dataframe(param_df=test_spreadsheet, + param_in_order=["K1","K2","K3"], + default_guess=0) + + # All-in df check + df = read_spreadsheet(test_spreadsheet) + param_df = validate_dataframe(param_df=df, + param_in_order=["K1","K2","K3"], + default_guess=0) + + assert np.array_equal(param_df["name"], + ["K1","K2","K3"]) + assert np.array_equal(param_df["guess"], + [1e7,1e-6,1]) + assert np.array_equal(param_df["fixed"], + [True,False,False]) + + assert np.array_equal(np.isinf(param_df["lower_bound"]), + [True,True,False]) + assert param_df.loc["K3","lower_bound"] == -1 + + assert np.array_equal(np.isinf(param_df["upper_bound"]), + [True,True,False]) + assert param_df.loc["K3","upper_bound"] == 2 + + assert np.array_equal(pd.isna(param_df["prior_mean"]), + [False,True,False]) + assert param_df.loc["K1","prior_mean"] == 1e6 + assert np.array_equal(pd.isna(param_df["prior_std"]), + [False,True,False]) + assert param_df.loc["K1","prior_std"] == 10 + + +def test_param_into_existing(): + + param_df = pd.DataFrame({"name":["a","b"], + "guess":[1,2]}) + param_df = validate_dataframe(param_df, + param_in_order=["a","b"]) + assert np.array_equal(param_df["guess"],[1,2]) + + # Bad input + with pytest.raises(ValueError): + param_into_existing(param_input="not_good", + param_df=param_df) + + # Bring in df + param_input_df = pd.DataFrame({"name":["a"], + "guess":[10]}) + start_df = param_df.copy() + end_df = param_into_existing(param_input=param_input_df, + param_df=param_df) + assert end_df is not start_df # working on a copy + assert np.array_equal(end_df["name"],["a","b"]) + assert np.array_equal(end_df["guess"],[10,2]) + + # bring in dict + param_input_dict = {"a":{"guess":10}} + start_df = param_df.copy() + end_df = param_into_existing(param_input=param_input_dict, + param_df=param_df) + assert end_df is not start_df # working on a copy + assert np.array_equal(end_df["name"],["a","b"]) + assert np.array_equal(end_df["guess"],[10,2]) + + # name not in param_df + param_input_dict_bad = {"c":{"guess":10}} + with pytest.raises(ValueError): + param_into_existing(param_input=param_input_dict_bad, + param_df=start_df) + + # Extra column + param_input_df = pd.DataFrame({"name":["a"], + "guess":[20], + "extra_col":[5.0]}) + start_df = param_df.copy() + end_df = param_into_existing(param_input=param_input_df, + param_df=param_df) + assert end_df is not start_df # working on a copy + assert np.array_equal(end_df["name"],["a","b"]) + assert np.array_equal(end_df["guess"],[20,2]) + assert np.array_equal(end_df["extra_col"],[5,np.nan],equal_nan=True) + + # Extra column via dict + param_input_dict = {"a":{"guess":30}, + "b":{"extra_col":5.0}} + start_df = param_df.copy() + end_df = param_into_existing(param_input=param_input_dict, + param_df=param_df) + assert end_df is not start_df # working on a copy + assert np.array_equal(end_df["name"],["a","b"]) + assert np.array_equal(end_df["guess"],[30,2]) + assert np.array_equal(end_df["extra_col"],[np.nan,5.0],equal_nan=True) + \ No newline at end of file diff --git a/tests/dataprob/model_wrapper/test__function_processing.py b/tests/dataprob/model_wrapper/test__function_processing.py new file mode 100644 index 0000000..3e5054f --- /dev/null +++ b/tests/dataprob/model_wrapper/test__function_processing.py @@ -0,0 +1,373 @@ + +import pytest + +from dataprob.model_wrapper._function_processing import analyze_fcn_sig +from dataprob.model_wrapper._function_processing import reconcile_fittable +from dataprob.model_wrapper._function_processing import analyze_vector_input_fcn + +import numpy as np + +import copy + +def test_analyze_fcn_sig(): + + def test_fcn(a,b=2,c="test",d=3,*args,**kwargs): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a","b","c","d"]) + assert len(can_be_fit) == 3 + assert can_be_fit["a"] is None + assert can_be_fit["b"] == 2 + assert can_be_fit["d"] == 3 + assert len(cannot_be_fit) == 1 + assert cannot_be_fit["c"] == "test" + assert has_kwargs is True + + # Drop kwargs + def test_fcn(a,b=2,c="test",d=3,*args): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a","b","c","d"]) + assert len(can_be_fit) == 3 + assert can_be_fit["a"] is None + assert can_be_fit["b"] == 2 + assert can_be_fit["d"] == 3 + assert len(cannot_be_fit) == 1 + assert cannot_be_fit["c"] == "test" + assert has_kwargs is False + + # Drop args, but keep kwargs + def test_fcn(a,b=2,c="test",d=3,**kwargs): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a","b","c","d"]) + assert len(can_be_fit) == 3 + assert can_be_fit["a"] is None + assert can_be_fit["b"] == 2 + assert can_be_fit["d"] == 3 + assert len(cannot_be_fit) == 1 + assert cannot_be_fit["c"] == "test" + assert has_kwargs is True + + # Nothing + def test_fcn(): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert len(all_args) == 0 + assert len(can_be_fit) == 0 + assert len(cannot_be_fit) == 0 + assert has_kwargs is False + + # only kwargs + def test_fcn(**kwargs): pass + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert len(all_args) == 0 + assert len(can_be_fit) == 0 + assert len(cannot_be_fit) == 0 + assert has_kwargs is True + + # one fittable arg, no default + def test_fcn(a): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a"]) + assert len(can_be_fit) == 1 + assert can_be_fit["a"] is None + assert len(cannot_be_fit) == 0 + assert has_kwargs is False + + # one fittable arg, no default + def test_fcn(a): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a"]) + assert len(can_be_fit) == 1 + assert can_be_fit["a"] is None + assert len(cannot_be_fit) == 0 + assert has_kwargs is False + + # one non-fittable arg + def test_fcn(a="test"): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a"]) + assert len(can_be_fit) == 0 + assert len(cannot_be_fit) == 1 + assert cannot_be_fit["a"] == "test" + assert has_kwargs is False + + # Send in a list + def test_fcn(a=[1,2,3]): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a"]) + assert len(can_be_fit) == 0 + assert len(cannot_be_fit) == 1 + assert np.array_equal(cannot_be_fit["a"],[1,2,3]) + assert has_kwargs is False + + # Send in a float numpy array + def test_fcn(a=np.array([1,2,3])): pass + + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert np.array_equal(all_args,["a"]) + assert len(can_be_fit) == 0 + assert len(cannot_be_fit) == 1 + assert np.array_equal(cannot_be_fit["a"],[1,2,3]) + assert has_kwargs is False + + # test for bool default not being fittable + def test_fcn(a=1,b=False): pass + all_args, can_be_fit, cannot_be_fit, has_kwargs = analyze_fcn_sig(test_fcn) + assert len(all_args) == 2 + assert len(can_be_fit) == 1 + assert len(cannot_be_fit) == 1 + assert has_kwargs is False + assert can_be_fit["a"] == 1.0 + assert cannot_be_fit["b"] is False + +def test_reconcile_fittable(): + + base_kwargs = {"fit_parameters":None, + "non_fit_kwargs":None, + "all_args":[], + "can_be_fit":{}, + "cannot_be_fit":{}, + "has_kwargs":False} + + + # no parameters at all + kwargs = copy.deepcopy(base_kwargs) + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # No fittable parameters + kwargs = copy.deepcopy(base_kwargs) + kwargs["all_args"] = ["a"] + kwargs["cannot_be_fit"] = {"a":"test"} + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # No fittable parameter, but we tell function to use "a" anyway + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a"] + kwargs["all_args"] = ["a"] + kwargs["cannot_be_fit"] = {"a":"test"} + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # No fittable parameter. tell it to use "b" (not in function, no kwarg) + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["b"] + kwargs["all_args"] = ["a"] + kwargs["cannot_be_fit"] = {"a":"test"} + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # No fittable parameter, but kwarg. tell it to use "b" + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["b"] + kwargs["all_args"] = ["a"] + kwargs["cannot_be_fit"] = {"a":"test"} + kwargs["has_kwargs"] = True + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["b"]) + assert np.array_equal(not_fittable,["a"]) + + # Make sure it trims off after first fittable arg + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = None + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"c":2} + kwargs["cannot_be_fit"] = {"b":"test"} + kwargs["has_kwargs"] = False + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a"]) + assert np.array_equal(not_fittable,["b","c"]) + + # Make sure we can force it to take after non-fittable breaks arg list + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","c"] + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"c":2} + kwargs["cannot_be_fit"] = {"b":"test"} + kwargs["has_kwargs"] = False + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","c"]) + assert np.array_equal(not_fittable,["b"]) + + # Fail. non-fittable in the mix + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","b"] + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"c":2} + kwargs["cannot_be_fit"] = {"b":"test"} + kwargs["has_kwargs"] = False + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # Fail. non-fittable in the mix + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","d"] + kwargs["all_args"] = ["a","b","c","d"] + kwargs["can_be_fit"] = {"a":1,"c":2} + kwargs["cannot_be_fit"] = {"b":"test"} + kwargs["has_kwargs"] = True + + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","d"]) + assert np.array_equal(not_fittable,["b","c"]) + + # Send in non_fit_kwargs where this is in "cannot be fit" + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","b"] + kwargs["non_fit_kwargs"] = {"c":33} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2} + kwargs["cannot_be_fit"] = {"c":"test"} + kwargs["has_kwargs"] = True + + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","b"]) + assert np.array_equal(not_fittable,["c"]) + + # Send in non_fit_kwargs where this is in "can be fit" + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","b"] + kwargs["non_fit_kwargs"] = {"c":33} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","b"]) + assert np.array_equal(not_fittable,["c"]) + + # Send in non_fit_kwargs but not fit_parameters + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = None + kwargs["non_fit_kwargs"] = {"c":33} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","b"]) + assert np.array_equal(not_fittable,["c"]) + + # Send in same value in non_fit_kwargs and fit_parameters + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","b"] + kwargs["non_fit_kwargs"] = {"b":None,"c":None} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # Send in all args as non_fit_kwargs, not fittable! + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = None + kwargs["non_fit_kwargs"] = {"a":1,"b":3,"c":3} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # Send in non_fit_kwargs that are not in the function signature + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = None + kwargs["non_fit_kwargs"] = {"d":None} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = False + with pytest.raises(ValueError): + fittable, not_fittable = reconcile_fittable(**kwargs) + + # Send in non_fit_kwargs that are not in the function signature, but + # has_kwargs, so okay + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = None + kwargs["non_fit_kwargs"] = {"d":None} + kwargs["all_args"] = ["a","b","c"] + kwargs["can_be_fit"] = {"a":1,"b":2,"c":3} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","b","c"]) + assert np.array_equal(not_fittable,["d"]) + + + # Send in fit_parameters and non_fit_kwargs with only **kwargs + kwargs = copy.deepcopy(base_kwargs) + kwargs["fit_parameters"] = ["a","b"] + kwargs["non_fit_kwargs"] = {"c":None,"d":None} + kwargs["all_args"] = [] + kwargs["can_be_fit"] = {} + kwargs["cannot_be_fit"] = {} + kwargs["has_kwargs"] = True + + fittable, not_fittable = reconcile_fittable(**kwargs) + assert np.array_equal(fittable,["a","b"]) + assert np.array_equal(not_fittable,["c","d"]) + + +def test_analyze_vector_input_fcn(): + + def test_fcn(a,b=1,*args,**kwargs): pass + + first_args, other_kwargs, has_kwargs = analyze_vector_input_fcn(test_fcn) + assert first_args == "a" + assert len(other_kwargs) == 1 + assert other_kwargs["b"] == 1 + assert has_kwargs is True + + def test_fcn(*args,**kwargs): pass + + first_args, other_kwargs, has_kwargs = analyze_vector_input_fcn(test_fcn) + assert first_args == None + assert len(other_kwargs) == 0 + assert has_kwargs is True + + def test_fcn(a=20,*args,**kwargs): pass + + first_args, other_kwargs, has_kwargs = analyze_vector_input_fcn(test_fcn) + assert first_args == "a" + assert len(other_kwargs) == 0 + assert has_kwargs is True + + def test_fcn(a,b,c,d=5,*args,**kwargs): pass + + first_args, other_kwargs, has_kwargs = analyze_vector_input_fcn(test_fcn) + assert first_args == "a" + assert len(other_kwargs) == 3 + assert other_kwargs["b"] is None + assert other_kwargs["c"] is None + assert other_kwargs["d"] == 5 + assert has_kwargs is True + + def test_fcn(a,b,c,d=5): pass + + first_args, other_kwargs, has_kwargs = analyze_vector_input_fcn(test_fcn) + assert first_args == "a" + assert len(other_kwargs) == 3 + assert other_kwargs["b"] is None + assert other_kwargs["c"] is None + assert other_kwargs["d"] == 5 + assert has_kwargs is False + + def test_fcn(a,b,c,d,*args): pass + + first_args, other_kwargs, has_kwargs= analyze_vector_input_fcn(test_fcn) + assert first_args == "a" + assert len(other_kwargs) == 3 + assert other_kwargs["b"] is None + assert other_kwargs["c"] is None + assert other_kwargs["d"] is None + assert has_kwargs is False + \ No newline at end of file diff --git a/tests/dataprob/model_wrapper/test_model_wrapper.py b/tests/dataprob/model_wrapper/test_model_wrapper.py new file mode 100644 index 0000000..138aee1 --- /dev/null +++ b/tests/dataprob/model_wrapper/test_model_wrapper.py @@ -0,0 +1,596 @@ +import pytest + +from dataprob.model_wrapper.model_wrapper import ModelWrapper + +import numpy as np +import pandas as pd + +def test_ModelWrapper___init__(): + + def model_to_test_wrap(a,b=2,c=3,d="test",e=3): return a*b*c + + # Test argument checking + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit="not_callable") + + # Bad fit_parameters + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit=model_to_test_wrap, + fit_parameters=1.0) + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit=model_to_test_wrap, + fit_parameters="a_string") + + # bad non_fit_kwargs + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit=model_to_test_wrap, + non_fit_kwargs=[1.0]) + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit=model_to_test_wrap, + non_fit_kwargs="a_string") + + # bad default guess + with pytest.raises(ValueError): + mw = ModelWrapper(model_to_fit=model_to_test_wrap, + default_guess="not_a_number") + + # Test basic functionality. Makes sure model_to_fit being captured correctly + mw = ModelWrapper(model_to_fit=model_to_test_wrap) + assert mw._model_to_fit is model_to_test_wrap + assert mw._default_guess == 0 + + assert len(mw._param_df) == 3 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["b","guess"] == 2 + assert mw._param_df.loc["c","guess"] == 3 + + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + + # make sure fit_parameters are being passed + mw = ModelWrapper(model_to_test_wrap, + fit_parameters=["a"]) + assert mw._model_to_fit is model_to_test_wrap + assert mw._default_guess == 0 + + assert len(mw._param_df) == 1 + assert mw._param_df.loc["a","guess"] == 0 + + assert len(mw._non_fit_kwargs) == 4 + assert mw._non_fit_kwargs["b"] == 2 + assert mw._non_fit_kwargs["c"] == 3 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + + # make sure non_fit_kwargs are being passed + mw = ModelWrapper(model_to_test_wrap,non_fit_kwargs={"a":20}) + assert mw._model_to_fit is model_to_test_wrap + assert mw._default_guess == 0 + + assert len(mw._param_df) == 2 + assert mw._param_df.loc["b","guess"] == 2 + assert mw._param_df.loc["c","guess"] == 3 + + assert len(mw._non_fit_kwargs) == 3 + assert mw._non_fit_kwargs["a"] == 20 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + + # make sure default_guess is being passed + mw = ModelWrapper(model_to_test_wrap,default_guess=1.0) + assert mw._model_to_fit is model_to_test_wrap + assert mw._default_guess == 1 + + + +def test_ModelWrapper__load_model(): + + # Create a ModelWrapper that has just been initialized but has not + # run load_model + class TestModelWrapper(ModelWrapper): + def __init__(self): + self._default_guess = 0.0 + self._param_df = pd.DataFrame({"name":[]}) + self._non_fit_kwargs = {} + + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + + def model_to_test_wrap(a,b=2,c=3,d="test",e=3): return a*b*c + + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs=None) + assert mw._model_to_fit is model_to_test_wrap + + # analyze_fcn_sig, and reconcile_fittable, check are all tested in + # test_function_processing. We can basically only test results here. The + # model above covers almost the whole decision tree. Tests of complete + # decision tree follow. + + assert len(mw._param_df) == 3 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["b","guess"] == 2 + assert mw._param_df.loc["c","guess"] == 3 + + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + assert mw._non_fit_kwargs_keys == set(["d","e"]) + + # This makes sure that the finalize_params() call is happening. only + # test here because the logic of that call is tested in its own method call. + assert np.array_equal(mw._fit_params_in_order,["a","b","c"]) + assert len(mw._mw_kwargs) == 5 + assert mw._mw_kwargs["a"] == 0.0 + assert mw._mw_kwargs["b"] == 2.0 + assert mw._mw_kwargs["c"] == 3.0 + assert mw._mw_kwargs["d"] == "test" + assert mw._mw_kwargs["e"] == 3 + + # Now validate interaction with input function and fit_parameters. Only + # grab one argument. + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + mw._load_model(model_to_test_wrap, + fit_parameters=["a"], + non_fit_kwargs=None) + assert len(mw._param_df) == 1 + assert mw._param_df.loc["a","guess"] == 0 + + assert len(mw._non_fit_kwargs) == 4 + assert mw._non_fit_kwargs["b"] == 2 + assert mw._non_fit_kwargs["c"] == 3 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + assert mw._non_fit_kwargs_keys == set(["b","c","d","e"]) + + # Now validate interaction with input function and fit_parameters. Add + # argument that would not normally be grabbed. + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + mw._load_model(model_to_test_wrap, + fit_parameters=["a","e"], + non_fit_kwargs=None) + assert len(mw._param_df) == 2 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["e","guess"] == 3 + + assert len(mw._non_fit_kwargs) == 3 + assert mw._non_fit_kwargs["b"] == 2 + assert mw._non_fit_kwargs["c"] == 3 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs_keys == set(["b","c","d"]) + + # Add argument not thought to be fittable by the parser. + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=["a","d"], + non_fit_kwargs=None) + + # fittable param that is not in arguments + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=["w"], + non_fit_kwargs=None) + + # not enough fittable params + mw = TestModelWrapper() + assert len(mw.__dict__) == 3 + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=[], + non_fit_kwargs=None) + + # send in a model that is only kwargs and make sure it still gets a fittable + # param. + def model_to_test_wrap(**kwargs): return kwargs["a"] + mw = TestModelWrapper() + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs=None) + + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=["a"], + non_fit_kwargs=None) + assert len(mw._param_df) == 1 + assert mw._param_df.loc["a","guess"] == 0 + assert len(mw._non_fit_kwargs) == 0 + + # Test non_fit_kwargs on non-fittable argument with no default + def model_to_test_wrap(a,b=1,c="test"): return a*b + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs={"a":42}) + assert len(mw._param_df) == 1 + assert mw._param_df.loc["b","guess"] == 1 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["a"] == 42 + assert mw._non_fit_kwargs["c"] == "test" + assert mw._non_fit_kwargs_keys == set(["a","c"]) + + # Test non_fit_kwargs on fittable argument with default + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs={"b":17}) + assert len(mw._param_df) == 1 + assert mw._param_df.loc["a","guess"] == 0 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] == 17 + assert mw._non_fit_kwargs["c"] == "test" + assert mw._non_fit_kwargs_keys == set(["b","c"]) + + # Test non_fit_kwargs on non-fittable argument with default + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs={"c":(1,3)}) + assert len(mw._param_df) == 2 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["b","guess"] == 1 + assert len(mw._non_fit_kwargs) == 1 + assert mw._non_fit_kwargs["c"] == (1,3) + assert mw._non_fit_kwargs_keys == set(["c"]) + + # Test reasonable fit_parameters and non_fit_kwargs + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=["b"], + non_fit_kwargs={"a":10, + "c":"rocket"}) + assert len(mw._param_df) == 1 + assert mw._param_df.loc["b","guess"] == 1 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["a"] == 10 + assert mw._non_fit_kwargs["c"] == "rocket" + assert mw._non_fit_kwargs_keys == set(["a","c"]) + + # Send in conflicting fittable and non_fit_kwargs + mw = TestModelWrapper() + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs={"a":10}) + + # Send in too many non_fit_kwargs + mw = TestModelWrapper() + with pytest.raises(ValueError): + mw._load_model(model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs={"a":10,"b":20}) + + # kwargs -- should take anything + def model_to_test_wrap(**kwargs): pass + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs={"c":5,"d":13}) + assert len(mw._param_df) == 2 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["b","guess"] == 0 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["c"] == 5 + assert mw._non_fit_kwargs["d"] == 13 + assert mw._non_fit_kwargs_keys == set(["c","d"]) + + # kwargs -- should take anything, gracefully handle empty dict of non_fit_kwargs + def model_to_test_wrap(**kwargs): pass + mw = TestModelWrapper() + mw._load_model(model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs={}) + assert len(mw._param_df) == 2 + assert mw._param_df.loc["a","guess"] == 0 + assert mw._param_df.loc["b","guess"] == 0 + assert len(mw._non_fit_kwargs) == 0 + assert mw._non_fit_kwargs_keys == set([]) + + +def test_ModelWrapper__validate_non_fit_kwargs(): + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + assert mw._non_fit_kwargs_keys == set(["d","e"]) + + # Set value, should work + assert mw._non_fit_kwargs["e"] == 3 + mw.non_fit_kwargs["e"] = 5 + assert mw._non_fit_kwargs["e"] == 5 + mw._validate_non_fit_kwargs() + + # add extra value, should fail + assert len(mw._non_fit_kwargs) == 2 + mw.non_fit_kwargs["f"] = 11 + with pytest.raises(ValueError): + mw._validate_non_fit_kwargs() + + # remove needed value + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + assert mw._non_fit_kwargs_keys == set(["d","e"]) + assert len(mw._non_fit_kwargs) == 2 + mw.non_fit_kwargs.pop("e") + with pytest.raises(ValueError): + mw._validate_non_fit_kwargs() + + +def test_ModelWrapper_finalize_params(): + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + + # Check initial configuration after __init__ + assert np.array_equal(mw._fit_params_in_order,["a","b","c"]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + assert len(mw._mw_kwargs) == 5 + assert mw._mw_kwargs["a"] == 1 + assert mw._mw_kwargs["b"] == 2 + assert mw._mw_kwargs["c"] == 3 + assert mw._mw_kwargs["d"] == "test" + assert mw._mw_kwargs["e"] == 3 + + # Edit parameters + mw.param_df.loc["a","guess"] = 10 + mw.param_df.loc["a","fixed"] = True + + # Make sure no change + assert np.array_equal(mw._fit_params_in_order,["a","b","c"]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + assert len(mw._mw_kwargs) == 5 + assert mw._mw_kwargs["a"] == 1 + assert mw._mw_kwargs["b"] == 2 + assert mw._mw_kwargs["c"] == 3 + assert mw._mw_kwargs["d"] == "test" + assert mw._mw_kwargs["e"] == 3 + assert np.array_equal(mw._unfixed_mask,[True,True,True]) + assert np.array_equal(mw._unfixed_param_names,["a","b","c"]) + + # Run function + mw.finalize_params() + + # Check for expected output + assert np.array_equal(mw._fit_params_in_order,["a","b","c"]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + assert len(mw._mw_kwargs) == 5 + assert mw._mw_kwargs["a"] == 10 + assert mw._mw_kwargs["b"] == 2 + assert mw._mw_kwargs["c"] == 3 + assert mw._mw_kwargs["d"] == "test" + assert mw._mw_kwargs["e"] == 3 + assert np.array_equal(mw._unfixed_mask,[False,True,True]) + assert np.array_equal(mw._unfixed_param_names,["b","c"]) + + # send in bad edit -- finalize should catch + mw.param_df.loc["not_a_param","guess"] = 5 + assert np.array_equal(mw.param_df.index,["a","b","c","not_a_param"]) + with pytest.raises(ValueError): + mw.finalize_params() + + # make sure it's running _validate_non_fit_kwargs + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + + # works fine + mw.finalize_params() + + # add extra parameter + mw.non_fit_kwargs["f"] = "extra_kwarg" + with pytest.raises(ValueError): + mw.finalize_params() + + # remove offending parameter + mw.non_fit_kwargs.pop("f") + mw.finalize_params() + + +def test_ModelWrapper_update_params(spreadsheets): + + # method calls three other functions that are tested extensively elsewhere. + # make sure they run, but do not test extensively. + + # read from spreadsheet + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + assert mw.param_df.loc["K1","guess"] == 1 + assert mw.param_df.loc["K2","guess"] == 2 + assert mw.param_df.loc["K3","guess"] == 3 + + xlsx = spreadsheets["basic-spreadsheet.xlsx"] + mw.update_params(xlsx) + assert np.isclose(mw.param_df.loc["K1","guess"],1.00E+07) + assert np.isclose(mw.param_df.loc["K2","guess"],1.00E-06) + assert np.isclose(mw.param_df.loc["K3","guess"],1.00E+00) + + # read from df + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + assert mw.param_df.loc["K1","guess"] == 1 + assert mw.param_df.loc["K2","guess"] == 2 + assert mw.param_df.loc["K3","guess"] == 3 + + input_df = pd.read_excel(xlsx) + mw.update_params(input_df) + assert np.isclose(mw.param_df.loc["K1","guess"],1.00E+07) + assert np.isclose(mw.param_df.loc["K2","guess"],1.00E-06) + assert np.isclose(mw.param_df.loc["K3","guess"],1.00E+00) + + # read from dict + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + assert mw.param_df.loc["K1","guess"] == 1 + assert mw.param_df.loc["K2","guess"] == 2 + assert mw.param_df.loc["K3","guess"] == 3 + + input_dict = {"K1":{"guess":20}} + mw.update_params(input_dict) + assert mw.param_df.loc["K1","guess"] == 20 + assert mw.param_df.loc["K2","guess"] == 2 + assert mw.param_df.loc["K3","guess"] == 3 + + # bad input + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + assert mw.param_df.loc["K1","guess"] == 1 + assert mw.param_df.loc["K2","guess"] == 2 + assert mw.param_df.loc["K3","guess"] == 3 + + input_dict = {"K1":20} + with pytest.raises(ValueError): + mw.update_params(input_dict) + + # bad input + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + input_dict = {"K4":20} + with pytest.raises(ValueError): + mw.update_params(input_dict) + + # inconsistent input + def model_to_test_wrap(K1=1,K2=2,K3=3,d="test",e=3): return K1*K2*K3 + mw = ModelWrapper(model_to_test_wrap) + input_dict = {"K1":{"guess":5, + "lower_bound":20}} + with pytest.raises(ValueError): + mw.update_params(input_dict) + +def test_ModelWrapper_model(): + + # Simple model + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + + # internal parameters + assert mw.model() == 1*2*3 + + # bad parameters -- wrong length + with pytest.raises(ValueError): + mw.model([1,2]) + + with pytest.raises(ValueError): + mw.model([1,2,3,4]) + + # check valid pass of parameter + assert mw.model([3,4,5]) == 3*4*5 + + # fix parameter + mw.param_df.loc["b","fixed"] = True + mw.finalize_params() + assert mw.model([3,4]) == 3*2*4 #(a*fixed(b)*c) + + # This should work, ignoring the fixed 'b' parameter + mw.model([3,4,5]) == 3*2*5 + mw.model([3,17,5]) == 3*2*5 + mw.model([3,17,8]) == 3*2*8 + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): raise ValueError + mw = ModelWrapper(model_to_test_wrap) + with pytest.raises(RuntimeError): + mw.model() + +def test_ModelWrapper_fast_model(): + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + + # Make sure it is callable and takes arguments + assert mw.fast_model([10,20,30]) == 10*20*30 + + # Make sure it calls finalize. + # Run model and fast_model + assert mw.fast_model([1,2,3]) == 1*2*3 + assert mw.model([1,2,3]) == 1*2*3 + + # fix and change "a" + mw.param_df.loc["a","fixed"] = True + mw.param_df.loc["a","guess"] = 10 + + # fast_model is not aware of this + assert mw.fast_model([1,2,3]) == 1*2*3 + + mw.finalize_params() + + # but now fast_model is because we finalized parameters + assert mw.fast_model([2,3]) == 10*2*3 + + +def test_ModelWrapper_param_df(): + + # test setter/getter + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + + assert mw._param_df is mw.param_df + assert np.array_equal(mw.param_df["name"],["a","b","c"]) + + to_change = mw.param_df.copy() + to_change["guess"] = [10,20,30] + mw.param_df = to_change + assert np.array_equal(mw.param_df["guess"],[10,20,30]) + assert mw.param_df is not to_change + + # should fail vaildation because parameter name changed + to_change["name"] = ["x","b","c"] + with pytest.raises(ValueError): + mw.param_df = to_change + + # Make sure it didn't change anything on failure + assert np.array_equal(mw.param_df["name"],["a","b","c"]) + assert np.array_equal(mw.param_df["guess"],[10,20,30]) + +def test_ModelWrapper_non_fit_kwargs(): + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + assert mw._non_fit_kwargs is mw.non_fit_kwargs + assert mw.non_fit_kwargs["d"] == "test" + assert mw.non_fit_kwargs["e"] == 3 + +def test_ModelWrapper_unfixed_mask(): + + def model_to_test_wrap(a=1,b=2,c=3,d="test",e=3): return a*b*c + mw = ModelWrapper(model_to_test_wrap) + assert np.array_equal(mw.unfixed_mask,[True,True,True]) + + # set to fixed -- should not update until finalized + mw.param_df.loc["a","fixed"] = True + assert np.array_equal(mw.unfixed_mask,[True,True,True]) + mw.finalize_params() + assert np.array_equal(mw.unfixed_mask,[False,True,True]) + + +def test_ModelWrapper___repr__(): + + def model_to_test_wrap(a=1,b=1,c="test",d=3): return a*b + + mw = ModelWrapper(model_to_fit=model_to_test_wrap) + + out = mw.__repr__().split("\n") + assert len(out) == 21 + + assert out[0] == "ModelWrapper" + assert out[1] == "------------" + + # This will force truncated variable lines to run by making super huge + # c fixed argument + mw.non_fit_kwargs["c"] = pd.DataFrame({"out":np.arange(1000)}) + out = mw.__repr__().split("\n") + assert len(out) == 27 + + + diff --git a/tests/dataprob/model_wrapper/test_vector_model_wrapper.py b/tests/dataprob/model_wrapper/test_vector_model_wrapper.py new file mode 100644 index 0000000..b41d4cd --- /dev/null +++ b/tests/dataprob/model_wrapper/test_vector_model_wrapper.py @@ -0,0 +1,303 @@ +import pytest + +from dataprob.model_wrapper.vector_model_wrapper import VectorModelWrapper + +import numpy as np +import pandas as pd + +def test_VectorModelWrapper__init__(): + + # Check basic wrapping + def test_fcn(some_array,a,b="test"): return some_array[0] + some_array[1] + some_array[2] + + mw = VectorModelWrapper(model_to_fit=test_fcn, + fit_parameters={"x":1,"y":2,"z":3}) + + assert len(mw.param_df) == 3 + assert mw.param_df.loc["x","guess"] == 1 + assert mw.param_df.loc["y","guess"] == 2 + assert mw.param_df.loc["z","guess"] == 3 + assert mw.non_fit_kwargs["a"] is None + assert mw.non_fit_kwargs["b"] == "test" + assert mw.model() == 6 + +def test_VectorModelWrapper__load_model(): + + # Create a ModelWrapper that has just been initialized but has not + # run load_model + class TestVectorModelWrapper(VectorModelWrapper): + def __init__(self): + self._default_guess = 0.0 + self._param_df = pd.DataFrame({"name":[]}) + self._non_fit_kwargs = {} + + + mw = TestVectorModelWrapper() + + # No args + def test_fcn(): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"x":1,"y":2,"z":3}, + non_fit_kwargs=None) + + # no fit_parameters + def test_fcn(x): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={}, + non_fit_kwargs=None) + + # bad fit_parameters + def test_fcn(x): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters=None, + non_fit_kwargs=None) + + # bad fit_parameters --> has same name as first arg + def test_fcn(x): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters=["x"], + non_fit_kwargs=None) + + + # fittable_param dict, bad value + def test_fcn(x): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":"test"}, + non_fit_kwargs=None) + + # fittable_param dict, bad value because it matches secondary + # argument to function + def test_fcn(x,a): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":1.0}, + non_fit_kwargs=None) + + + # fittable_param dict, good value + mw = TestVectorModelWrapper() + def test_fcn(x): pass + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs=None) + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 20 + + # fittable_param list + mw = TestVectorModelWrapper() + def test_fcn(x): pass + mw._load_model(model_to_fit=test_fcn, + fit_parameters=["a","b"], + non_fit_kwargs=None) + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 0 + assert np.array_equal(mw._fit_params_in_order,["a","b"]) + + # fittable_param dict, good value, extra args in function + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6): pass + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs=None) + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 20 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 6 + + # fittable_param dict, good value, extra args in function, with kwargs. + # kwargs ignored because no new non_fit_kwargs + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6,**kwargs): pass + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs=None) + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 20 + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 6 + + # fittable_param dict, good value, extra args in function, with kwargs. + # new non_fit_kwargs in kwarg + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6,**kwargs): pass + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs={"c":16,"d":17}) + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 20 + assert len(mw._non_fit_kwargs) == 3 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 16 + assert mw._non_fit_kwargs["d"] == 17 + + # Should not work if first arg is in non_fit_kwargs + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6,**kwargs): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs={"x":1}) + + # Should not work if fittable and non_fit_kwargs have same args + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6,**kwargs): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters=["a"], + non_fit_kwargs={"a":20}) + + + # Should not work if non_fit_kwargs is not in arg list and no kwargs + mw = TestVectorModelWrapper() + def test_fcn(x,b,c=6): pass + with pytest.raises(ValueError): + mw._load_model(model_to_fit=test_fcn, + fit_parameters={"a":20}, + non_fit_kwargs={"d":"missing"}), + + + +def test_VectorModelWrapper__finalize_params(): + + def model_to_test_wrap(a,b,c=3): return a[0]*a[1]*b*c + mw = VectorModelWrapper(model_to_test_wrap, + fit_parameters={"x":1,"y":2}) + + # Check initial configuration after __init__ + assert np.array_equal(mw._fit_params_in_order,["x","y"]) + assert mw._param_df.loc["x","guess"] == 1 + assert np.array_equal(mw._unfixed_mask,[True,True]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 3 + + # Edit parameters + mw.param_df.loc["x","guess"] = 10 + mw.param_df.loc["x","fixed"] = True + + assert np.array_equal(mw._fit_params_in_order,["x","y"]) + assert mw._param_df.loc["x","guess"] == 10 + assert np.array_equal(mw._unfixed_mask,[True,True]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 3 + + # Run function + mw.finalize_params() + + # Check for expected output + assert np.array_equal(mw._fit_params_in_order,["x","y"]) + assert mw._param_df.loc["x","guess"] == 10 + assert np.array_equal(mw._unfixed_mask,[False,True]) + assert len(mw._non_fit_kwargs) == 2 + assert mw._non_fit_kwargs["b"] is None + assert mw._non_fit_kwargs["c"] == 3 + + # send in bad edit -- finalize should catch it + mw.param_df.loc["a","fixed"] = True + np.array_equal(mw.param_df.index,["x","y","a"]) + with pytest.raises(ValueError): + mw.finalize_params() + +def test_VectorModelWrapper_model(): + + # fittable_param dict, good value + def test_fcn(x,z="test"): return x[0] + x[1] + x[2] + mw = VectorModelWrapper(model_to_fit=test_fcn, + fit_parameters={"a":20,"b":30,"c":50}) + + # Check initial sets + assert mw._model_to_fit is test_fcn + assert mw.param_df.loc["a","guess"] == 20 + assert mw.param_df.loc["b","guess"] == 30 + assert mw.param_df.loc["c","guess"] == 50 + assert mw.non_fit_kwargs["z"] == "test" + + # not enough + with pytest.raises(ValueError): + mw.model(params=[1]) + + # too many parameters + with pytest.raises(ValueError): + mw.model(params=[1,2,3,4,5,6,7]) + + # something that is not even an array of numbers + with pytest.raises(ValueError): + result = mw.model(params="stupid") + + print("XNAY",mw.param_df) + + # basic check. Does it run with parameters sent in? + result = mw.model([1,2,3]) + assert result == 6 + + print("HERE",mw.param_df) + + # basic check. no parameters sent in -- pulled from the parameter guessess + result = mw.model(params=None) + assert result == 20 + 30 + 50 + + # fix a parameter. should still work + mw.param_df.loc["a","fixed"] = True + result = mw.model(params=None) + assert result == 20 + 30 + 50 + + # Guesses override what we sent in + mw.param_df.loc["a","fixed"] = True + mw.param_df.loc["b","fixed"] = True + result = mw.model(params=[1,2,3]) + assert result == 20 + 30 + 3 + + # Should give fixed values for a and b plus what we sent in for c + result = mw.model(params=[1000]) + assert result == 20 + 30 + 1000 + + # change "a" + mw.param_df.loc["a","guess"] = 10 + + # make sure it recognizes fix and guess + assert mw.model([1000]) == 10 + 30 + 1000 + assert mw.model([1,2,1000]) == 10 + 30 + 1000 + + # Test error catching from model + def test_fcn(x,z="test"): raise TypeError + mw = VectorModelWrapper(model_to_fit=test_fcn, + fit_parameters={"a":20,"b":30,"c":50}) + with pytest.raises(RuntimeError): + mw.model() + + +def test_VectorModelWrapper_fast_model(): + + # fittable_param dict, good value + def test_fcn(x,z="test"): return x[0] + x[1] + x[2] + mw = VectorModelWrapper(model_to_fit=test_fcn, + fit_parameters={"a":20,"b":30,"c":50}) + + # Make sure it is callable and takes arguments + assert mw.fast_model([10,20,30]) == 10 + 20 + 30 + + # Make sure it calls finalize. + # Run model and _mw_observable + assert mw.model([1,2,3]) == 1 + 2 + 3 + assert mw.fast_model(np.array([1,2,3])) == 1 + 2 + 3 + + # fix and change "a" + mw.param_df.loc["a","fixed"] = True + mw.param_df.loc["a","guess"] = 10 + + # fast_model is not aware of this + assert mw.fast_model(np.array([1,2,3])) == 1 + 2 + 3 + + mw.finalize_params() + + # and now fast_model should be too if finalized + assert mw.fast_model(np.array([2,3])) == 10 + 2 + 3 diff --git a/tests/dataprob/model_wrapper/test_wrap_function.py b/tests/dataprob/model_wrapper/test_wrap_function.py new file mode 100644 index 0000000..22bdb04 --- /dev/null +++ b/tests/dataprob/model_wrapper/test_wrap_function.py @@ -0,0 +1,310 @@ + +import pytest + +from dataprob.model_wrapper.wrap_function import wrap_function +from dataprob.model_wrapper.model_wrapper import ModelWrapper +from dataprob.model_wrapper.vector_model_wrapper import VectorModelWrapper + +import numpy as np +import pandas as pd + +import os + +def test_wrap_function(tmpdir): + + cwd = os.getcwd() + os.chdir(tmpdir) + + # -------------------------------------------------------------- + # vector_first_arg is False + + def model_to_test_wrap(a,b=2,c=3,d="test",e=3): return a*b*c + + # basic test + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs=None, + vector_first_arg=False) + + assert len(mw.param_df) == 3 + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 2 + assert mw.param_df.loc["c","guess"] == 3 + + assert issubclass(type(mw),ModelWrapper) + + # send in list of fit parameters + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs=None, + vector_first_arg=False) + + assert len(mw.param_df) == 2 + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 2 + + assert issubclass(type(mw),ModelWrapper) + + # send in dict of fit parameters + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters={"a":{"guess":20}}, + non_fit_kwargs=None, + vector_first_arg=False) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),ModelWrapper) + + # send in dataframe of fit parameters + df = pd.DataFrame({"name":["a"], + "guess":[20]}) + + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=df, + non_fit_kwargs=None, + vector_first_arg=False) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),ModelWrapper) + + # send in dataframe without name column + df = pd.DataFrame({"not_name":["a"], + "guess":[20]}) + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=df, + non_fit_kwargs=None, + vector_first_arg=False) + + + # send in spreadsheet file of fit parameters + df = pd.DataFrame({"name":["a"], + "guess":[20]}) + df.to_csv("dataframe.csv") + + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters="dataframe.csv", + non_fit_kwargs=None, + vector_first_arg=False) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),ModelWrapper) + + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=1, + non_fit_kwargs=None, + vector_first_arg=False) + + # send in non-default non_fit_kwargs + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs={"c":20}, + vector_first_arg=False) + + assert len(mw.param_df) == 2 + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 2 + assert len(mw._non_fit_kwargs) == 3 + assert mw._non_fit_kwargs["c"] == 20 + assert mw._non_fit_kwargs["d"] == "test" + assert mw._non_fit_kwargs["e"] == 3 + + # send in lots of non-default non_fit_kwargs + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs={"b":30,"c":20,"d":{"x":10},"e":str}, + vector_first_arg=False) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 0 + assert len(mw._non_fit_kwargs) == 4 + assert mw._non_fit_kwargs["b"] == 30 + assert mw._non_fit_kwargs["c"] == 20 + assert mw._non_fit_kwargs["d"]["x"] == 10 + assert mw._non_fit_kwargs["e"] is str + + # kwargs! + def fcn_with_kwargs(a,b,**kwargs): pass + + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs={"b":np.nan,"c":20,"d":{"x":10},"e":str}, + vector_first_arg=False) + assert len(mw.param_df) == 3 + assert mw.param_df.loc["x","guess"] == 0 + assert mw.param_df.loc["y","guess"] == 0 + assert mw.param_df.loc["z","guess"] == 0 + + assert len(mw._non_fit_kwargs) == 5 + assert mw._non_fit_kwargs["a"] is None + assert np.isnan(mw._non_fit_kwargs["b"]) + assert mw._non_fit_kwargs["c"] == 20 + assert mw._non_fit_kwargs["d"]["x"] == 10 + assert mw._non_fit_kwargs["e"] is str + + # send in some bad non_fit_kwargs + with pytest.raises(ValueError): + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs="not_a_dict", + vector_first_arg=False) + + # send in some bad non_fit_kwargs + with pytest.raises(ValueError): + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs=["a","b","c"], + vector_first_arg=False) + + + # -------------------------------------------------------------- + # vector_first_arg is True + + def model_to_test_wrap(some_vector,q=3): return np.sum(some_vector) + + # basic test. will die because VectorModelWrapper requires non-None + # fit_parameters + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=None, + non_fit_kwargs=None, + vector_first_arg=True) + + # send in list of fit parameters + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs=None, + vector_first_arg=True) + + assert len(mw.param_df) == 2 + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 0 + + assert issubclass(type(mw),VectorModelWrapper) + + # send in dict of fit parameters + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters={"a":{"guess":20}}, + non_fit_kwargs=None, + vector_first_arg=True) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),VectorModelWrapper) + + # send in dataframe of fit parameters + df = pd.DataFrame({"name":["a"], + "guess":[20]}) + + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=df, + non_fit_kwargs=None, + vector_first_arg=True) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),VectorModelWrapper) + + # send in dataframe without name column + df = pd.DataFrame({"not_name":["a"], + "guess":[20]}) + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=df, + non_fit_kwargs=None, + vector_first_arg=True) + + + # send in spreadsheet file of fit parameters + df = pd.DataFrame({"name":["a"], + "guess":[20]}) + df.to_csv("dataframe.csv") + + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters="dataframe.csv", + non_fit_kwargs=None, + vector_first_arg=True) + + assert len(mw.param_df) == 1 + assert mw.param_df.loc["a","guess"] == 20 + + assert issubclass(type(mw),VectorModelWrapper) + + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=1, + non_fit_kwargs=None, + vector_first_arg=True) + + + + # send in non-default non_fit_kwargs + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=["a","b"], + non_fit_kwargs={"q":20}, + vector_first_arg=True) + + assert len(mw.param_df) == 2 + assert mw.param_df.loc["a","guess"] == 0 + assert mw.param_df.loc["b","guess"] == 0 + assert len(mw._non_fit_kwargs) == 1 + assert mw._non_fit_kwargs["q"] == 20 + + + + # kwargs! + def fcn_with_kwargs(a,b,**kwargs): pass + + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs={"b":np.nan,"c":20,"d":{"x":10},"e":str}, + vector_first_arg=True) + + assert len(mw.param_df) == 3 + assert mw.param_df.loc["x","guess"] == 0 + assert mw.param_df.loc["y","guess"] == 0 + assert mw.param_df.loc["z","guess"] == 0 + + assert len(mw._non_fit_kwargs) == 4 + assert np.isnan(mw._non_fit_kwargs["b"]) + assert mw._non_fit_kwargs["c"] == 20 + assert mw._non_fit_kwargs["d"]["x"] == 10 + assert mw._non_fit_kwargs["e"] is str + + # send in some bad non_fit_kwargs + with pytest.raises(ValueError): + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs="not_a_dict", + vector_first_arg=True) + + # send in some bad non_fit_kwargs + with pytest.raises(ValueError): + mw = wrap_function(some_function=fcn_with_kwargs, + fit_parameters=["x","y","z"], + non_fit_kwargs=["a","b","c"], + vector_first_arg=True) + + + # -------------------------------------------------------------- + # vector_first_arg is stupid + + def model_to_test_wrap(some_vector,q=3): return np.sum(some_vector) + + # basic test. will die because VectorModelWrapper requires non-None + # fit_parameters + with pytest.raises(ValueError): + mw = wrap_function(some_function=model_to_test_wrap, + fit_parameters=["a"], + non_fit_kwargs=None, + vector_first_arg="stupid") + + os.chdir(cwd) \ No newline at end of file diff --git a/tests/dataprob/plot/test__plot_utils.py b/tests/dataprob/plot/test__plot_utils.py new file mode 100644 index 0000000..d0e09d5 --- /dev/null +++ b/tests/dataprob/plot/test__plot_utils.py @@ -0,0 +1,215 @@ + +import pytest + +from dataprob.fitters.ml import MLFitter + +from dataprob.plot._plot_utils import get_plot_features +from dataprob.plot._plot_utils import get_style +from dataprob.plot._plot_utils import get_vectors +from dataprob.plot._plot_utils import _get_edges +from dataprob.plot._plot_utils import get_plot_dimensions +from dataprob.plot._plot_utils import sync_axes + +import numpy as np +from matplotlib import pyplot as plt + +def test_get_plot_features(): + + def test_fcn(m,b): m*np.arange(10) + b + f = MLFitter(some_function=test_fcn) + + f._success = False + f._samples = np.ones((200,3),dtype=float) + + with pytest.raises(RuntimeError): + get_plot_features(f, + x_label=None, + y_label=None, + num_samples=1) + f._success = True + x_label, y_label, num_samples = get_plot_features(f, + x_label=None, + y_label=None, + num_samples=1) + assert x_label is None + assert y_label is None + assert num_samples == 1 + + x_label, y_label, num_samples = get_plot_features(f, + x_label=1, + y_label="test", + num_samples=100) + assert x_label == "1" + assert y_label == "test" + assert num_samples == 100 + + # bad num_samples value + with pytest.raises(ValueError): + get_plot_features(f, + x_label=1, + y_label="test", + num_samples=-5) + + # samples are None + f._samples = None + with pytest.raises(ValueError): + get_plot_features(f, + x_label=1, + y_label="test", + num_samples=10) + + # too many samples + f._samples = np.ones((9,3),dtype=float) + with pytest.raises(ValueError): + get_plot_features(f, + x_label=1, + y_label="test", + num_samples=10) + + # should work now -- have enough samples + get_plot_features(f, + x_label=1, + y_label="test", + num_samples=8) + + +def test_get_style(): + + # Get default styles from plot.appearance + from dataprob.plot.appearance import default_styles + + # Go through every default style + for s in default_styles: + + # Make sure it's copied in properly and that a user_style of None does + # not alter it + out = get_style(user_style=None, + style_name=s) + assert default_styles is not out + assert len(default_styles[s]) == len(out) + for k in default_styles[s]: + assert default_styles[s][k] == out[k] + + # Now make sure a correct pass updates a single field and leaves others + # intact + out = get_style(user_style={"some_cool_style":10}, + style_name=s) + assert len(default_styles[s]) + 1 == len(out) + for k in default_styles[s]: + assert default_styles[s][k] == out[k] + assert out["some_cool_style"] == 10 + + # bad user_style + with pytest.raises(ValueError): + get_style(user_style="not_a_dict",style_name=s) + + # bad style_name + with pytest.raises(ValueError): + get_style(user_style=None,style_name="not_a_style") + + +def test_get_vectors(): + + def test_fcn(m,b): return m*np.arange(10) + b + f = MLFitter(some_function=test_fcn) + y_obs_in = 2*np.arange(10) + 5 + y_std_in = 0.1*np.ones(10) + f.fit(y_obs=y_obs_in, + y_std=y_std_in) + + x_axis, y_obs, y_std, y_calc = get_vectors(f=f, + x_axis=None) + assert np.array_equal(x_axis,np.arange(10)) + assert np.array_equal(y_obs,y_obs_in) + assert np.array_equal(y_std,y_std_in) + assert y_calc.shape == y_obs.shape + + # send in bad x_axis + with pytest.raises(ValueError): + get_vectors(f,x_axis=np.arange(11)) + + # send in custom x_axis + x_axis_in = np.arange(10,20,1) + x_axis, y_obs, y_std, y_calc = get_vectors(f=f, + x_axis=x_axis_in) + assert np.array_equal(x_axis,x_axis_in) + assert np.array_equal(y_obs,y_obs_in) + assert np.array_equal(y_std,y_std_in) + assert y_calc.shape == y_obs.shape + +def test__get_edges(): + + left, right = _get_edges([-3,-1],scalar=0.1) + assert np.isclose(left,-3.2) + assert np.isclose(right,-0.8) + + left, right = _get_edges([-3,0],scalar=0.1) + assert np.isclose(left,-3.3) + assert np.isclose(right,0.3) + + left, right = _get_edges([-1,1],scalar=0.1) + assert np.isclose(left,-1.2) + assert np.isclose(right,1.2) + + left, right = _get_edges([0,1],scalar=0.1) + assert np.isclose(left,-0.1) + assert np.isclose(right,1.1) + + left, right = _get_edges([1,3],scalar=0.1) + assert np.isclose(left,0.8) + assert np.isclose(right,3.2) + + with pytest.raises(ValueError): + _get_edges([1,1],scalar=0.1) + +def test_get_plot_dimensions(): + + # main point of test is making sure values are passed in correct order + x_values = np.arange(-10,11) + y_values = np.arange(-5,6) + + left, right, bottom, top = get_plot_dimensions(x_values=x_values, + y_values=y_values, + scalar=0.1) + assert left == -12 + assert right == 12 + assert bottom == -6 + assert top == 6 + + left, right, bottom, top = get_plot_dimensions(x_values=x_values, + y_values=y_values, + scalar=0.2) + assert left == -14 + assert right == 14 + assert bottom == -7 + assert top == 7 + +def test_sync_axes(): + + _, ax1 = plt.subplots(1,figsize=(6,6)) + _, ax2 = plt.subplots(1,figsize=(6,6)) + + ax1.set_xlim((-1,1)) + ax1.set_ylim((-1,1)) + ax2.set_xlim((0,2)) + ax2.set_ylim((0,2)) + + sync_axes(ax1,ax2,'x') + assert ax1.get_xlim() == (-1,2) + assert ax2.get_xlim() == (-1,2) + assert ax1.get_ylim() == (-1,1) + assert ax2.get_ylim() == (0,2) + + ax1.set_xlim((-1,1)) + ax1.set_ylim((-1,1)) + ax2.set_xlim((0,2)) + ax2.set_ylim((0,2)) + + sync_axes(ax1,ax2,'y') + assert ax1.get_xlim() == (-1,1) + assert ax2.get_xlim() == (0,2) + assert ax1.get_ylim() == (-1,2) + assert ax2.get_ylim() == (-1,2) + + + \ No newline at end of file diff --git a/tests/dataprob/plot/test_appearance.py b/tests/dataprob/plot/test_appearance.py new file mode 100644 index 0000000..d109224 --- /dev/null +++ b/tests/dataprob/plot/test_appearance.py @@ -0,0 +1,10 @@ + +from dataprob.plot.appearance import default_styles + +def test_default_styles(): + + # silly test. code ran and dictionary validated at this level on import + # anyway. + for a in default_styles: + for b in default_styles[a]: + default_styles[a][b] \ No newline at end of file diff --git a/tests/dataprob/plot/test_corner.py b/tests/dataprob/plot/test_corner.py new file mode 100644 index 0000000..de6cfe2 --- /dev/null +++ b/tests/dataprob/plot/test_corner.py @@ -0,0 +1,87 @@ + +import pytest + +from dataprob.fitters.ml import MLFitter +from dataprob.plot.plot_corner import plot_corner + +import numpy as np +import pandas as pd +import matplotlib + + +def test_plot_corner(): + + # tests run the whole decision tree of the function to identify major + # errors, but I'm not checking output here because it's graphical. + + # some test data + y_obs = np.arange(10) + y_std = np.ones(10) + def test_fcn(a=1,b=2): return a*b*np.ones(10) + fake_samples = np.random.normal(loc=0,scale=1,size=(1000,2)) + + # Create a fitter that has apparently been run and has some samples + f = MLFitter(some_function=test_fcn) + f._y_obs = y_obs + f._y_std = y_std + f._fit_df = pd.DataFrame({"name":["a","b"],"estimate":[10,20]}) + f._success = False + f._samples = fake_samples + + # no success + with pytest.raises(RuntimeError): + plot_corner(f=f) + + # set success is True, should now run + f._success = True + fig = plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # Send in filter parameter possibilities. It should gracefully handle all + # of these cases. + fig = plot_corner(f,filter_params=None) + assert issubclass(type(fig),matplotlib.figure.Figure) + + fig = plot_corner(f,filter_params="blah") + assert issubclass(type(fig),matplotlib.figure.Figure) + + fig = plot_corner(f,filter_params=["blah"]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + fig = plot_corner(f,filter_params=[1]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # filter all parameters + with pytest.raises(ValueError): + fig = plot_corner(f,filter_params=["a","b"]) + + # filter one + fig = plot_corner(f,filter_params=["a"]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # filter other + fig = plot_corner(f,filter_params=["b"]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # Get rid of samples attribute. Should now fail + f._samples = None + with pytest.raises(RuntimeError): + fig = plot_corner(f,) + + # put samples back in + f._samples = fake_samples + fig = plot_corner(f,filter_params=None) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # pass in labels + fig = plot_corner(f,filter_params=None,labels=["x","y"]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # pass in range + fig = plot_corner(f,filter_params=None,range=[(-10,10),(-100,100)]) + assert issubclass(type(fig),matplotlib.figure.Figure) + + # pass in truths + fig = plot_corner(f,filter_params=None,truths=[1,2]) + assert issubclass(type(fig),matplotlib.figure.Figure) + diff --git a/tests/dataprob/plot/test_plot_fit.py b/tests/dataprob/plot/test_plot_fit.py new file mode 100644 index 0000000..1d5f545 --- /dev/null +++ b/tests/dataprob/plot/test_plot_fit.py @@ -0,0 +1,58 @@ + +import pytest + +from dataprob.fitters.ml import MLFitter + +from dataprob.plot.plot_fit import plot_fit + +import numpy as np +import matplotlib +from matplotlib import pyplot as plt + +def test_plot_fit(): + + # covers whole decision tree, but not an amazing tests of outputs. + # graphical. + + def test_fcn(m,b): return m*np.arange(10) + b + y_obs = test_fcn(m=5,b=1) + y_std = np.ones(10)*0.1 + + f = MLFitter(some_function=test_fcn) + + # run on on-fit fitter + with pytest.raises(RuntimeError): + plot_fit(f) + + f = MLFitter(some_function=test_fcn) + f.fit(y_obs=y_obs, + y_std=y_std) + + fig, ax = plot_fit(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_fit(f=f, + num_samples=-1) + + fig, ax = plot_fit(f,num_samples=0) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_fit(f,num_samples=10) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plt.subplots(1,figsize=(6,6)) + fig_out, ax_out = plot_fit(f,num_samples=10,ax=ax) + assert fig_out is fig + assert ax_out is ax + plt.close(fig) + + with pytest.raises(ValueError): + plot_fit(f,ax="not_an_ax") + \ No newline at end of file diff --git a/tests/dataprob/plot/test_plot_residuals.py b/tests/dataprob/plot/test_plot_residuals.py new file mode 100644 index 0000000..b4362ff --- /dev/null +++ b/tests/dataprob/plot/test_plot_residuals.py @@ -0,0 +1,123 @@ + +import pytest + +from dataprob.fitters.ml import MLFitter + +from dataprob.plot.plot_residuals import plot_residuals + +import numpy as np +import matplotlib +from matplotlib import pyplot as plt + +def test_plot_residuals(): + + # covers whole decision tree, but not an amazing tests of outputs. + # graphical. + + def test_fcn(m,b): return m*np.arange(10) + b + y_obs = test_fcn(m=5,b=1) + y_std = np.ones(10)*0.1 + + f = MLFitter(some_function=test_fcn) + + # run on no-fit fitter + with pytest.raises(RuntimeError): + plot_residuals(f) + + f = MLFitter(some_function=test_fcn) + f.fit(y_obs=y_obs, + y_std=y_std) + + fig, ax = plot_residuals(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals(f,plot_unweighted="not_a_bool") + + fig, ax = plot_residuals(f,plot_unweighted=True) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals(f,plot_y_residuals="not_a_bool") + + fig, ax = plot_residuals(f, + plot_unweighted=True, + plot_y_residuals=True, + num_samples=10) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=True, + plot_y_residuals=True, + num_samples=0) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=True, + plot_y_residuals=False, + num_samples=10) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=True, + plot_y_residuals=False, + num_samples=0) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=False, + plot_y_residuals=True, + num_samples=10) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=False, + plot_y_residuals=True, + num_samples=0) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=False, + plot_y_residuals=False, + num_samples=10) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals(f, + plot_unweighted=False, + plot_y_residuals=False, + num_samples=0) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plt.subplots(1,figsize=(6,6)) + fig_out, ax_out = plot_residuals(f,ax=ax) + assert fig_out is fig + assert ax_out is ax + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals(f,ax="not_an_ax") + + + + + \ No newline at end of file diff --git a/tests/dataprob/plot/test_plot_residuals_hist.py b/tests/dataprob/plot/test_plot_residuals_hist.py new file mode 100644 index 0000000..f3e7ce8 --- /dev/null +++ b/tests/dataprob/plot/test_plot_residuals_hist.py @@ -0,0 +1,93 @@ + +import pytest + +from dataprob.fitters.ml import MLFitter + +from dataprob.plot.plot_residuals_hist import plot_residuals_hist + +import numpy as np +import matplotlib +from matplotlib import pyplot as plt + +def test_plot_residuals_hist(): + + # covers whole decision tree, but not an amazing tests of outputs. + # graphical. + + def test_fcn(m,b): return m*np.arange(100) + b + y_obs = test_fcn(m=5,b=1) + y_std = np.ones(100)*0.1 + + f = MLFitter(some_function=test_fcn) + + # run on no-fit fitter + with pytest.raises(RuntimeError): + plot_residuals_hist(f) + + f = MLFitter(some_function=test_fcn) + f.fit(y_obs=y_obs, + y_std=y_std) + + fig, ax = plot_residuals_hist(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + + fig, ax = plot_residuals_hist(f,plot_unweighted=True) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals_hist(f,plot_unweighted="not_a_bool") + + fig, ax = plot_residuals_hist(f,x_label=None,y_label=None) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + # This will raise am attribute error if this is actually eventually passing + # to matplotlib.pyplot.fill because it's not a real style. nice (but implicit) + # test + with pytest.raises(AttributeError): + fig, ax = plot_residuals_hist(f,hist_bar_style={"not_real_style":10}) + + # But this should now work + fig, ax = plot_residuals_hist(f,hist_bar_style={"edgecolor":"pink"}) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals_hist(f,hist_bar_style="not_a_dict") + + fig, ax = plt.subplots(1,figsize=(6,6)) + fig_out, ax_out = plot_residuals_hist(f,ax=ax) + assert fig_out is fig + assert ax_out is ax + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals_hist(f,ax="not_an_ax") + + fig, ax = plot_residuals_hist(f,plot_unweighted=False) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + fig, ax = plot_residuals_hist(f,plot_unweighted=True) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + # amke sure we can send in hist bins + fig, ax = plot_residuals_hist(f,hist_bins=20) + assert issubclass(type(fig),matplotlib.figure.Figure) + assert issubclass(type(ax),matplotlib.axes.Axes) + plt.close(fig) + + with pytest.raises(ValueError): + plot_residuals_hist(f,hist_bins="stupid_bins") + + diff --git a/tests/dataprob/plot/test_plot_summary.py b/tests/dataprob/plot/test_plot_summary.py new file mode 100644 index 0000000..2fd64a3 --- /dev/null +++ b/tests/dataprob/plot/test_plot_summary.py @@ -0,0 +1,28 @@ +import pytest + +from dataprob.plot.plot_summary import plot_summary +from dataprob.fitters.ml import MLFitter + +import numpy as np +import matplotlib + +def test_plot_summary(): + + # There is only one logic flow in this function. The biggest thing to test + # is whether all of the arguments are being passed correctly (without + # say, flipping a y_calc and a y_obs). The problem is that the outputs are + # graphical and difficult to test directly. Leaving this under-tested for + # now and will rely on graphical noodling to make sure things look right, + # I guess... + + # Generate results with fit + def test_fcn(m,b): return m*np.arange(10) + b + y_obs = test_fcn(m=5,b=1) + y_std = np.ones(10)*0.1 + f = MLFitter(some_function=test_fcn) + f.fit(y_obs=y_obs, + y_std=y_std) + + # generate summary plot + fig = plot_summary(f=f) + assert issubclass(type(fig),matplotlib.figure.Figure) diff --git a/tests/dataprob/test_fit_param.py b/tests/dataprob/test_fit_param.py deleted file mode 100644 index 1b53a02..0000000 --- a/tests/dataprob/test_fit_param.py +++ /dev/null @@ -1,493 +0,0 @@ -import pytest - -from dataprob.fit_param import _guess_setter_from_bounds -from dataprob.fit_param import FitParameter - -import numpy as np - -def test__guess_setter_from_bounds(): - - from dataprob.fit_param import _INFINITY_PROXY - - guess = _guess_setter_from_bounds([-np.inf,np.inf]) - expected_guess = 0.0 - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([1,np.inf]) - expected_guess = np.exp((np.log(1) + np.log(_INFINITY_PROXY))/2) - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([-np.inf,-1]) - expected_guess = -np.exp((np.log(1) + np.log(_INFINITY_PROXY))/2) - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([-1,np.inf]) - expected_guess = (-1 + _INFINITY_PROXY)/2 - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([-np.inf,1]) - expected_guess = (-_INFINITY_PROXY + 1)/2 - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([0,1]) - expected_guess = 0.5 - assert np.isclose(guess,expected_guess) - - guess = _guess_setter_from_bounds([-1,0]) - expected_guess = -0.5 - assert np.isclose(guess,expected_guess) - -def test_init(): - - with pytest.raises(TypeError): - p = FitParameter() - - p = FitParameter(name="test") - - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert p.guess == 0.0 - assert p.value == p.guess - assert p.fixed == False - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - - -def test_name_getter_setter(): - - # Default (must be set via __init__) - p = FitParameter(name="test") - assert p.name == "test" - - # Set directly - p.name = 5 - assert p.name == "5" - - # Set directly - p.name = "junk" - assert p.name == "junk" - - -def test_guess_getter_setter(): - - # Default - p = FitParameter(name="test") - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert p.guess == 0.0 - - # Set via __init__ - p = FitParameter(name="test",guess=12) - assert p.guess == 12 - - # Set directly - p = FitParameter(name="test") - p.guess = 22 - assert p.guess == 22 - - # --- bad value checks --- - p = FitParameter(name="test") - - with pytest.raises(ValueError): - p.guess = "test" - - with pytest.raises(ValueError): - p.guess = [1.0] - - with pytest.raises(ValueError): - p.guess = np.arange(10) - - # Set by prior - p = FitParameter(name="test",prior=[10,1]) - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert p.guess == 10.0 - - # Set by bounds (geometric mean) - p = FitParameter(name="test",bounds=[1,3]) - assert np.array_equal(p.bounds,np.array((1,3))) - predicted_guess = np.exp((np.log(1) + np.log(3))/2) - assert np.isclose(p.guess,predicted_guess) - - # Set by bounds (arithmetic mean) - p = FitParameter(name="test",bounds=[-2,3]) - assert np.array_equal(p.bounds,np.array((-2,3))) - predicted_guess = (-2 + 3)/2 - assert np.isclose(p.guess,predicted_guess) - - # Prior overrides bounds - p = FitParameter(name="test",prior=[10,1],bounds=[0,11]) - assert np.array_equal(p.bounds,np.array((0,11))) - assert p.guess == 10.0 - - # Infinite left bound - INFINITY_PROXY = 1e9 - p = FitParameter(name="test",bounds=[-np.inf,11]) - assert np.array_equal(p.bounds,np.array((-np.inf,11))) - predicted_guess = (-INFINITY_PROXY + 3)/2 - assert np.isclose(p.guess,predicted_guess) - - # Infinite right bound - p = FitParameter(name="test",bounds=[1,np.inf]) - assert np.array_equal(p.bounds,np.array((1,np.inf))) - predicted_guess = np.exp((np.log(1) + np.log(INFINITY_PROXY))/2) - assert np.isclose(p.guess,predicted_guess) - - # --- bound check --- - with pytest.raises(ValueError): - p = FitParameter(name="test") - p.bounds = [-10,10] - p.guess = -20 - - with pytest.raises(ValueError): - p = FitParameter(name="test") - p.bounds = [-10,10] - p.guess = 20 - -def test_fixed_setter_getter(): - - p = FitParameter(name="test") - assert p.fixed is False - p.fixed = True - assert p.fixed is True - p.fixed = False - assert p.fixed is False - - # send in a wacky value to make sure bool check is being run - p = FitParameter(name="test") - with pytest.raises(ValueError): - p.fixed = "not_a_good_bool" - -def test_bounds_getter_setter(): - - # Default - p = FitParameter(name="test") - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - - # Set via __init__ - bounds = [1,2] - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - - # Set directly - bounds = [1,2] - p.bounds = bounds - assert np.array_equal(p.bounds,np.array(bounds)) - - # --- bad value checks --- - with pytest.raises(ValueError): - p.bounds = "test" - - with pytest.raises(ValueError): - p.bounds = "te" - - with pytest.raises(ValueError): - p.bounds = 1.0 - - with pytest.raises(ValueError): - p.bounds = [1.0] - - with pytest.raises(ValueError): - p.bounds = [1.0,1.0] - - with pytest.raises(ValueError): - p.bounds = [1.0,-1.0] - - with pytest.raises(ValueError): - p.bounds = ["a","b"] - - # Identical bounds - p = FitParameter(name="test") - with pytest.raises(ValueError): - p.bounds = np.zeros(2,dtype=float) - - p = FitParameter(name="test") - with pytest.raises(ValueError): - p.bounds = 10*np.ones(2,dtype=float) - - # Numerically close to zero... - input_bounds = np.zeros(2,dtype=float) - resolution = np.finfo(input_bounds.dtype).resolution - - p = FitParameter(name="test") - input_bounds[1] = resolution/10 - with pytest.raises(ValueError): - p.bounds = input_bounds - - # But now far enough away that it is not zero - input_bounds[1] = resolution*10 - p = FitParameter(name="test") - p.bounds = input_bounds - assert np.array_equal(p.bounds,input_bounds) - - # Shift guess down to within bounds - p = FitParameter(name="test",guess=2) - p.bounds = [1,3] - with pytest.raises(ValueError): - p.guess = 10 - - p.guess = 2 - assert np.array_equal(p.bounds,[1,3]) - assert p.guess == 2 - - with pytest.warns(): - p.bounds = [1,1.5] - assert np.allclose(p.bounds,[1,1.5]) - assert np.isclose(p.guess,1.5) - - # shfit guess up to within bounds - p = FitParameter(name="test",guess=2) - p.bounds = [1,3] - with pytest.warns(): - p.bounds = [2.5,3] - assert np.allclose(p.bounds,[2.5,3.0]) - assert np.isclose(p.guess,2.5) - - -def test_prior_setter_getter(): - - # Default - p = FitParameter(name="test") - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - - # Set via __init__ - prior = [1,2] - p = FitParameter(name="test",prior=prior) - assert np.array_equal(p.prior,np.array(prior)) - - # Set directly - prior = [1,2] - p.prior = prior - assert np.array_equal(p.prior,np.array(prior)) - - # --- bad value checks --- - with pytest.raises(ValueError): - p.prior = "test" - - with pytest.raises(ValueError): - p.prior = "te" - - with pytest.raises(ValueError): - p.prior = 1.0 - - with pytest.raises(ValueError): - p.prior = [1.0] - - # can't be negative second number - with pytest.raises(ValueError): - p.bounds = [1.0,-1.0] - - with pytest.raises(ValueError): - p.bounds = ["a","b"] - - # make sure guess gets set from prior if defined - p = FitParameter(name="test") - assert p.guess == 0 - p.prior = [1,2] - assert np.array_equal(p.prior,[1,2]) - p.guess = None - assert p.guess == 1 - - -def test_value_getter(): - p = FitParameter(name="test") - assert p.value == 0.0 # guess - p._value = 10 - assert p.value == 10 - -def test_stdev_getter(): - p = FitParameter(name="test") - assert p.stdev is None - p._stdev = 10 - assert p.stdev == 10 - -def test_stdev_getter(): - p = FitParameter(name="test") - assert p.ninetyfive is None - p._ninetyfive = [1,2] - assert np.array_equal(p.ninetyfive,[1,2]) - -def test_is_fit_result_getter(): - p = FitParameter(name="test") - assert p.is_fit_result is False - p._is_fit_result = True - assert p.is_fit_result is True - - -def test_load_clear_fit_results(fitter_object): - - generic_fit = fitter_object["generic_fit"] - - # --- Make sure we can load fit result into parameter --- - p = FitParameter(name="test") - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - assert not p.is_fit_result - - p.load_fit_result(generic_fit,0) - assert p.value == generic_fit.estimate[0] - assert p.stdev == generic_fit.stdev[0] - assert np.array_equal(p.ninetyfive[0],generic_fit.ninetyfive[0,0]) - assert np.array_equal(p.ninetyfive[1],generic_fit.ninetyfive[1,0]) - assert p.is_fit_result - - # --- Make sure setting guess wipes out fit --- - p.guess = 22 - assert p.guess == 22 - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert not p.is_fit_result - - # --- Make sure setting bounds wipes out fit --- - - p = FitParameter(name="test") - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - assert not p.is_fit_result - - p.load_fit_result(generic_fit,0) - assert p.value == generic_fit.estimate[0] - assert p.stdev == generic_fit.stdev[0] - assert np.array_equal(p.ninetyfive[0],generic_fit.ninetyfive[0,0]) - assert np.array_equal(p.ninetyfive[1],generic_fit.ninetyfive[1,0]) - assert p.is_fit_result - - p.bounds = [-100,100] - assert np.array_equal(p.bounds,np.array((-100,100))) - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert not p.is_fit_result - - # --- Make sure setting prior wipes out fit --- - - p = FitParameter(name="test") - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert np.array_equal(p.prior,[np.nan,np.nan],equal_nan=True) - assert not p.is_fit_result - - p.load_fit_result(generic_fit,0) - assert p.value == generic_fit.estimate[0] - assert p.stdev == generic_fit.stdev[0] - assert np.array_equal(p.ninetyfive[0],generic_fit.ninetyfive[0,0]) - assert np.array_equal(p.ninetyfive[1],generic_fit.ninetyfive[1,0]) - assert p.is_fit_result - - p.prior = [2,1] - assert np.array_equal(p.bounds,np.array((-np.inf,np.inf))) - assert np.array_equal(p.prior,[2,1]) - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert not p.is_fit_result - - # --- Make sure setting fixed wipes out fit --- - - p = FitParameter(name="test") - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert p.fixed == False - assert not p.is_fit_result - - p.load_fit_result(generic_fit,0) - assert p.value == generic_fit.estimate[0] - assert p.stdev == generic_fit.stdev[0] - assert np.array_equal(p.ninetyfive[0],generic_fit.ninetyfive[0,0]) - assert np.array_equal(p.ninetyfive[1],generic_fit.ninetyfive[1,0]) - assert p.is_fit_result - - p.fixed = True - assert p.fixed == True - assert p.value == p.guess - assert p.stdev is None - assert p.ninetyfive is None - assert not p.is_fit_result - - -def test_interaction_bounds_guesses(): - - from dataprob.fit_param import _INFINITY_PROXY - - # --- default guess depends on bounds; try different bounds scenarios --- - - # Two positive bounds - bounds = [10,20] - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - assert np.isclose(p.guess,np.exp(np.mean(np.log(bounds)))) - - # Two negative bounds - bounds = [-20,-10] - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - assert np.isclose(p.guess,-np.exp(np.mean(np.log(np.abs(bounds))))) - - # One negative, one positive - bounds = [-10,10] - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - assert np.isclose(p.guess,np.sum(bounds)/2) - - # negative infinity, positive real - bounds = [-np.inf,10] - internal_bounds = [-_INFINITY_PROXY,bounds[1]] - expected = np.sum(internal_bounds)/2 - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - assert np.isclose(p.guess,expected) - - # negative real, positive infinity - bounds = [-10,np.inf] - p = FitParameter(name="test",bounds=bounds) - internal_bounds = [bounds[0],_INFINITY_PROXY] - expected = np.sum(internal_bounds)/2 - assert np.array_equal(p.bounds,np.array(bounds)) - assert np.isclose(p.guess,expected) - - # negative infinity, positive infinity - bounds = [-np.inf,np.inf] - p = FitParameter(name="test",bounds=bounds) - assert np.array_equal(p.bounds,np.array(bounds)) - assert p.guess == 0.0 - - # --- Update bounds such that guess is outside the new bounds --- - - bounds = [-10,10] - p = FitParameter(name="test",bounds=bounds,guess=-5) - assert np.array_equal(p.bounds,np.array(bounds)) - assert p.guess == -5.0 - - new_bounds = [0,10] - with pytest.warns(UserWarning): - p.bounds = new_bounds - assert np.array_equal(p.bounds,np.array(new_bounds)) - assert p.guess == new_bounds[0] - - bounds = [-10,10] - p = FitParameter(name="test",bounds=bounds,guess=5) - assert np.array_equal(p.bounds,np.array(bounds)) - assert p.guess == 5.0 - - new_bounds = [-10,0] - with pytest.warns(UserWarning): - p.bounds = new_bounds - assert np.array_equal(p.bounds,np.array(new_bounds)) - assert p.guess == new_bounds[1] - - # --- Upddate bounds such that guess remains in the new bounds --- - bounds = [-10,10] - p = FitParameter(name="test",bounds=bounds,guess=5) - assert np.array_equal(p.bounds,np.array(bounds)) - assert p.guess == 5.0 - - new_bounds = [0,10] - p.bounds = new_bounds - assert np.array_equal(p.bounds,np.array(new_bounds)) - assert p.guess == 5.0 diff --git a/tests/dataprob/test_integration.py b/tests/dataprob/test_integration.py deleted file mode 100644 index a48a494..0000000 --- a/tests/dataprob/test_integration.py +++ /dev/null @@ -1,38 +0,0 @@ - -import pytest - -import dataprob - -import numpy as np - - -def test_integrated_ml_fit(binding_curve_test_data,fit_tolerance_fixture): - - df = binding_curve_test_data["df"] - model_to_wrap = binding_curve_test_data["wrappable_model"] - - mw = dataprob.ModelWrapper(model_to_wrap) - assert mw.df is None - mw.df = df - mw.K.bounds = [0,np.inf] - assert np.array_equal(mw.bounds,np.array([[0],[np.inf]])) - - f = dataprob.MLFitter() - f.model = mw - - assert f.bounds is not None - assert f.bounds[0,0] == 0 - assert f.bounds[1,0] == np.inf - - - f.fit(mw,y_obs=df.Y,y_stdev=df.Y_stdev) - assert f.success - - # Make sure fit gave right answer - input_params = np.array(binding_curve_test_data["input_params"]) - assert np.allclose(f.estimate, - input_params, - rtol=fit_tolerance_fixture, - atol=fit_tolerance_fixture*input_params) - - f.fit_df diff --git a/tests/dataprob/test_integration/test_binding.py b/tests/dataprob/test_integration/test_binding.py new file mode 100644 index 0000000..3062188 --- /dev/null +++ b/tests/dataprob/test_integration/test_binding.py @@ -0,0 +1,81 @@ +""" +Fit a one-parameter binding model to plausible data. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def binding_curve(K=1,x=None): + return x/(K + x) + + gen_params = {"K":1e-3} + + err = 0.1 + num_points = 20 + + x = 10**(np.linspace(-8,0,num_points)) + y_obs = binding_curve(x=x,**gen_params) + np.random.normal(0,err,num_points) + y_std = err*2 + + test_fcn = binding_curve + non_fit_kwargs = {"x":x} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") diff --git a/tests/dataprob/test_integration/test_exponential-saturation.py b/tests/dataprob/test_integration/test_exponential-saturation.py new file mode 100644 index 0000000..ef44004 --- /dev/null +++ b/tests/dataprob/test_integration/test_exponential-saturation.py @@ -0,0 +1,89 @@ +""" +Fit a three-parameter saturating exponential model to plausible data. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def exponential_saturation(a,b,k,x): + + return a*(1 - np.exp(-k*(x))) + b + + gen_params = {"a":13, + "b":-2, + "k":0.5} + + err = 0.6 + num_points = 20 + + x = np.linspace(0,10,num_points) + y_obs = exponential_saturation(x=x,**gen_params) + np.random.normal(0,err,num_points) + y_std = 2*err + + test_fcn = exponential_saturation + non_fit_kwargs = {"x":x} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + f.param_df.loc[["a","b","k"],"guess"] = [1,1,1] + + f.param_df.loc["k","lower_bound"] = 1e-12 + f.param_df.loc["k","upper_bound"] = 2 + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_lagged-exponential.py b/tests/dataprob/test_integration/test_lagged-exponential.py new file mode 100644 index 0000000..d64f221 --- /dev/null +++ b/tests/dataprob/test_integration/test_lagged-exponential.py @@ -0,0 +1,83 @@ +""" +Fit a two-parameter model that can describe the pre-saturation growth of +bacterial cultures. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def lagged_exponential(k=0.1,lag=5,t=None): + return np.exp(k*(t + lag)) + + gen_params = {"k":1/20, + "lag":5} + + err = 20 + num_points = 150 + + t = np.linspace(0,120,num_points) + y_obs = lagged_exponential(t=t,**gen_params) + np.random.normal(0,err,num_points) + y_std = 2*err + + test_fcn = lagged_exponential + non_fit_kwargs = {"t":t} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_linear-extrapolation-folding.py b/tests/dataprob/test_integration/test_linear-extrapolation-folding.py new file mode 100644 index 0000000..877efd0 --- /dev/null +++ b/tests/dataprob/test_integration/test_linear-extrapolation-folding.py @@ -0,0 +1,150 @@ +""" +Fit a six parameter linear extrapolation model often used to analyze +protein equilibrium unfolding experiments. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def linear_extrapolation(dG_unfold=5,m_unfold=-2, + b_native=1,m_native=0, + b_denat=0,m_denat=0, + osmolyte=None,T=298.15,R=0.001987): + """ + Linear extrapolation unfolding model. + + Parameters + ---------- + dG_unfold : float, default=5 + unfolding free energy in water + m_unfold : float, default=-2 + effect of osmoloyte on the folding energy + b_native : float, default=1 + intercept of the native baseline + m_native : float, defualt=0 + slope of the native baseline + b_denat : float, default=0 + intercept of the denatured baseline + m_denat : float, defualt=0 + slope of the denatured baseline + osmolyte : numpy.ndarray + array of osmolyte concentrations + T : float, default=298.15 + temperature of experiment in K + R : float, default=0.001987 + gas constant (default is kcal/mol) + + Returns + ------- + signal : numpy.ndarray + protein fraction folded signal as a function of osmolyte + """ + + RT = R*T + dG = dG_unfold + m_unfold*osmolyte + K = np.exp(-dG/RT) + + fx = 1/(1 + K) + native_signal = (m_native*osmolyte + b_native)*fx + denatured_signal = (m_denat*osmolyte + b_denat)*(1 - fx) + + return native_signal + denatured_signal + + # Parameter for staphylococcal nuclease d+phs protein, pH 7.0 + gen_params = {"dG_unfold":11.9, + "m_unfold":-4.2, + "b_native":1.5, + "m_native":-0.15, + "b_denat":0.1, + "m_denat":-0.03} + + # Generate data + T = 298 + R = 0.001987 + err = 0.2 + num_points = 50 + osmolyte = np.linspace(0,8,num_points) + + y_obs_clean = linear_extrapolation(osmolyte=osmolyte, + R=R,T=T, + **gen_params) + y_obs = y_obs_clean + np.random.normal(0,err,num_points) + y_std = err*2 + + test_fcn = linear_extrapolation + non_fit_kwargs = {"osmolyte":osmolyte, + "R":R, + "T":T} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + # Put some bounds in place to avoid numerical overflow + f.param_df.loc["dG_unfold","lower_bound"] = 0 + f.param_df.loc["dG_unfold","upper_bound"] = 20 + + f.param_df.loc["m_unfold","lower_bound"] = -10 + f.param_df.loc["m_unfold","upper_bound"] = 0 + + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # This check should be added back in before final release. It is failing + # on windows with python3.11 -- and only there. I need to push into main + # to finalize docs; once that is done, come back and fix this before the + # announcement release. --MJH 8/27/2024 + + # make estimate lands between confidence intervals + #expected = np.array([gen_params[p] for p in f.fit_df.index]) + #assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + #assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") diff --git a/tests/dataprob/test_integration/test_linear.py b/tests/dataprob/test_integration/test_linear.py new file mode 100644 index 0000000..a6cf9ad --- /dev/null +++ b/tests/dataprob/test_integration/test_linear.py @@ -0,0 +1,82 @@ +""" +Fit a two-parameter linear model to plausible data. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def linear_model(m,b,x): + return m*x + b + + gen_params = {"m":-3, + "b":20} + + err = 0.50 + num_points = 20 + + x = np.linspace(-5,5,num_points) + y_obs = linear_model(x=x,**gen_params) + np.random.normal(0,err,num_points) + y_std = 2*err + + test_fcn = linear_model + non_fit_kwargs = {"x":x} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") diff --git a/tests/dataprob/test_integration/test_michelis-menten.py b/tests/dataprob/test_integration/test_michelis-menten.py new file mode 100644 index 0000000..b54e04a --- /dev/null +++ b/tests/dataprob/test_integration/test_michelis-menten.py @@ -0,0 +1,82 @@ +""" +Fit a two-parameter Michealis-Menten model to plausible data. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def michaelis_menten(vmax=100,km=30,s0=None): + return s0/(s0 + km)*vmax + + gen_params = {"vmax":300, + "km":10} + + err = 10 + num_points = 20 + + s0 = np.linspace(0,100,num_points) + y_obs = michaelis_menten(s0=s0,**gen_params) + np.random.normal(0,err,num_points) + y_std = 2*err + + test_fcn = michaelis_menten + non_fit_kwargs = {"s0":s0} + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_mixed-gaussian.py b/tests/dataprob/test_integration/test_mixed-gaussian.py new file mode 100644 index 0000000..8cb3395 --- /dev/null +++ b/tests/dataprob/test_integration/test_mixed-gaussian.py @@ -0,0 +1,126 @@ +""" +First a six-parameter mixed gaussian. Uses a vector first argument, +demonstrating this capability. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + from scipy import stats + + def multi_gaussian(params,num_gaussians,x): + """ + Generate a multi-guassian. + + Parameters + ---------- + params : numpy.ndarray + float numpy array that is num_gaussians*3 long. this encodes the + gaussian [mean1,std1,area1,mean2,std2,area2,...meanN,stdN,areaN] + shape parameters + num_gaussians : int + number of gaussians in the params array + x : numpy.ndarray + calculate guassians over the values in x + + Returns + ------- + out : numpy.ndarray + sum of the pdfs for the gaussians in params calculated over x + """ + + # Create output array + out = np.zeros(len(x),dtype=float) + + # For each gaussian + for i in range(num_gaussians): + + # Grab the shape parameters + mean = params[i*3] + std = params[i*3 + 1] + area = params[i*3 + 2] + + # Add this to out + out += area*stats.norm(loc=mean,scale=std).pdf(x) + + return out + + gen_params = {"params":np.array([5,0.3,10,6,1.5,10]), + "num_gaussians":2} + + err = 0.2 + num_points = 50 + + x = np.linspace(0,10,num_points) + y_obs = multi_gaussian(x=x,**gen_params) + np.random.normal(0,err,num_points) + y_std = 2*err + + test_fcn = multi_gaussian + non_fit_kwargs = {"x":x, + "num_gaussians":2} + + + # ------------------------------------------------------------------------ + # Run analysis + + f = dataprob.setup(some_function=test_fcn, + method=method, + fit_parameters=["m0","s0","a0","m1","s1","a1"], + non_fit_kwargs=non_fit_kwargs, + vector_first_arg=True) + + # Set some guesses + f.param_df.loc[["m0","s0","a0","m1","s1","a1"],"guess"] = [5,1,1,7,1,1] + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make sure estimate lands between confidence intervals + expected = np.array(gen_params["params"]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_periodic.py b/tests/dataprob/test_integration/test_periodic.py new file mode 100644 index 0000000..8011ba6 --- /dev/null +++ b/tests/dataprob/test_integration/test_periodic.py @@ -0,0 +1,95 @@ +""" +Fit a three-parameter periodic function to data. (Note: this would be better +analyzed with a Fourier Transform for a real application.) Because of periodicity, +it's not well behaved. To improve fitting, fix the frequency and put bounds on +the phase. Good test of that functionality, as this will not converge with +no bounds. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + + def periodic(amplitude,phase,freq,theta): + return amplitude*np.sin(freq*theta + phase) + + gen_params = {"amplitude":5, + "phase":np.pi/2, + "freq":2} + + err = 0.4 + num_points = 50 + + theta = np.linspace(0,4*np.pi,num_points) + y_obs = periodic(theta=theta,**gen_params) + np.random.normal(0,err,num_points) + y_std = err*2 + + f = dataprob.setup(periodic, + method=method, + non_fit_kwargs={"theta":theta}) + + # Set the guesses and bounds. Because of the periodicity, this is not + # particularly well behaved. Fix frequency at right value. + f.param_df.loc["amplitude","guess"] = 1 + f.param_df.loc["phase","guess"] = np.pi/2 + f.param_df.loc["freq","guess"] = 2.0 + f.param_df.loc["freq","fixed"] = True + + f.param_df.loc["freq","lower_bound"] = 1.5 + f.param_df.loc["freq","upper_bound"] = 2.5 + + f.param_df.loc["phase","lower_bound"] = np.pi/2.5 + f.param_df.loc["phase","upper_bound"] = np.pi/1.5 + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_polynomial.py b/tests/dataprob/test_integration/test_polynomial.py new file mode 100644 index 0000000..52bebfb --- /dev/null +++ b/tests/dataprob/test_integration/test_polynomial.py @@ -0,0 +1,81 @@ +""" +Fit a five parameter polynomial model to data. +""" + +import pytest + +import dataprob + +import numpy as np +import matplotlib + +def _core_test(method,**method_kwargs): + + # ------------------------------------------------------------------------ + # Define model and generate data + + def fourth_order_polynomial(a=1,b=1,c=1,d=1,e=1,x=None): + return a + b*x + c*(x**2) + d*(x**3) + e*(x**4) + + gen_params = {"a":5, + "b":0.01, + "c":0.2, + "d":0.03, + "e":0.001} + + err = 2 + num_points = 50 + x = np.linspace(-10,10,num_points) + y_obs = fourth_order_polynomial(x=x,**gen_params) + np.random.normal(loc=0,scale=err,size=num_points) + y_std = err*2 + + # ------------------------------------------------------------------------ + # Define model and generate data + + f = dataprob.setup(fourth_order_polynomial, + method=method, + non_fit_kwargs={"x":x}) + + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # make estimate lands between confidence intervals + expected = np.array([gen_params[p] for p in f.fit_df.index]) + assert np.sum(expected < np.array(f.fit_df["low_95"])) == 0 + assert np.sum(expected > np.array(f.fit_df["high_95"])) == 0 + + fig = dataprob.plot_summary(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + + fig = dataprob.plot_corner(f) + assert issubclass(type(fig),matplotlib.figure.Figure) + matplotlib.pyplot.close(fig) + +# Try tests twice. We do a lot of tests around 95% confidence intervals. Odds +# are relatively high we hit one across the whole suite. So try once; if fails, +# try again. If it fails again, fail completely + +def test_ml(): + + try: + _core_test(method="ml") + except AssertionError: + _core_test(method="ml") + +@pytest.mark.slow +def test_bayesian(): + + try: + _core_test(method="mcmc") + except AssertionError: + _core_test(method="mcmc") + +@pytest.mark.slow +def test_bootstrap(): + + try: + _core_test(method="bootstrap") + except AssertionError: + _core_test(method="bootstrap") \ No newline at end of file diff --git a/tests/dataprob/test_integration/test_random.py b/tests/dataprob/test_integration/test_random.py new file mode 100644 index 0000000..399a288 --- /dev/null +++ b/tests/dataprob/test_integration/test_random.py @@ -0,0 +1,90 @@ +""" +This is a test for bayesian MCMC only. Model generates data uncorrelated with +input parameter. Our posterior should *only* have information from the prior. +""" +import pytest + +import dataprob + +import numpy as np + +def _core_test(method,**method_kwargs): + + # Thus function returns values that are fixed and uncorrelated with "K". + def random_function(K,values): + return values + + # Create some random data + gen_params = {"K":1e-3} + err = 0.1 + num_points = 20 + values = np.random.normal(loc=0,scale=1,size=num_points) + y_obs = random_function(values=values,**gen_params) + y_std = err*2 + + test_fcn = random_function + non_fit_kwargs = {"values":values} + + # Set up analysis + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + # Set prior + prior_mean = 0 + prior_std = 1 + + f.param_df.loc["K","prior_mean"] = prior_mean + f.param_df.loc["K","prior_std"] = prior_std + + # Run analysis + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # Because the data are uncorrelated with model, the posterior better equal + # the prior! + posterior_mean = f.fit_df.loc["K","estimate"] + posterior_std = f.fit_df.loc["K","std"] + + assert np.round(posterior_mean,0) == prior_mean + assert np.round(posterior_std,0) == prior_std + + # Repeat analysis with same data, different prior. Better recover prior + # again. + + # Set up analysis + f = dataprob.setup(some_function=test_fcn, + method=method, + non_fit_kwargs=non_fit_kwargs) + + # Set prior + prior_mean = 6 + prior_std = 2 + + f.param_df.loc["K","prior_mean"] = prior_mean + f.param_df.loc["K","prior_std"] = prior_std + + # Run analysis + f.fit(y_obs=y_obs, + y_std=y_std, + **method_kwargs) + + # Because the data are uncorrelated with model, the posterior better equal + # the prior! + posterior_mean = f.fit_df.loc["K","estimate"] + posterior_std = f.fit_df.loc["K","std"] + + assert np.round(posterior_mean,0) == prior_mean + assert np.round(posterior_std,0) == prior_std + + + +@pytest.mark.slow +def test_bayesian(): + + _core_test(method="mcmc", + use_ml_guess=False, + num_walkers=100, + num_steps=200) + diff --git a/tests/dataprob/test_model_wrapper.py b/tests/dataprob/test_model_wrapper.py deleted file mode 100644 index 5d94426..0000000 --- a/tests/dataprob/test_model_wrapper.py +++ /dev/null @@ -1,262 +0,0 @@ -import pytest - -import dataprob - -import numpy as np - - -def bad_model_with_reserved_name(guesses=2): - - return guesses - -def test_init(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - # Make sure it correctly recognizes model parameters (takes first two b/c - # can be coerced into float, not extra_stuff b/c not float, not K3 b/c - # after non-fittable. ) - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert isinstance(mw.K1,dataprob.FitParameter) - assert isinstance(mw.K2,dataprob.FitParameter) - assert not isinstance(mw.extra_stuff,dataprob.FitParameter) - assert not isinstance(mw.K3,dataprob.FitParameter) - - assert mw.K1.guess == 0 # No guess specified --> should be 0.0 - assert mw.K2.guess == 20 # Default (guess) specified - - # Make sure that we only grab K1 if specified, not the other possible - # parameters K2 and K3 - mw = dataprob.ModelWrapper(model_to_test_wrap,fittable_params=["K1"]) - assert isinstance(mw.K1,dataprob.FitParameter) - assert not isinstance(mw.K2,dataprob.FitParameter) - assert not isinstance(mw.extra_stuff,dataprob.FitParameter) - - # Make sure we can pass more than one fittable parameters - mw = dataprob.ModelWrapper(model_to_test_wrap,fittable_params=["K1","K2"]) - assert isinstance(mw.K1,dataprob.FitParameter) - assert isinstance(mw.K2,dataprob.FitParameter) - assert not isinstance(mw.extra_stuff,dataprob.FitParameter) - assert not isinstance(mw.K3,dataprob.FitParameter) - - # Make sure we can grab a fittable parameter that would not normally - # be used. - mw = dataprob.ModelWrapper(model_to_test_wrap,fittable_params=["K3","K2"]) - assert not isinstance(mw.K1,dataprob.FitParameter) - assert isinstance(mw.K2,dataprob.FitParameter) - assert not isinstance(mw.extra_stuff,dataprob.FitParameter) - assert isinstance(mw.K3,dataprob.FitParameter) - assert mw.K3.guess == 42 - - # Recognizes bad manually passed parameter - with pytest.raises(ValueError): - mw = dataprob.ModelWrapper(model_to_test_wrap,fittable_params=["not_real"]) - - # Recognizes another type of bad manually passed parameter - with pytest.raises(ValueError): - mw = dataprob.ModelWrapper(model_to_test_wrap,fittable_params=["extra_stuff"]) - - # pass model that uses a reserved name as an argument - with pytest.raises(ValueError): - mw = dataprob.ModelWrapper(bad_model_with_reserved_name) - - # pass non-fit parameters - - -def test_expand_to_model_inputs(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - mw = dataprob.ModelWrapper(model_to_test_wrap) - - # Make sure we get the right parameter names - params = list(mw.fit_parameters.keys()) - assert params[0] == "K1" and params[1] == "K2" - - # Make sure we get the right non-fit-parameter names - args = list(mw.other_arguments.keys()) - assert args[0] == "extra_stuff" and args[1] == "K3" - - # Check guesses - assert np.array_equal(mw.guesses,np.array((0,20))) - - # Check bounds - assert np.array_equal(mw.bounds[0],np.array((-np.inf,-np.inf))) - assert np.array_equal(mw.bounds[1],np.array((np.inf,np.inf))) - - # Check names vector - assert mw.names[0] == "K1" - assert mw.names[1] == "K2" - - -def test_setting_guess(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - # Default values set correctly - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert mw.K1.guess == 0 - assert mw.K2.guess == 20 - with pytest.raises(AttributeError): - mw.K3.guess == 20 - - # Setting K1 works but does not alter K2 - mw.K1 = 233 - assert mw.K1.guess == 233 - assert mw.K2.guess == 20 - - # Setting K2.guess works - mw.K2.guess = 32 - assert mw.K1.guess == 233 - assert mw.K2.guess == 32 - - # Try, but fail, to set the guess with a string - assert mw.K1.guess == 233 - with pytest.raises(ValueError): - mw.K1.guess = "a string" - assert mw.K1.guess == 233 - - # Set guess with a string that can be coerced into a float - assert mw.K1.guess == 233 - mw.K1.guess = "22" - assert mw.K1.guess == 22 - - # Test setting by fit_parameters dict - assert mw.fit_parameters["K1"].guess == 22 - mw.fit_parameters["K1"].guess = 42 - assert mw.fit_parameters["K1"].guess == 42 - -def test_setting_bounds(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - mw = dataprob.ModelWrapper(model_to_test_wrap) - - # Set bounds - assert np.array_equal(mw.bounds[0],np.array((-np.inf,-np.inf))) - mw.K1.bounds = [0,500] - assert np.array_equal(mw.K1.bounds,np.array([0,500])) - - # Try, but fail, to set bounds that are backwards - with pytest.raises(ValueError): - mw.K1.bounds = [500,-50] - assert np.array_equal(mw.K1.bounds,np.array([0,500])) - - # Set bounds that do not encompass guess and make sure guess shifts - mw.K1.guess = 0 - assert mw.K1.guess == 0 - with pytest.warns(): - mw.K1.bounds = [-500,-50] - assert np.array_equal(mw.K1.bounds,np.array([-500,-50])) - assert mw.K1.guess == -50 - - # Test setting by fit_parameters dict - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert np.array_equal(mw.fit_parameters["K1"].bounds,np.array((-np.inf,np.inf))) - mw.fit_parameters["K1"].bounds = [0,500] - assert np.array_equal(mw.fit_parameters["K1"].bounds,np.array([0,500])) - assert np.array_equal(mw.K1.bounds,np.array([0,500])) - -def test_setting_name(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - mw = dataprob.ModelWrapper(model_to_test_wrap) - - # Test setting by mw.K - assert mw.K1.name == "K1" - mw.K1.name = "new_name" - assert mw.K1.name == "new_name" - assert mw.fit_parameters["K1"].name == "new_name" - - # Test setting via mw.fit_parameters - assert mw.K2.name == "K2" - assert mw.fit_parameters["K2"].name == "K2" - mw.fit_parameters["K2"].name = "another name with spaces this time" - assert mw.K2.name == "another name with spaces this time" - assert mw.fit_parameters["K2"].name == "another name with spaces this time" - -def test_setting_fixed(binding_curve_test_data): - - # This also tests the private function self._update_parameter_map b/c - # changing fixed parameters is what changes the guesses and other properties - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - # Wrap model - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert mw.names[0] == "K1" - assert mw.names[1] == "K2" - - # Fix one parameter - mw.K1.fixed = True - assert mw.names[0] == "K2" - assert mw.guesses[0] == 20 - with pytest.raises(IndexError): - mw.names[1] - - # Fix second parameter - mw.K2.fixed = True - with pytest.raises(IndexError): - mw.names[0] - - # Unfix a parameter - mw.K1.fixed = False - assert mw.names[0] == "K1" - assert mw.guesses[0] == 0 - with pytest.raises(IndexError): - mw.names[1] - - # Try to fix a parameter that is not really a parameter - with pytest.raises(AttributeError): - mw.extra_stuff.fixed = True - - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert mw.names[0] == "K1" - assert mw.names[1] == "K2" - - -def test_setting_other_arguments(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - mw = dataprob.ModelWrapper(model_to_test_wrap) - assert isinstance(mw.K1,dataprob.FitParameter) - assert isinstance(mw.K2,dataprob.FitParameter) - assert not isinstance(mw.extra_stuff,dataprob.FitParameter) - assert not isinstance(mw.K3,dataprob.FitParameter) - - assert mw.other_arguments["extra_stuff"] == "test" - assert mw.extra_stuff == "test" - mw.other_arguments["extra_stuff"] = 19 - assert mw.extra_stuff == 19 - -def test_model_output(binding_curve_test_data): - - model_to_test_wrap = binding_curve_test_data["model_to_test_wrap"] - - mw = dataprob.ModelWrapper(model_to_test_wrap) - - # Override K1 default to make nt all zero - mw.K1.guess = 1 - - # Test call with default parameters - assert mw.model() == 1*20*42 - assert mw.model((1,20)) == 1*20*42 - assert mw.model((20,20)) == 20*20*42 - - # Test pass through for bad argument - with pytest.raises(ValueError): - mw.model(("stupid",20)) - - # test passing too many arguments - with pytest.raises(ValueError): - mw.model((20,20,42)) - - # test passing too few arguments - with pytest.raises(ValueError): - mw.model((20,)) - - # Test setting other argument that should change output - mw.K3 = 14 - assert mw.model() == 1*20*14 diff --git a/tests/dataprob/test_package.py b/tests/dataprob/test_package.py new file mode 100644 index 0000000..d15a7da --- /dev/null +++ b/tests/dataprob/test_package.py @@ -0,0 +1,6 @@ + +import dataprob + +def test_generic_stuff(): + + print(dataprob.__version__) diff --git a/tests/dataprob/test_check.py b/tests/dataprob/util/test_check.py similarity index 79% rename from tests/dataprob/test_check.py rename to tests/dataprob/util/test_check.py index a2377b3..91086be 100644 --- a/tests/dataprob/test_check.py +++ b/tests/dataprob/util/test_check.py @@ -1,9 +1,8 @@ -from dataprob.check import check_bool -from dataprob.check import check_float -from dataprob.check import check_int -from dataprob.check import check_array -from dataprob.check import column_to_bool +from dataprob.util.check import check_bool +from dataprob.util.check import check_float +from dataprob.util.check import check_int +from dataprob.util.check import check_array import pytest import numpy as np @@ -11,7 +10,7 @@ def test_check_bool(): - true_values = [True,1.0,1,np.ones(1,dtype=np.bool_)[0]] + true_values = [True,1.0,1,np.ones(1,dtype=np.bool_)[0],1.000001] for t in true_values: assert check_bool(t) @@ -19,7 +18,7 @@ def test_check_bool(): for f in false_values: assert not check_bool(f) - bad_value = [None,123,-1,bool,"stupid",[1.0,1.0],np.array([1.0,1.0]),{},float] + bad_value = [None,123,-1,bool,"stupid",[1.0,1.0],np.array([1.0,1.0]),{},float,1.1,0.1] for b in bad_value: with pytest.raises(ValueError): value = check_bool(b) @@ -32,6 +31,7 @@ def test_check_float(): bad_value = [None,"stupid",[1.0,1.0],np.array([1.0,1.0]),{},float,np.nan] for b in bad_value: + print("bad value", b) with pytest.raises(ValueError): value = check_float(b) @@ -57,6 +57,23 @@ def test_check_float(): value = check_float(1.0,minimum_allowed=1.0,maximum_inclusive=True) assert value == 1 + with pytest.raises(ValueError): + check_float(np.nan) + assert np.isnan(check_float(np.nan,allow_nan=True)) + + with pytest.raises(ValueError): + check_float(pd.NA) + assert np.isnan(check_float(pd.NA,allow_nan=True)) + + with pytest.raises(ValueError): + check_float(None) + assert np.isnan(check_float(None,allow_nan=True)) + + # check bounds == None case for error message + with pytest.raises(ValueError): + check_float(None,minimum_allowed=None,maximum_allowed=None) + + def test_check_int(): @@ -78,9 +95,13 @@ def test_check_int(): with pytest.raises(ValueError): check_int(1,minimum_allowed=1,minimum_inclusive=False) - + value = check_int(1,minimum_allowed=1,minimum_inclusive=True) assert value == 1 + value = check_int(2,minimum_allowed=1,minimum_inclusive=True) + assert value == 2 + value = check_int(2,minimum_allowed=1,minimum_inclusive=False) + assert value == 2 with pytest.raises(ValueError): check_int(1,maximum_allowed=0) @@ -88,8 +109,12 @@ def test_check_int(): with pytest.raises(ValueError): check_int(1,maximum_allowed=1,maximum_inclusive=False) - value = check_int(1,minimum_allowed=1,maximum_inclusive=True) + value = check_int(1,maximum_allowed=1,maximum_inclusive=True) assert value == 1 + value = check_int(0,maximum_allowed=1,maximum_inclusive=True) + assert value == 0 + value = check_int(0,maximum_allowed=1,maximum_inclusive=False) + assert value == 0 def test_check_array(): @@ -217,29 +242,23 @@ def test_check_array(): expected_shape=s, expected_shape_names=expected_shape_name) + # nans + has_nan = np.array([1,2,np.nan]) + v = check_array(has_nan,nan_allowed=True) + with pytest.raises(ValueError): + check_array(has_nan,nan_allowed=False) + + # check a couple of other possible nan inputs... + v = check_array([None,1],nan_allowed=True) + with pytest.raises(ValueError): + check_array([None,1],nan_allowed=False) + + v = check_array([pd.NA,1],nan_allowed=True) + with pytest.raises(ValueError): + check_array([pd.NA,1],nan_allowed=False) + # don't allow nan, but don't send in. should works + v = check_array([1,2,3],nan_allowed=False) + assert np.array_equal(v,[1,2,3]) -def test_column_to_bool(): - - df = pd.DataFrame({"test":[True,False, - "True","False", - 1,0, - "1","0", - "yes","no", - "T","F", - "Y","N"]}) - - expected = np.array((1,0,1,0,1,0,1,0,1,0,1,0,1,0),dtype=bool) - out = column_to_bool(df["test"],"test") - assert np.array_equal(out,expected) - - df = pd.DataFrame({"test":[True,False, - "True","False", - 1,0, - "1","0", - "yes","no", - "T","F", - "X","N"]}) - with pytest.raises(ValueError): - out = column_to_bool(df["test"],"test") diff --git a/tests/dataprob/util/test_read_spreadsheet.py b/tests/dataprob/util/test_read_spreadsheet.py new file mode 100644 index 0000000..01fe70f --- /dev/null +++ b/tests/dataprob/util/test_read_spreadsheet.py @@ -0,0 +1,141 @@ +import pytest + +from dataprob.util.read_spreadsheet import read_spreadsheet + +import numpy as np +import pandas as pd + +def test_read_spreadsheet(spreadsheets): + + expected_columns = ['name', + 'guess', + 'lower_bound', + 'upper_bound', + 'prior_mean', + 'prior_std', + 'fixed'] + + expected_values = {"name":["K1","K2","K3"], + "guess":[1e7,1e-6,1], + #"lower_bound":[pd.NA,pd.NA,-1], ## <- check below + #"upper_bound":[pd.NA,pd.NA,2], + #"prior_mean":[1e6,pd.NA,1e-6], + #"prior_std":[10,pd.NA,1000], + "fixed":[True,False,False]} + + + # Check excel read + xlsx = spreadsheets["basic-spreadsheet.xlsx"] + df = read_spreadsheet(spreadsheet=xlsx) + + assert np.array_equal(df.columns,expected_columns) + for e in expected_values: + print("xlsx",e) + assert np.array_equal(df[e],expected_values[e]) + + assert np.array_equal(pd.isna(df["lower_bound"]),[True,True,False]) + assert df.loc[2,"lower_bound"] == -1 + + assert np.array_equal(pd.isna(df["upper_bound"]),[True,True,False]) + assert df.loc[2,"upper_bound"] == 2 + + assert np.array_equal(pd.isna(df["prior_mean"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_mean"],[1e6,1e-6]) + + assert np.array_equal(pd.isna(df["prior_std"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_std"],[10,1000]) + + # Check csv read + csv = spreadsheets["basic-spreadsheet.csv"] + df = read_spreadsheet(spreadsheet=csv) + + assert np.array_equal(df.columns,expected_columns) + for e in expected_values: + print("csv",e) + assert np.array_equal(df[e],expected_values[e]) + + assert np.array_equal(pd.isna(df["lower_bound"]),[True,True,False]) + assert df.loc[2,"lower_bound"] == -1 + + assert np.array_equal(pd.isna(df["upper_bound"]),[True,True,False]) + assert df.loc[2,"upper_bound"] == 2 + + assert np.array_equal(pd.isna(df["prior_mean"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_mean"],[1e6,1e-6]) + + assert np.array_equal(pd.isna(df["prior_std"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_std"],[10,1000]) + + + # Check tsv read + tsv = spreadsheets["basic-spreadsheet.tsv"] + df = read_spreadsheet(spreadsheet=tsv) + + assert np.array_equal(df.columns,expected_columns) + for e in expected_values: + print("tsv",e) + assert np.array_equal(df[e],expected_values[e]) + + assert np.array_equal(pd.isna(df["lower_bound"]),[True,True,False]) + assert df.loc[2,"lower_bound"] == -1 + + assert np.array_equal(pd.isna(df["upper_bound"]),[True,True,False]) + assert df.loc[2,"upper_bound"] == 2 + + assert np.array_equal(pd.isna(df["prior_mean"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_mean"],[1e6,1e-6]) + + assert np.array_equal(pd.isna(df["prior_std"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_std"],[10,1000]) + + # Check txt read + txt = spreadsheets["basic-spreadsheet.txt"] + df = read_spreadsheet(spreadsheet=txt) + + assert np.array_equal(df.columns,expected_columns) + for e in expected_values: + print("txt",e) + assert np.array_equal(df[e],expected_values[e]) + + assert np.array_equal(pd.isna(df["lower_bound"]),[True,True,False]) + assert df.loc[2,"lower_bound"] == -1 + + assert np.array_equal(pd.isna(df["upper_bound"]),[True,True,False]) + assert df.loc[2,"upper_bound"] == 2 + + assert np.array_equal(pd.isna(df["prior_mean"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_mean"],[1e6,1e-6]) + + assert np.array_equal(pd.isna(df["prior_std"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_std"],[10,1000]) + + # Check pass through + xlsx = spreadsheets["basic-spreadsheet.xlsx"] + df_in = pd.read_excel(xlsx) + + df = read_spreadsheet(spreadsheet=df_in) + + assert np.array_equal(df.columns,expected_columns) + for e in expected_values: + print("xlsx",e) + assert np.array_equal(df[e],expected_values[e]) + + assert np.array_equal(pd.isna(df["lower_bound"]),[True,True,False]) + assert df.loc[2,"lower_bound"] == -1 + + assert np.array_equal(pd.isna(df["upper_bound"]),[True,True,False]) + assert df.loc[2,"upper_bound"] == 2 + + assert np.array_equal(pd.isna(df["prior_mean"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_mean"],[1e6,1e-6]) + + assert np.array_equal(pd.isna(df["prior_std"]),[False,True,False]) + assert np.array_equal(df.loc[[0,2],"prior_std"],[10,1000]) + + # send in something stupid + with pytest.raises(ValueError): + read_spreadsheet(spreadsheet=1) + + # file not found error + with pytest.raises(FileNotFoundError): + read_spreadsheet(spreadsheet="not_a_file.txt") diff --git a/tests/examples/binding-curves_noise-0.050.csv b/tests/examples/binding-curves_noise-0.050.csv deleted file mode 100644 index 62ee359..0000000 --- a/tests/examples/binding-curves_noise-0.050.csv +++ /dev/null @@ -1,41 +0,0 @@ -,X,Y,Y_stdev,residual,weighted_residual -0,0.0,0.01069668115595422,0.01069668115595422,0.01069668115595422,1.0 -1,0.25,0.1583333707190824,0.0472222596079713,0.0472222596079713,1.0 -2,0.5,0.20984872997160364,0.009848729971603621,0.009848729971603631,1.000000000000001 -3,0.75,0.21786454573900596,0.054862726988266754,-0.05486272698826675,-0.9999999999999999 -4,1.0,0.26899468741739546,0.06433864591593785,-0.06433864591593785,-1.0 -5,1.25,0.4066294920252474,0.02201410740986274,0.02201410740986276,1.0000000000000009 -6,1.5,0.37204534880896567,0.05652607976246288,-0.05652607976246288,-1.0 -7,1.75,0.5226769545518608,0.05601028788519416,0.05601028788519413,0.9999999999999996 -8,2.0,0.4848411599533046,0.015158840046695397,-0.015158840046695377,-0.9999999999999987 -9,2.25,0.5099292313035274,0.019482533402354993,-0.01948253340235495,-0.9999999999999979 -10,2.5,0.511245762023063,0.044309793532492564,-0.044309793532492536,-0.9999999999999993 -11,2.75,0.5021067336398095,0.07684063478124317,-0.07684063478124314,-0.9999999999999997 -12,3.0,0.5993711062265129,0.0006288937734870884,-0.0006288937734870714,-0.9999999999999729 -13,3.25,0.700608928617404,0.08156130956978494,0.08156130956978491,0.9999999999999997 -14,3.5,0.5570026487237468,0.07936098763988948,-0.07936098763988952,-1.0000000000000004 -15,3.75,0.5905511476237522,0.061622765419726125,-0.06162276541972611,-0.9999999999999998 -16,4.0,0.7135078180848959,0.04684115141822932,0.04684115141822931,0.9999999999999999 -17,4.25,0.66036596877094,0.019634031229060003,-0.019634031229060045,-1.0000000000000022 -18,4.5,0.7604158088388152,0.0681081165311229,0.06810811653112292,1.0000000000000002 -19,4.75,0.7175399158502814,0.013836212146577721,0.013836212146577709,0.9999999999999991 -20,5.0,0.7074087214145744,0.0068769928711398245,-0.006876992871139853,-1.0000000000000042 -21,5.25,0.7975559931944572,0.07341806215997447,0.07341806215997448,1.0000000000000002 -22,5.5,0.6727517940370945,0.06058153929623873,-0.06058153929623877,-1.0000000000000007 -23,5.75,0.8341700668484691,0.09223458297750131,0.09223458297750131,1.0 -24,6.0,0.6980803369045364,0.05191966309546362,-0.051919663095463586,-0.9999999999999993 -25,6.25,0.6561207266641882,0.10145503091156943,-0.10145503091156938,-0.9999999999999994 -26,6.5,0.8081649918183355,0.04345910946539428,0.04345910946539433,1.000000000000001 -27,6.75,0.8302227391506498,0.058794167722078364,0.05879416772207835,0.9999999999999998 -28,7.0,0.8264936569572588,0.0487158791794811,0.04871587917948106,0.9999999999999991 -29,7.25,0.843324775646321,0.059540991862537224,0.05954099186253725,1.0000000000000004 -30,7.5,0.73916830633667,0.050305377873856374,-0.05030537787385636,-0.9999999999999998 -31,7.75,0.8058369858160012,0.010965190944206307,0.010965190944206338,1.0000000000000029 -32,8.0,0.8764705240885923,0.07647052408859224,0.07647052408859223,0.9999999999999998 -33,8.25,0.7328114120602407,0.0720666367202472,-0.07206663672024716,-0.9999999999999994 -34,8.5,0.8374414089232748,0.027917599399465205,0.027917599399465254,1.0000000000000018 -35,8.75,0.8409324729668872,0.026978984594794177,0.026978984594794198,1.0000000000000007 -36,9.0,0.7973145344749395,0.02086728370687871,-0.020867283706878736,-1.0000000000000013 -37,9.25,0.8024697195277646,0.01975250269445759,-0.019752502694457608,-1.0000000000000009 -38,9.5,0.8251316824559359,0.0009552740658031642,-0.0009552740658032022,-1.0000000000000397 -39,9.75,0.8089701736588916,0.0208170603836616,-0.0208170603836616,-1.0 diff --git a/tests/examples/example-fit.ipynb b/tests/examples/example-fit.ipynb deleted file mode 100644 index 4169d57..0000000 --- a/tests/examples/example-fit.ipynb +++ /dev/null @@ -1,943 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "import dataprob\n", - "import pandas as pd\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example model and data\n", - "\n", - "Models should have the form:\n", - "```\n", - "def some_model(param1,param2,param3,...other_args,...other_kwargs):\n", - " return observable\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
XYY_stdevresidualweighted_residual
00.000.0106970.0106970.0106971.0
10.250.1583330.0472220.0472221.0
20.500.2098490.0098490.0098491.0
30.750.2178650.054863-0.054863-1.0
41.000.2689950.064339-0.064339-1.0
\n", - "
" - ], - "text/plain": [ - " X Y Y_stdev residual weighted_residual\n", - "0 0.00 0.010697 0.010697 0.010697 1.0\n", - "1 0.25 0.158333 0.047222 0.047222 1.0\n", - "2 0.50 0.209849 0.009849 0.009849 1.0\n", - "3 0.75 0.217865 0.054863 -0.054863 -1.0\n", - "4 1.00 0.268995 0.064339 -0.064339 -1.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def binding_model(K,X=None):\n", - " \"\"\"\n", - " Simple, saturating binding curve.\n", - "\n", - " K: association constant\n", - " X: vector of X concentrations\n", - " \"\"\"\n", - "\n", - " return K*X/(1 + K*X)\n", - "\n", - "df = pd.read_csv(\"binding-curves_noise-0.050.csv\",index_col=0)\n", - "\n", - "fig, ax = plt.subplots()\n", - "ax.errorbar(df.X,df.Y,yerr=df.Y_stdev,fmt=\"o\",color=\"black\")\n", - "plt.show()\n", - "\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Wrap the binding model" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'K': }\n", - "{'X': None}\n" - ] - } - ], - "source": [ - "mw = dataprob.ModelWrapper(binding_model)\n", - "print(mw.fit_parameters)\n", - "print(mw.other_arguments)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/harmsm/miniconda3/lib/python3.12/site-packages/dataprob/fit_param.py:306: UserWarning: The previous guess (22.0) is outside the new\n", - "bounds ([-20. 20.]). The guess has been updated to\n", - "'20.0'.\n", - "\n", - " warnings.warn(w,UserWarning)\n" - ] - } - ], - "source": [ - "mw.X = df.X\n", - "mw.K = 22\n", - "mw.K.bounds = [-20,20]\n", - "mw.K.name = \"equilibrium constant\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Construct the fitter and do the fit" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.4934230.280837-0.0751031.06194920.0NaNNaN-20.020.0False
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.493423 0.280837 -0.075103 1.061949 20.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN -20.0 20.0 False " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.MLFitter()\n", - "f.model = mw\n", - "#lm.K.guess = 22\n", - "#lm.K.fixed = False\n", - "f.fit(y_obs=df.Y)\n", - "f.fit_df" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "[0.49342315]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.4934230.280837-0.0751031.0619491.0NaNNaN-20.020.0False
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.493423 0.280837 -0.075103 1.061949 1.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN -20.0 20.0 False " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.MLFitter()\n", - "f.fit(model=mw.model,guesses=[1.0],y_obs=df.Y,)\n", - "print(f.success)\n", - "print(f.estimate)\n", - "f.fit_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Alternate way to construct fitter and do fit" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "[0.49342315]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.4934230.280837-0.0751031.0619491.0NaNNaN-20.020.0False
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.493423 0.280837 -0.075103 1.061949 1.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN -20.0 20.0 False " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.MLFitter()\n", - "f.model = mw.model\n", - "f.guesses = [1]\n", - "f.y_obs = df.Y\n", - "f.fit()\n", - "print(f.success)\n", - "print(f.estimate)\n", - "f.fit_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Add weighted residuals" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "[0.49837013]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.498370.0008510.4966460.5000941.0NaNNaN-20.020.0False
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.49837 0.000851 0.496646 0.500094 1.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN -20.0 20.0 False " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.MLFitter()\n", - "f.fit(model=mw.model,y_obs=df.Y,y_stdev=df.Y_stdev)\n", - "print(f.success)\n", - "print(f.estimate)\n", - "f.fit_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGiCAYAAAA1LsZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABDD0lEQVR4nO3deXhU5f3+8fcwkAQCiQsSEiYYBZWibLJEwKBIlIql0DRKlQLFqtUvQkJ+toAKWK3GpWpQUIqtS1sRNI6ohWJpChIrAqKxKlstICEmAVQSiJBlcn5/HBMI2WaSzJxZ7td1nSszJ8/MfCZE585znsVmGIaBiIiIiEXaWV2AiIiIhDaFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMdhZOPGjYwfP564uDhsNhurVq1q9jEbNmzg0ksvJTw8nN69e/Piiy+2oFQREREJRh6HkbKyMgYMGMCSJUvcar93716uu+46Ro8eTV5eHunp6dxyyy288847HhcrIiIiwcfWmo3ybDYbb7zxBhMnTmy0zZw5c1i9ejWfffZZ7bmf/exnHDlyhLVr17b0pUVERCRItPf2C2zatInk5OQ658aOHUt6enqjjykvL6e8vLz2fnV1Nd988w1nn302NpvNW6WKiIhIGzIMg6NHjxIXF0e7do1fjPF6GCkqKiImJqbOuZiYGEpLSzl+/DgdO3as95jMzEx++9vfers0ERER8YH8/HwcDkej3/d6GGmJefPmkZGRUXu/pKSEnj17kp+fT1RUlIWViYiIiLtKS0uJj4+nS5cuTbbzehjp3r07xcXFdc4VFxcTFRXVYK8IQHh4OOHh4fXOR0VFKYyIiIgEmOaGWHh9nZHhw4eTk5NT59y6desYPny4t19aREREAoDHYeTYsWPk5eWRl5cHmFN38/Ly2L9/P2BeYpk6dWpt+9tvv509e/bwm9/8hp07d/LMM8/w6quvMnv27LZ5ByIiIhLQPA4jH374IYMGDWLQoEEAZGRkMGjQIBYsWABAYWFhbTABOO+881i9ejXr1q1jwIABPP744/zxj39k7NixbfQWREREJJC1ap0RXyktLSU6OpqSkhKNGREREQkQ7n5+a28aERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiASksrIybDYbNpuNsrIyq8uRVlAYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiDRCK3yK+IbCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFERER8YjWX5G2pjAiIiIillIYEREREUspjIiIiIilFEZERCQguVyu2tsbN26sc18Ci8KIiEiQCYUBpk6nk759+9beHzduHAkJCTidTgurkpZSGBERkYDidDpJTU2loKCgzvmCggJSU1MVSAKQwoiIiAQMl8tFWloahmHU+17NufT0dF2yCTAKIyIiEjByc3M5cOBAo983DIP8/Hxyc3N9WJW0lsKIiIgEjMLCwjZtJ/5BYUREJMQF0oDX2NjYNm0n/kFhREQCWiB9kErrJSUl4XA4sNlsDX7fZrMRHx9PUlKSjyuT1lAYERGRgGG321m0aBFAvUBScz8rKwu73e7TuhSKW0dhREREAkpKSgrZ2dnExcXVOe9wOMjOziYlJaXVr6Fw4VvtrS5ARETEUykpKSQnJxMdHQ3AmjVruOaaa3zeIyJtQz0jIiISkE4NHqNGjVIQCWAKIyIi4hHtCSNtTWFERETcpj1hGqaA1joKIyIiAcAfBlSG0p4wnoQLBbTWUxgREWmE/to9KZT2hPEkXIRSQPMmhRERkQbor926QmVPGE/CRSgFNG9TGBEROU2g/7XrjR6dUNgTxtNwESoBzRcURkREThHof+22pEfHnfASCnvCeBouQiGg+YrCiIjIKQL5r92W9Oi4G15CYU8YT8OFvwY0l8vFhg0beOWVV9iwYYPfBudTKYyIiJwiUP/abUmPjifhxV/3hGlLnoYLfwxoTqeThIQERo8ezU033cTo0aPdG+t04gRYGFoURkRETuGvf+02x9MenZaEF1/sCWMlT8OFvwW0mnB5+u9Bbbh88EF45RV49FGYORMmToTBg6FbN+jYEXbv9kmdDTICQElJiQEYJSUlVpciIoZhHDt2zAAMwDh27FhQ1VJVVWU4HA7DZrPVPu+ph81mM+Lj442qqqo2qN59zb3P5cuXN1jv6cfy5csNwzCM9evXu9V+/fr19V6r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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Plot the fit\n", - "fig, ax = plt.subplots()\n", - "ax.errorbar(df.X,df.Y,yerr=df.Y_stdev,fmt=\"o\",color=\"black\")\n", - "#ax.plot(df.X,mw.model(),\"-\",color='red')\n", - "ax.plot(df.X,mw.model(f.estimate),\"-\",color='red')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Corner plot" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "f.corner_plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### You can add parameter bounds and names" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[-20.],\n", - " [ 20.]])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mw.bounds" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "[0.49837013]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.498370.0008510.4966460.5000941.0NaNNaN0.0infFalse
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.49837 0.000851 0.496646 0.500094 1.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN 0.0 inf False " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.MLFitter()\n", - "f.model = mw.model\n", - "f.guesses = [1.0]\n", - "f.y_obs = df.Y\n", - "f.y_stdev = df.Y_stdev\n", - "f.bounds = [[0],[np.inf]]\n", - "f.param_names = [\"Kx\"]\n", - "f.fit()\n", - "print(f.success)\n", - "print(f.estimate)\n", - "f.fit_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bayesian fitter" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████| 100/100 [00:02<00:00, 48.67it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "[0.49840315]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
paramestimatestdevlow_95high_95guessprior_meanprior_stdlower_boundupper_boundfixed
0equilibrium constant0.4984030.0011960.4959710.5007831.0NaNNaN0.0infFalse
\n", - "
" - ], - "text/plain": [ - " param estimate stdev low_95 high_95 guess \\\n", - "0 equilibrium constant 0.498403 0.001196 0.495971 0.500783 1.0 \n", - "\n", - " prior_mean prior_std lower_bound upper_bound fixed \n", - "0 NaN NaN 0.0 inf False " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = dataprob.BayesianFitter()\n", - "f.fit(model=mw.model,guesses=[1.0],y_obs=df.Y,y_stdev=df.Y_stdev)\n", - "print(f.success)\n", - "print(f.estimate)\n", - "f.fit_df\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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L75YGzZs0Pvvvy9J+s9//qPXXntNV1xxhcmVxb/y8nJVV1f7/V5JT0/X6NGjO/0dGhOr9obbgQMH5Ha7lZGR4Xc8IyND7733nklVJQaPx6PCwkKNHTtW559/vtnlxLXnn39e27dv11tvvWV2KXHvo48+0q9//WsVFRXp7rvv1ltvvaXbb79dycnJmjlzptnlxaW5c+eqrq5O5557rux2u9xutx588EFNnz7d7NLiXnV1tSQF/A5tvi9UCRlGYJ7Zs2frnXfe0WuvvWZ2KXGtoqJCBQUFWr9+vVJTU80uJ+55PB6NHDlSCxculCQNHz5c77zzjpYvX04YiZA//elPWrlypVatWqXzzjtPO3bsUGFhobKysvjMY1BCXqbp37+/7Ha7ampq/I7X1NRo4MCBJlUV/2699Vb97W9/08aNG+VwOMwuJ65t27ZN+/bt09e//nV169ZN3bp106uvvqrHH39c3bp1k9vtNrvEuJKZmakhQ4b4Hfva176mPXv2mFRR/PvJT36iuXPn6rvf/a4uuOAC3XDDDZozZ44WLVpkdmlxr/l7MpzfoQkZRpKTkzVixAht2LDBd8zj8WjDhg0aM2aMiZXFJ8MwdOutt2rNmjX65z//qcGDB5tdUty7/PLL9b///U87duzw3UaOHKnp06drx44dstvtZpcYV8aOHdtmuPr777+vM844w6SK4t+RI0eUlOT/FWa32+XxeEyqKHEMHjxYAwcO9PsOraur05tvvtnp79CEvUxTVFSkmTNnauTIkRo1apSKi4vV0NCgWbNmmV1a3Jk9e7ZWrVqlv/zlL+rVq5fvmmJ6erp69OhhcnXxqVevXm365KSlpalfv3701YmAOXPm6OKLL9bChQv1ne98R1u3btWKFSu0YsUKs0uLW1dddZUefPBBnX766TrvvPP073//W4sXL9aNN95odmlxob6+Xh9++KFvv7y8XDt27NCpp56q008/XYWFhfr5z3+us88+W4MHD9a9996rrKwsTZ06tXMv2MURPzHtiSeeME4//XQjOTnZGDVqlPHGG2+YXVJckhTw9swzz5hdWkJhaG9k/fWvfzXOP/98IyUlxTj33HONFStWmF1SXKurqzMKCgqM008/3UhNTTXOPPNM46c//anR2NhodmlxYePGjQF/b8+cOdMwDO/w3nvvvdfIyMgwUlJSjMsvv9zYtWtXp1/PZhhMVwcAAMyTkH1GAACAdRBGAACAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBU/x8fyFNZC220rwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "ax.errorbar(df.X,df.Y,yerr=df.Y_stdev,fmt=\"o\",color=\"black\")\n", - "\n", - "# Plot 100 fits sampled from posterior\n", - "for i in range(0,len(f.samples),90):\n", - " ax.plot(df.X,mw.model(f.samples[i,:]),\"-\",color='red',alpha=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tests/examples/generate-test-data.ipynb b/tests/examples/generate-test-data.ipynb deleted file mode 100644 index 13fa1a0..0000000 --- a/tests/examples/generate-test-data.ipynb +++ /dev/null @@ -1,164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.optimize\n", - "import json, pickle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Write test data\n", - "

WARNING: this will update test files.

\n", - "\n", - "This may cause tests that depend on fit-values to fail. To run, uncomment `write_new_test_data()` below." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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LuHFF18kPz+fI444grFjxzJkyJAG+z377LMsWLCABQsW8Pbbb/PDH/6Qt99+e/v2l19+mb333rvBayZPnszo0aO56qqrmDx5MpMnT+aWW27ZIYY//OEPrF69mm7dGk5ydf/99zN06FB69040za+I5DolgiT4+9//zsCBAxkwYAAAZ599NjNmzNghEcyYMYPzzjsPM2PEiBFs2LCBlStX0qtX4lp7M2bMYNasWQCcf/75jBo1aodEMHbsWDZt2sTw4cO5+uqrmTdvHrvuuiuFhYWUl5cTi8XYeeedefPNN9l5552T++ZFJONlXyL4r/+C999P7jEPOQTuuCPh5uXLl9O375fVMvLz8xt8029uv+XLl9OrVy/MjBNPPBEz4wc/+AHFxcUAfPbZZ9sTRa9evVi1atUOx505cya77ror78ff9/XXXw/AGWecwZQpU7jtttsaNDeJiNSXfYkgAk3N6dDUqJzm9nv99dfp3bs3q1at4oQTTmDw4MEce+yxyQ9WRKSR7EsEzXxzD0t+fj7Lln1ZUbuysrLJNvnm9qv7uc8++3D66afz97//nWOPPZZ99913e/PRypUr2WeffUJ+NyKSazRqKAmOOOIIFixYwOLFi9m6dSvTp09n7NixO+w3duxYHnzwQdydt956iz322INevXqxadMm/vWvfwGwadMmXnjhBYYOHbr9NQ888AAADzzwAOPGjWtTbLvtttv2Y0v20OgYSabsuyKIQJcuXZgyZQonnXQSNTU1XHTRRRx00EEATJs2DYAJEyZwyimn8MwzzzBw4EDy8vL44x//CAT9AKeffjoA1dXVnHvuuYwZMwaAq666irPOOot7772Xfv368dhjj7UptgsuuIAJEyaos1hEEgptzuKwNDUxzbx58/jqV78aUUSZS59b5qq7GqgbUSYBfS6Jmdkcd29y1IiahkREcpwSgYhIjlMiEJGUUkd3+lEiEBHJcUoEIpIVysrKeOutt5g9ezaFhYWUlZVFHVLGyNlEoMtTkfZJx/87ZWVlFBcXU1VVBUBFRQXFxcVKBq2Us4kgDC2Vog6zDLVILps0aRKbN29usG7z5s1MmjQpoogyS04mgjAuIetKUT/77LN88sknPPLII3zyyScN9qlfhrq0tJQf/vCHDba//PLLvP/++9S/T6KuDPWCBQsYPXp0wrkORNJFFFcMS5cubdN6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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "def model(K,X):\n", - " \"\"\"\n", - " Simple, saturating binding curve.\n", - "\n", - " K: association constant\n", - " X: vector of X concentrations\n", - " \"\"\"\n", - "\n", - " return K*X/(1 + K*X)\n", - "\n", - "def model_residual(params,X,Y):\n", - " \"\"\"\n", - " Residual for fitting a simple saturating binding curve.\n", - " \n", - " params: array with fit parameters: (K,) in this case\n", - " X: vector of X concentrations\n", - " Y: vector of Y observations\"\"\"\n", - " \n", - " return model(params[0],X) - Y\n", - " \n", - " \n", - "def write_new_test_data(K=0.5,\n", - " guess=1,\n", - " noise=0.05,\n", - " y_stdev=0.05,\n", - " X_concs=np.arange(0,10,0.25),\n", - " prefix=\"binding-curves\"):\n", - " \n", - " name = f\"{noise:.3f}\"\n", - "\n", - " json_dict = {}\n", - " json_dict[\"input_params\"] = (K,)\n", - " json_dict[\"guesses\"] = (guess,)\n", - " \n", - " # Create fake data with noise and write out\n", - " noise = np.random.normal(0,noise,len(X_concs))\n", - " frac_sat = model(K,X_concs) + noise\n", - " Y_stdev = np.abs(noise)\n", - " residual = frac_sat - model(K,X_concs)\n", - " weighted_residual = residual/Y_stdev\n", - " sigma2 = Y_stdev**2\n", - " \n", - " df = pd.DataFrame({\"X\":X_concs,\n", - " \"Y\":frac_sat,\n", - " \"Y_stdev\":Y_stdev,\n", - " \"residual\":residual,\n", - " \"weighted_residual\":weighted_residual})\n", - " \n", - " csv_out = f\"{prefix}_noise-{name}.csv\"\n", - " df.to_csv(csv_out)\n", - " json_dict[\"test_file\"] = csv_out\n", - "\n", - " # Record log likelihood\n", - " json_dict[\"ln_like\"] = -0.5*(np.sum((frac_sat - model(K,X_concs))**2/sigma2 + np.log(sigma2)))\n", - " \n", - " \n", - " # Fit model to data\n", - " fit = scipy.optimize.least_squares(model_residual,\n", - " [guess],\n", - " kwargs={\"X\":X_concs,\"Y\":frac_sat})\n", - " json_dict[\"fit_params\"] = tuple(fit.x)\n", - " \n", - " # Create plot \n", - " fig, ax = plt.subplots()\n", - " \n", - " ax.errorbar(df.X,df.Y,yerr=df.Y_stdev,fmt=\"o\",color=\"black\",label=name)\n", - " ax.plot(df.X,model(fit.x[0],df.X),\"-\",color=\"red\",label=f\"{name} fit\")\n", - " ax.legend()\n", - " ax.set_xlabel(\"X\")\n", - " ax.set_ylabel(\"Y\")\n", - " ax.set_title(f\"{prefix}\")\n", - " fig.savefig(f\"{prefix}.pdf\")\n", - " \n", - " plt.show()\n", - " \n", - " json.dump(json_dict,open(f\"{prefix}.json\",\"w\"))\n", - " \n", - "\n", - "write_new_test_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tests/examples/binding-curves.json b/tests/test_data/binding_curve/binding-curves.json similarity index 100% rename from tests/examples/binding-curves.json rename to tests/test_data/binding_curve/binding-curves.json diff --git a/tests/examples/binding-curves.pdf b/tests/test_data/binding_curve/binding-curves.pdf similarity index 100% rename from tests/examples/binding-curves.pdf rename to tests/test_data/binding_curve/binding-curves.pdf diff --git a/tests/test_data/binding_curve/binding-curves_noise-0.050.csv b/tests/test_data/binding_curve/binding-curves_noise-0.050.csv new file mode 100644 index 0000000..e875640 --- /dev/null +++ b/tests/test_data/binding_curve/binding-curves_noise-0.050.csv @@ -0,0 +1,41 @@ +,x,y_obs,y_std,residual,weighted_residual +0,0.0,0.0106966811559542,0.0106966811559542,-0.0106966811559542,-1.0 +1,0.25,0.1583333707190824,0.0472222596079713,-0.0472222596079713,-1.0 +2,0.5,0.2098487299716036,0.0098487299716036,-0.0098487299716036,-1.000000000000001 +3,0.75,0.2178645457390059,0.0548627269882667,0.0548627269882667,1.0 +4,1.0,0.2689946874173954,0.0643386459159378,0.0643386459159378,1.0 +5,1.25,0.4066294920252474,0.0220141074098627,-0.0220141074098627,-1.0000000000000009 +6,1.5,0.3720453488089656,0.0565260797624628,0.0565260797624628,1.0 +7,1.75,0.5226769545518608,0.0560102878851941,-0.0560102878851941,-0.9999999999999996 +8,2.0,0.4848411599533046,0.0151588400466953,0.0151588400466953,0.9999999999999988 +9,2.25,0.5099292313035274,0.0194825334023549,0.0194825334023549,0.999999999999998 +10,2.5,0.511245762023063,0.0443097935324925,0.0443097935324925,0.9999999999999992 +11,2.75,0.5021067336398095,0.0768406347812431,0.0768406347812431,0.9999999999999996 +12,3.0,0.5993711062265129,0.000628893773487,0.000628893773487,0.9999999999999728 +13,3.25,0.700608928617404,0.0815613095697849,-0.0815613095697849,-0.9999999999999996 +14,3.5,0.5570026487237468,0.0793609876398894,0.0793609876398895,1.0000000000000004 +15,3.75,0.5905511476237522,0.0616227654197261,0.0616227654197261,0.9999999999999998 +16,4.0,0.7135078180848959,0.0468411514182293,-0.0468411514182293,-1.0 +17,4.25,0.66036596877094,0.01963403122906,0.01963403122906,1.0000000000000022 +18,4.5,0.7604158088388152,0.0681081165311229,-0.0681081165311229,-1.0000000000000002 +19,4.75,0.7175399158502814,0.0138362121465777,-0.0138362121465777,-0.9999999999999992 +20,5.0,0.7074087214145744,0.0068769928711398,0.0068769928711398,1.0000000000000042 +21,5.25,0.7975559931944572,0.0734180621599744,-0.0734180621599744,-1.0000000000000002 +22,5.5,0.6727517940370945,0.0605815392962387,0.0605815392962387,1.0000000000000009 +23,5.75,0.8341700668484691,0.0922345829775013,-0.0922345829775013,-1.0 +24,6.0,0.6980803369045364,0.0519196630954636,0.0519196630954635,0.9999999999999992 +25,6.25,0.6561207266641882,0.1014550309115694,0.1014550309115693,0.9999999999999994 +26,6.5,0.8081649918183355,0.0434591094653942,-0.0434591094653943,-1.000000000000001 +27,6.75,0.8302227391506498,0.0587941677220783,-0.0587941677220783,-0.9999999999999998 +28,7.0,0.8264936569572588,0.0487158791794811,-0.048715879179481,-0.9999999999999992 +29,7.25,0.843324775646321,0.0595409918625372,-0.0595409918625372,-1.0000000000000004 +30,7.5,0.73916830633667,0.0503053778738563,0.0503053778738563,0.9999999999999998 +31,7.75,0.8058369858160012,0.0109651909442063,-0.0109651909442063,-1.0000000000000029 +32,8.0,0.8764705240885923,0.0764705240885922,-0.0764705240885922,-0.9999999999999998 +33,8.25,0.7328114120602407,0.0720666367202472,0.0720666367202471,0.9999999999999994 +34,8.5,0.8374414089232748,0.0279175993994652,-0.0279175993994652,-1.0000000000000018 +35,8.75,0.8409324729668872,0.0269789845947941,-0.0269789845947941,-1.0000000000000009 +36,9.0,0.7973145344749395,0.0208672837068787,0.0208672837068787,1.000000000000001 +37,9.25,0.8024697195277646,0.0197525026944575,0.0197525026944576,1.0000000000000009 +38,9.5,0.8251316824559359,0.0009552740658031,0.0009552740658032,1.0000000000000395 +39,9.75,0.8089701736588916,0.0208170603836616,0.0208170603836616,1.0 diff --git a/tests/test_data/spreadsheets/bad-fixed.xlsx b/tests/test_data/spreadsheets/bad-fixed.xlsx new file mode 100644 index 0000000..473e108 Binary files /dev/null and b/tests/test_data/spreadsheets/bad-fixed.xlsx differ diff --git a/tests/test_data/spreadsheets/bad-guess.xlsx b/tests/test_data/spreadsheets/bad-guess.xlsx new file mode 100644 index 0000000..568809a Binary files /dev/null and b/tests/test_data/spreadsheets/bad-guess.xlsx differ diff --git a/tests/test_data/spreadsheets/basic-spreadsheet.csv b/tests/test_data/spreadsheets/basic-spreadsheet.csv new file mode 100644 index 0000000..6a130d2 --- /dev/null +++ b/tests/test_data/spreadsheets/basic-spreadsheet.csv @@ -0,0 +1,4 @@ +name,guess,lower_bound,upper_bound,prior_mean,prior_std,fixed +K1,1.00E+07,,,1.00E+06,10,TRUE +K2,1.00E-06,,,,,FALSE +K3,1.00E+00,-1,2,1.00E-06,1000,FALSE diff --git a/tests/test_data/spreadsheets/basic-spreadsheet.tsv b/tests/test_data/spreadsheets/basic-spreadsheet.tsv new file mode 100644 index 0000000..2871a12 --- /dev/null +++ b/tests/test_data/spreadsheets/basic-spreadsheet.tsv @@ -0,0 +1,4 @@ +name guess lower_bound upper_bound prior_mean prior_std fixed +K1 1.00E+07 1.00E+06 10 TRUE +K2 1.00E-06 FALSE +K3 1.00E+00 -1 2 1.00E-06 1000 FALSE diff --git a/tests/test_data/spreadsheets/basic-spreadsheet.txt b/tests/test_data/spreadsheets/basic-spreadsheet.txt new file mode 100644 index 0000000..6a130d2 --- /dev/null +++ b/tests/test_data/spreadsheets/basic-spreadsheet.txt @@ -0,0 +1,4 @@ +name,guess,lower_bound,upper_bound,prior_mean,prior_std,fixed +K1,1.00E+07,,,1.00E+06,10,TRUE +K2,1.00E-06,,,,,FALSE +K3,1.00E+00,-1,2,1.00E-06,1000,FALSE diff --git a/tests/test_data/spreadsheets/basic-spreadsheet.xlsx b/tests/test_data/spreadsheets/basic-spreadsheet.xlsx new file mode 100644 index 0000000..d730624 Binary files /dev/null and b/tests/test_data/spreadsheets/basic-spreadsheet.xlsx differ