probabilistic-numerics/probnum

Matrix Property System for `LinearOperator`s

marvinpfoertner opened this issue · 0 comments

Is your feature request related to a problem? Please describe.
Currently, a LinearOperator is unaware of any mathematical properties (e.g. symmetry, positive-definiteness, orthogonality) of the matrix it represents.
However, many algorithms acting on these matrices can be more efficient or in some cases only become tractable if these properties are known.

Give an example use case.

  • Inversion of a positive-definite LinearOperator should be computed by Cholesky factorization
  • Inversion of an orthogonal LinearOperator should be computed by multiplying with the transpose

Describe the solution you'd like.

  • add cached properties to the LinearOperator which use ternary logic to indicate whether the matrix has a particular property
    • return True if the matrix has the property
    • return False if the matrix does not have the property
    • return None if it is not known whether the matrix has the property
  • infer matrix properties after operations like addition and scalar multiplication
  • add fallback checks to the LinearOperator base class
  • minimal set of properties
    • is_invertible
    • is_symmetric
    • is_positive_{semi}definite
    • is_{upper,lower}_triangular
    • is_orthogonal
    • is_diagonal
  • additional properties
    • is_banded
    • is_tridiagonal
    • is_toeplitz
    • is_upper_hessenberg
  • for symmetric operators, use numpy.linalg.eigvalsh as LinearOperator.eigvals fallback and test order of eigenvalues

Additional context
Some of these properties are needed for #569