*November 2021*
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),
ans [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)