README.md
c2e85cc8
 # ![][logo] adaptive
73559b62
 
95d3fa72
 [![PyPI](https://img.shields.io/pypi/v/adaptive.svg)](https://pypi.python.org/pypi/adaptive)
 [![Conda](https://anaconda.org/conda-forge/adaptive/badges/installer/conda.svg)](https://anaconda.org/conda-forge/adaptive)
 [![Downloads](https://anaconda.org/conda-forge/adaptive/badges/downloads.svg)](https://anaconda.org/conda-forge/adaptive)
43392f41
 [![pipeline status](https://gitlab.kwant-project.org/qt/adaptive/badges/master/pipeline.svg)](https://gitlab.kwant-project.org/qt/adaptive/pipelines)
13ba989c
 [![DOI](https://zenodo.org/badge/113714660.svg)](https://zenodo.org/badge/latestdoi/113714660)
a14df7b3
 [![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/python-adaptive/adaptive/master?filepath=learner.ipynb)
6d3d8965
 [![Join the chat at https://gitter.im/python-adaptive/adaptive](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/python-adaptive/adaptive)
94a6dabe
 
d45f0ed9
 **Tools for adaptive parallel sampling of mathematical functions.**
73559b62
 
7f9dd984
 `adaptive` is an [open-source](LICENSE) Python library designed to make adaptive parallel function evaluation simple.
 With `adaptive` you just supply a function with its bounds, and it will be evaluated at the "best" points in parameter space.
 With just a few lines of code you can evaluate functions on a computing cluster, live-plot the data as it returns, and fine-tune the adaptive sampling algorithm.
73559b62
 
7f9dd984
 Check out the `adaptive` [example notebook `learner.ipynb`](learner.ipynb) (or run it [live on Binder](https://mybinder.org/v2/gh/python-adaptive/adaptive/master?filepath=learner.ipynb)) to see examples of how to use `adaptive`.
73559b62
 
 
ab6c6118
 **WARNING: `adaptive` is still in a beta development stage**
73559b62
 
 
7f9dd984
 ## Implemented algorithms
d45f0ed9
 The core concept in `adaptive` is that of a *learner*. A *learner* samples
7f9dd984
 a function at the best places in its parameter space to get maximum
 "information" about the function. As it evaluates the function
 at more and more points in the parameter space, it gets a better idea of where
 the best places are to sample next.
fd97829a
 
7f9dd984
 Of course, what qualifies as the "best places" will depend on your application domain!
 `adaptive` makes some reasonable default choices, but the details of the adaptive
 sampling are completely customizable.
fd97829a
 
7f9dd984
 
 The following learners are implemented:
a0ffda2f
 * `Learner1D`, for 1D functions `f: ℝ → ℝ^N`,
 * `Learner2D`, for 2D functions `f: ℝ^2 → ℝ^N`,
cf64f1df
 * `LearnerND`, for ND functions `f: ℝ^N → ℝ^M`,
a0ffda2f
 * `AverageLearner`, For stochastic functions where you want to average the result over many evaluations,
 * `IntegratorLearner`, for when you want to intergrate a 1D function `f: ℝ → ℝ`,
 * `BalancingLearner`, for when you want to run several learners at once, selecting the "best" one each time you get more points.
7f9dd984
 
 In addition to the learners, `adaptive` also provides primitives for running
 the sampling across several cores and even several machines, with built-in support
 for [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html),
 [`ipyparallel`](https://ipyparallel.readthedocs.io/en/latest/)
 and [`distributed`](https://distributed.readthedocs.io/en/latest/).
fd97829a
 
 
9126a700
 ## Examples
8deb7151
 <img src="https://user-images.githubusercontent.com/6897215/38739170-6ac7c014-3f34-11e8-9e8f-93b3a3a3d61b.gif" width='20%'> </img>
9126a700
 <img src="https://user-images.githubusercontent.com/6897215/35219611-ac8b2122-ff73-11e7-9332-adffab64a8ce.gif" width='40%'> </img>
 
 
73559b62
 ## Installation
bffa7dc4
 `adaptive` works with Python 3.6 and higher on Linux, Windows, or Mac, and provides optional extensions for working with the Jupyter/IPython Notebook.
73559b62
 
b7cc6557
 The recommended way to install adaptive is using `conda`:
 ```bash
68b3d12f
 conda install -c conda-forge adaptive
b7cc6557
 ```
 
 `adaptive` is also available on PyPI:
177d4840
 ```bash
d45f0ed9
 pip install adaptive[notebook]
73559b62
 ```
 
b7cc6557
 The `[notebook]` above will also install the optional dependencies for running `adaptive` inside
d45f0ed9
 a Jupyter notebook.
 
73559b62
 
94a6dabe
 ## Development
d45f0ed9
 Clone the repository and run `setup.py develop` to add a link to the cloned repo into your
 Python path:
 ```
 git clone git@github.com:python-adaptive/adaptive.git
 cd adaptive
 python3 setup.py develop
 ```
 
 We highly recommend using a Conda environment or a virtualenv to manage the versions of your installed
 packages while working on `adaptive`.
94a6dabe
 
 In order to not pollute the history with the output of the notebooks, please setup the git filter by executing
 
177d4840
 ```bash
575c299e
 python ipynb_filter.py
94a6dabe
 ```
d45f0ed9
 
94a6dabe
 in the repository.
73559b62
 
 
43392f41
 ## Credits
 We would like to give credits to the following people:
fd97829a
 - Pedro Gonnet for his implementation of [`CQUAD`](https://www.gnu.org/software/gsl/manual/html_node/CQUAD-doubly_002dadaptive-integration.html), "Algorithm 4" as described in "Increasing the Reliability of Adaptive Quadrature Using Explicit Interpolants", P. Gonnet, ACM Transactions on Mathematical Software, 37 (3), art. no. 26, 2010.
a0ffda2f
 - Pauli Virtanen for his `AdaptiveTriSampling` script (no longer available online since SciPy Central went down) which served as inspiration for the [`Learner2D`](adaptive/learner/learner2D.py).
43392f41
 
5b289a4f
 For general discussion, we have a [Gitter chat channel](https://gitter.im/python-adaptive/adaptive). If you find any bugs or have any feature suggestions please file a GitLab [issue](https://gitlab.kwant-project.org/qt/adaptive/issues/new?issue) or submit a [merge request](https://gitlab.kwant-project.org/qt/adaptive/merge_requests).
c2e85cc8
 
b8e989e8
 [logo]: https://gitlab.kwant-project.org/qt/adaptive/uploads/d20444093920a4a0499e165b5061d952/logo.png "adaptive logo"