This release is a big one as it includes the cumulative work over a period of 1 1/2 years. It is planned to be the last release before version 1.0.0 where we expect to land a number of exciting new features.
What follows are the **highlights** of the release. For a more detailed list of all changes, please refer to [the release notes in the documentation](https://odlgroup.github.io/odl/release_notes.html).
Native multi-indexing of ODL space elements
The `DiscreteLpElement` and `Tensor` (renamed from `FnBaseVector`) data structures now natively support almost all kinds of Numpy "fancy" indexing.
At the same time, the spaces `DiscreteLp` and `Tensorspace` (renamed from `FnBase`) have more advanced indexing capabilities as well. Up to few exceptions, `elem[indices] in space[indices]` is always fulfilled.
Alongside, `ProductSpace` and its elements also support more advanced indexing, in particular in the case of power spaces.
Furthermore, integration with Numpy has been further improved with the implementation of the `__array_ufunc__` interface. This allows to transparently use ODL objects in calls to Numpy UFuncs, e.g., `np.cos(odl_obj, out=odl_obj)` or `np.add.reduce(odl_in, axis=0, out=odl_out)` — both these examples were not possible with the `__array__` and `__array_wrap__` interfaces.
Unfortunately, this changeset makes the `odlcuda` plugin unusable since it only supports linear indexing. A much more powerful replacement based on CuPy will be added in version 1.0.0.
Integration with deep learning frameworks
ODL is now integrated with three major deep learning frameworks: TensorFlow, PyTorch and Theano. In particular, ODL `Operator` and `Functional` objects can be used as layers in neural networks, with support for automatic differentiation and backpropagation. This makes a lot of (inverse) problems that ODL can handle well, e.g., tomography, accessible to the computation engines of the deep learning field, and opens up a wide range of possibilities to combine the two.
The implementation of this functionality and examples of its usage can be found in the packages [`tensorflow`](https://github.com/odlgroup/odl/tree/master/odl/contrib/tensorflow), [`torch`](https://github.com/odlgroup/odl/tree/master/odl/contrib/torch) and [`theano`](https://github.com/odlgroup/odl/tree/master/odl/contrib/theano) in the `odl.contrib` sub-package (see below).
New `contrib` sub-package
The core ODL library is intended to stay focused on general-purpose classes and data structures, and good code quality is a major goal. This implies that contributions need to undergo scrutiny in a review process, and that some contributions might not be a good fit if they are too specific for certain applications.
For this reason, we have created a new [`contrib`](https://github.com/odlgroup/odl/tree/master/odl/contrib) sub-package that is intended for exactly this kind of code. As of writing this, `contrib` already contains a number of highly useful modules:
- [`datasets`](https://github.com/odlgroup/odl/tree/master/odl/contrib/datasets): Loaders and utility code for publicly available datasets (currently FIPS CT, Mayo clinic human CT, Tu Graz MRI and some image data)
- [`fom`](https://github.com/odlgroup/odl/tree/master/odl/contrib/fom): Implementations of Figures-of-Merit for image quality assessment
- [`mrc`](https://github.com/odlgroup/odl/tree/master/odl/contrib/mrc): Reader and writer for the MRC 2014 data format in electron microscopy
- [`param_opt`](https://github.com/odlgroup/odl/tree/master/odl/contrib/param_opt): Optimization strategies for method hyperparameters
- [`pyshearlab`](https://github.com/odlgroup/odl/tree/master/odl/contrib/pyshearlab): Integration of the `pyshearlab` Python library for shearlet decomposition and analysis
- [`shearlab`](https://github.com/odlgroup/odl/tree/master/odl/contrib/shearlab): Integration of the `Shearlab.jl` Julia shearlet library
- [`solvers`](https://github.com/odlgroup/odl/tree/master/odl/contrib/solvers): More exotic functionals and optimization methods than in the core ODL library
- [`tomo`](https://github.com/odlgroup/odl/tree/master/odl/contrib/tomo): Vendor- or application-specific geometries (currently Elekta ICON and XIV)
- [`tensorflow`](https://github.com/odlgroup/odl/tree/master/odl/contrib/tensorflow): Integration of ODL with TensorFlow
- [`theano`](https://github.com/odlgroup/odl/tree/master/odl/contrib/theano): Integration of ODL with Theano
- [`torch`](https://github.com/odlgroup/odl/tree/master/odl/contrib/torch): Integration of ODL with PyTorch
Overhaul of tomographic geometries
The classes for representing tomographic geometries in `odl.tomo` have undergone a major update, resulting in a consistent definition of coordinate systems across all cases, proper documentation, vectorization and broadcasting semantics in all methods that compute vectors, and significant speed-up of backprojection due to better axis handling.
Additionally, factory functions `cone_beam_geometry` and `helical_geometry` have been added as a simpler and more accessible way to create cone beam geometries.