This new stable release introduces several important features.
First we now have an OpenMP compatible exact ot solver in `ot.emd`. The OpenMP version is used when the parameter `numThreads` is greater than one and can lead to nice speedups on multi-core machines.
Second we have introduced a backend mechanism that allows to use standard POT function seamlessly on Numpy, Pytorch and Jax arrays. Other backends are coming but right now POT can be used seamlessly for training neural networks in Pytorch. Notably we propose the first differentiable computation of the exact OT loss with `ot.emd2` (can be differentiated w.r.t. both cost matrix and sample weights), but also for the classical Sinkhorn loss with `ot.sinkhorn2`, the Wasserstein distance in 1D with `ot.wasserstein_1d`, sliced Wasserstein with `ot.sliced_wasserstein_distance` and Gromov-Wasserstein with `ot.gromov_wasserstein2` . Examples of how this new feature can be used are now available in the documentation where the Pytorch backend is used to estimate a [minimal Wasserstein estimator](https://PythonOT.github.io/auto_examples/backends/plot_unmix_optim_torch.html), a [Generative Network (GAN)](https://PythonOT.github.io/auto_examples/backends/plot_wass2_gan_torch.html), for a [sliced Wasserstein gradient flow](https://PythonOT.github.io/auto_examples/backends/plot_sliced_wass_grad_flow_pytorch.html) and [optimizing the Gromov-Wassersein distance](https://PythonOT.github.io/auto_examples/backends/plot_optim_gromov_pytorch.html). Note that the Jax backend is still in early development and quite slow at the moment, we strongly recommend for Jax users to use the [OTT toolbox](https://github.com/google-research/ott) when possible. As a result of this new feature, the old `ot.gpu` submodule is now deprecated since GPU implementations can be done using GPU arrays on the torch backends.
Other novel features include implementation for [Sampled Gromov Wasserstein and Pointwise Gromov Wasserstein](https://PythonOT.github.io/auto_examples/gromov/plot_gromov.html#compute-gw-with-a-scalable-stochastic-method-with-any-loss-function), Sinkhorn in log space with `method='sinkhorn_log'`, [Projection Robust Wasserstein](https://PythonOT.github.io/gen_modules/ot.dr.html?highlight=robust#ot.dr.projection_robust_wasserstein), and [deviased Sinkorn barycenters](https://PythonOT.github.ioauto_examples/barycenters/plot_debiased_barycenter.html).
This release will also simplify the installation process. We have now a `pyproject.toml` that defines the build dependency and POT should now build even when cython is not installed yet. Also we now provide pe-compiled wheels for linux `aarch64` that is used on Raspberry PI and android phones and for MacOS on ARM processors.
Finally POT was accepted for publication in the Journal of Machine Learning Research (JMLR) open source software track and we ask the POT users to cite [this paper](https://www.jmlr.org/papers/v22/20-451.html) from now on. The documentation has been improved in particular by adding a "Why OT?" section to the quick start guide and several new examples illustrating the new features. The documentation now has two version : the stable version [https://pythonot.github.io/](https://pythonot.github.io/) corresponding to the last release and the master version [https://pythonot.github.io/master](https://pythonot.github.io/master) that corresponds to the current master branch on GitHub.
As usual, we want to thank all the POT contributors (now 37 people have contributed to the toolbox). But for this release we thank in particular Nathan Cassereau and Kamel Guerda from the AI support team at [IDRIS](http://www.idris.fr/) for their support to the development of the
backend and OpenMP implementations.
New features
- OpenMP support for exact OT solvers (PR 260)
- Backend for running POT in numpy/torch + exact solver (PR 249)
- Backend implementation of most functions in `ot.bregman` (PR 280)
- Backend implementation of most functions in `ot.optim` (PR 282)
- Backend implementation of most functions in `ot.gromov` (PR 294, PR 302)
- Test for arrays of different type and device (CPU/GPU) (PR 304, 303)
- Implementation of Sinkhorn in log space with `method='sinkhorn_log'` (PR 290)
- Implementation of regularization path for L2 Unbalanced OT (PR 274)
- Implementation of Projection Robust Wasserstein (PR 267)
- Implementation of Debiased Sinkhorn Barycenters (PR 291)
- Implementation of Sampled Gromov Wasserstein and Pointwise Gromov Wasserstein
(PR 275)
- Add `pyproject.toml` and build POT without installing cython first (PR 293)
- Lazy implementation in log space for sinkhorn on samples (PR 259)
- Documentation cleanup (PR 298)
- Two up-to-date documentations [for stable
release](https://PythonOT.github.io/) and for [master branch](https://pythonot.github.io/master/).
- Building wheels on ARM for Raspberry PI and smartphones (PR 238)
- Update build wheels to new version and new pythons (PR 236, 253)
- Implementation of sliced Wasserstein distance (Issue 202, PR 203)
- Add minimal build to CI and perform pep8 test separately (PR 210)
- Speedup of tests and return run time (PR 262)
- Add "Why OT" discussion to the documentation (PR 220)
- New introductory example to discrete OT in the documentation (PR 191)
- Add templates for Issues/PR on Github (PR181)
Closed issues
- Debug Memory leak in GAN example (254)
- DEbug GPU bug (Issue 284, 287, PR 288)
- set_gradients method for JAX backend (PR 278)
- Quicker GAN example for CircleCI build (PR 258)
- Better formatting in Readme (PR 234)
- Debug CI tests (PR 240, 241, 242)
- Bug in Partial OT solver dummy points (PR 215)
- Bug when Armijo linesearch (Issue 184, 198, 281, PR 189, 199, 286)
- Bug Barycenter Sinkhorn (Issue 134, PR 195)
- Infeasible solution in exact OT (Issues 126,93, PR 217)
- Doc for SUpport Barycenters (Issue 200, PR 201)
- Fix labels transport in BaseTransport (Issue 207, PR 208)
- Bug in `emd_1d`, non respected bounds (Issue 169, PR 170)
- Removed Python 2.7 support and update codecov file (PR 178)
- Add normalization for WDA and test it (PR 172, 296)
- Cleanup code for new version of `flake8` (PR 176)
- Fixed requirements in `setup.py` (PR 174)
- Removed specific MacOS flags (PR 175)