Search code examples
c++pytorchlibtorch

Pytorch torch.cholesky ignoring exception


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.


Solution

  • 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