linear_operator icon indicating copy to clipboard operation
linear_operator copied to clipboard

[Docs] Example in readme is giving `NotPSDError`

Open jakee417 opened this issue 1 year ago • 1 comments

📚 Documentation/Examples

** Is documentation wrong? **

In readme example for LinearOperator: https://github.com/cornellius-gp/linear_operator?tab=readme-ov-file#with-linearoperator

from linear_operator.operators import DiagLinearOperator, LowRankRootLinearOperator
# C = torch.randn(1000, 20)
# d = torch.randn(1000)
# b = torch.randn(1000)
A = LowRankRootLinearOperator(C) + DiagLinearOperator(d)  # represents C C^T + diag(d)
torch.linalg.solve(A, b)  # computes A^{-1} b efficiently!

will give

NotPSDError: Matrix not positive definite after repeatedly adding jitter up to 1.0e-06.

** Think you know how to fix the docs? ** (If so, we'd love a pull request from you!)

from linear_operator.operators import DiagLinearOperator, LowRankRootLinearOperator
C = torch.randn(1000, 20)
d = torch.ones(1000) * 1e-9
b = torch.randn(1000)
A = LowRankRootLinearOperator(C) + DiagLinearOperator(d)
torch.linalg.solve(A, b)

should solve the issue

(Link to LinearOperator documentation)

jakee417 avatar Aug 25 '24 19:08 jakee417

Hmm yeah d should just not be sampled from a normal distribution - you'll end up adding negative values to the diagonal. Something like d = 1e-9 + torch.rand(1000) should be safe.

Balandat avatar Sep 01 '24 16:09 Balandat