We are pleased to announce KrylovKit v0.8. The major new feature of this release is the implementation of fully functional and general ChainRulesCore.rrule
definitions for linsolve
, eigsolve
and svdsolve
.
In fact, for eigsolve
and svdsolve
, two different implementations of the pullback are implemented. The first implementation is based on solving a number of linear problems, equal to the number of requested eigenvalues / singular values. The second implementation, which to the best of our knowledge has not been described in the literature, instead solves the adjoint problem as a single eigenvalue problem. We are currently preparing a draft presenting the details of this approach. Which algorithm/implementation is chosen can be controlled using a new alg_rrule
keyword to those methods, as described in more detail in the KrylovKit documentation. This interface can also be used to configure other parameters for solving the adjoint problem.
While the implementations are well tested for correctness, we are eager to receive feedback about the performance and about the interface in real-world problems. We will also do some more benchmarking, in particular comparing the different rrule
implementations, on our side. While the initial plan was to release this as KrylovKit v1, we want to reserve the ability to make breaking changes to the interface if the current strategy has unforeseen limitations. In addition, we also plan to add rrule
definitions for exponentiate
, expintegrator
and geneigsolve
in the future.
Another small change in this release is that the hermiticity check in algorithms using Lanczos iterations now produces a warning rather than an error, so that the calculation can proceed if you are confident that the imaginary component of the diagonal matrix element is due to numerical precision errors. Finally, there is a new method called realeigsolve
(only applicable in the so-called “expert mode” call syntax), which can be used if you are solving a nonsymmetric real eigenvalue problem, and you know that the requested eigenvalues are real, and therefore also their associated eigenvectors. In that case, the result will be returned using real arithmetic only.