def linsolve(self, A, b): """ Solve linear equation set ``Ax = b`` and returns the solutions in a 1-D array. This function performs both symbolic and numeric factorizations every time, and can be slower than ``Solver.solve``. Parameters ---------- A Sparse matrix b RHS of the equation Returns ------- The solution in a 1-D np array. """ if self.sparselib == 'umfpack': try: umfpack.linsolve(A, b) except ArithmeticError: logger.error('Singular matrix. Case is not solvable') return np.ravel(b) elif self.sparselib == 'klu': try: klu.linsolve(A, b) except ArithmeticError: logger.error('Singular matrix. Case is not solvable') return np.ravel(b) elif self.sparselib in ('spsolve', 'cupy'): ccs = A.CCS size = A.size data = np.array(ccs[2]).reshape((-1,)) indices = np.array(ccs[1]).reshape((-1,)) indptr = np.array(ccs[0]).reshape((-1,)) A = csc_matrix((data, indices, indptr), shape=size) if self.sparselib == 'spsolve': x = spsolve(A, b) return np.ravel(x) elif self.sparselib == 'cupy': # delayed import for startup speed import cupy as cp # NOQA from cupyx.scipy.sparse import csc_matrix as csc_cu # NOQA from cupyx.scipy.sparse.linalg.solve import lsqr as cu_lsqr # NOQA cu_A = csc_cu(A) cu_b = cp.array(np.array(b).reshape((-1,))) x = cu_lsqr(cu_A, cu_b) return np.ravel(cp.asnumpy(x[0]))
def linsolve(self, A, b): try: klu.linsolve(A, b) except ArithmeticError: logger.error('Singular matrix. Case is not solvable') return np.ravel(b)