def test_posv(self): if not cupy.cusolver.check_availability('potrsBatched'): pytest.skip('potrsBatched is not available') a = self._create_posdef_matrix(cupy, self.shape, self.dtype) n = a.shape[-1] identity_matrix = cupy.eye(n, dtype=a.dtype) b = cupy.empty(a.shape, a.dtype) b[...] = identity_matrix with cupyx.errstate(linalg='ignore'): with pytest.raises(cupy.cuda.cusolver.CUSOLVERError): lapack.posv(a, b)
def invh(a): """Compute the inverse of a Hermitian matrix. This function computes a inverse of a real symmetric or complex hermitian positive-definite matrix using Cholesky factorization. If matrix ``a`` is not positive definite, Cholesky factorization fails and it raises an error. Args: a (cupy.ndarray): Real symmetric or complex hermitian maxtix. Returns: cupy.ndarray: The inverse of matrix ``a``. """ _util._assert_cupy_array(a) _util._assert_nd_squareness(a) # TODO: Remove this assert once cusolver supports nrhs > 1 for potrsBatched _util._assert_rank2(a) n = a.shape[-1] identity_matrix = cupy.eye(n, dtype=a.dtype) b = cupy.empty(a.shape, a.dtype) b[...] = identity_matrix return lapack.posv(a, b)
def test_posv(self, xp, dtype): # TODO: cusolver does not support nrhs > 1 for potrsBatched if len(self.shape) > 2 and self.nrhs and self.nrhs > 1: pytest.skip('cusolver does not support nrhs > 1 for potrsBatched') a = self._create_posdef_matrix(xp, self.shape, dtype) b_shape = list(self.shape[:-1]) if self.nrhs is not None: b_shape.append(self.nrhs) b = testing.shaped_random(b_shape, xp, dtype=dtype) if xp == cupy: return lapack.posv(a, b) else: return numpy.linalg.solve(a, b)
def invh(a): """Compute the inverse of a Hermitian matrix. This function computes a inverse of a real symmetric or complex hermitian positive-definite matrix using Cholesky factorization. If matrix ``a`` is not positive definite, Cholesky factorization fails and it raises an error. Args: a (cupy.ndarray): Real symmetric or complex hermitian maxtix. Returns: cupy.ndarray: The inverse of matrix ``a``. """ _util._assert_cupy_array(a) # TODO: Use `_assert_stacked_2d` instead, once cusolver supports nrhs > 1 # for potrsBatched _util._assert_2d(a) _util._assert_stacked_square(a) b = _util.stacked_identity_like(a) return lapack.posv(a, b)