import eigenpy

import numpy as np
from scipy.sparse import csc_matrix

dim = 100
A = np.random.rand(dim, dim)
A = (A + A.T) * 0.5 + np.diag(10.0 + np.random.rand(dim))

A = csc_matrix(A)

llt = eigenpy.SimplicialLLT(A)

assert llt.info() == eigenpy.ComputationInfo.Success

L = llt.matrixL()
U = llt.matrixU()

LU = L @ U
assert eigenpy.is_approx(LU.toarray(), A.toarray())

X = np.random.rand(dim, 20)
B = A.dot(X)
X_est = llt.solve(B)
assert eigenpy.is_approx(X, X_est)
assert eigenpy.is_approx(A.dot(X_est), B)

llt.analyzePattern(A)
llt.factorize(A)
permutation = llt.permutationP()