New Features
- Make `SpinReversalTransformComposite` nonblocking.
- Add a `seed` parameter to the constructor of `SpinReversalTransformComposite`.
- Improve the performance of the `Presolver` constructor by avoiding an unnecessary copy.
- Raise an `InvalidModelError` from `Presolver` when given a model with `float("nan")` bounds.
- Raise an `InvalidModelError` from `Presolver` when given a model that has a constraint with `float("nan")` weight or rhs.
- Add C++ `Presolver::restore()` method for restoring samples.
- Add domain propagation to `dwave::presolve::Presolver`.
- Add removing small biases to `dwave::presolve::Presolver`.
- Support `Numpy>=1.17.3`, previously required `NumPy>=1.20.0`.
- Add a presolve normalization step to replace inf biases, bounds, offsets, right-hand-sides, etc with a large finite number.
- A newly instantiated `Presolver` will now have presolve techniques loaded by default.
- Add `TechniqueFlags` enum to represent different presolve techniques.
- Add C++ `dwave::presolve::Presolver::add_techniques()`, `dwave::presolve::Presolver::set_techniques()`, and `dwave::presolve::Presolver::techniques()` methods for manipulating the presolve techniques that will be used by the presolver.
- Update `Presolver.apply()`, `Presolver.normalize()`, and `Presolver.presolve()` to release Python\'s global interpreter lock (GIL).
- Reimplement the C++ `Presolver` using the PImpl pattern. This will make it easier to maintain binary compatibility going forward. See [\89](https://github.com/dwavesystems/dwave-preprocessing/issues/89).
- Add `dwave::presolve::Presolve::normalize()` C++ method.
- Add `dwave::presolve::Presolve::presolve()` C++ method.
- Raise an `InvalidModelError` from `Presolver` when given a model with `float("nan")` biases.
- Add `Presolver.feasibility()` method to return a `Feasibility` enum. This can be used to test the feasibility of presolved models.
- Add `time_limit_s` keyword argument to `Presolver.presolve()`.
- Add `time_limit` argument to C++ method `dwave::presolve::Presolver::presolve()`.
- Add `Presolver.normalize()` method. See [\78](https://github.com/dwavesystems/dwave-preprocessing/issues/78).
- Add `Presolver.presolve()` method. See [\78](https://github.com/dwavesystems/dwave-preprocessing/issues/78).
Upgrade Notes
- The wrapped C++ `dwave::presolve::Presolver` held by `cyPresolver.cpppresolver` is now stored as a pointer.
- Remove C++ `PostSolver` class. See [\90](https://github.com/dwavesystems/dwave-preprocessing/issues/90).
- A newly instantiated `Presolver` will now have presolve techniques loaded by default. Previously it would have no techniques loaded and the user would need to also call `Presolver.load_default_presolvers()`.
- Remove the C++ `dwave::presolve::Presolver::load_default_presolvers()` method.
- The C++ `Presolver` no longer has a header-only implementation.
- Raise an `InvalidModelError` rather than a `RuntimeError` when presolving a detached model.
- Change `Presolver` to no longer raise an `InfeasibleModelError` error for infeasible models.
- Remove the `InfeasibleModelError`.
Deprecation Notes
- Drop support for Python 3.7.
- Deprecate `Presolver.load_default_techniques()`. Use `Presolver.set_techniques(TechniqueFlags.Default)` instead.