def psd_solve_with_chol(node): if node.op == solve: A, b = node.inputs # result is solution Ax=b if is_psd(A): L = cholesky(A) # assume lower triangular factor x = solve_cholesky(L, b) return [x]
def test_mat_mat_lower(self): if not imported_scipy: raise SkipTest("Scipy needed for the SolveCholesky op.") f = function([self.L, self.B], solve_cholesky(self.L, self.B)) reference = scipy.linalg.cho_solve((self.L_mat, True), self.B_mat) result = f(self.L_mat, self.B_mat) numpy.testing.assert_array_almost_equal(result, reference)
def inv_cholesky_as_solve_cholesky(node): if not imported_scipy: return False if isinstance(node.op, (Dot, Dot22)): l, r = node.inputs if l.owner and isinstance(l.owner.op, MatrixInverseCholesky): return [solve_cholesky(l.owner.inputs[0], r)] if r.owner and isinstance(r.owner.op, MatrixInverseCholesky): return [SolveCholesky(lower=False)(r.owner.inputs[0].T, l.T).T]