For some matrices on my batch I'm having an exception due the matrix being singular.
L = th.cholesky(Xt.bmm(X))
cholesky_cpu: For batch 51100: U(22,22) is zero, singular U
Since they are few for my use case I would like to ignore the exception and further deal with them. I will set the resulting calculation as nan is it possible somehow?
Actually if I catch
the exception and use continue
still it doesn’t finish the calculation of the rest of the batch.
The same happens in C++ with Pytorch libtorch.
It's not possible to catch the exception according to Pytorch Discuss
forum.
The solution, unfortunately, was to implement my own simple batched cholesky (th.cholesky(..., upper=False)
) and then deal with Nan values using th.isnan
.
import torch as th
# nograd cholesky
def cholesky(A):
L = th.zeros_like(A)
for i in range(A.shape[-1]):
for j in range(i+1):
s = 0.0
for k in range(j):
s = s + L[...,i,k] * L[...,j,k]
L[...,i,j] = th.sqrt(A[...,i,i] - s) if (i == j) else \
(1.0 / L[...,j,j] * (A[...,i,j] - s))
return L