def update(self, x, y): x = self.phi(x) A_inv_dot_x = sclb.dsymv(1, self.A_inv.T, x) #A_inv_dot_x = np.dot(self.A_inv,x) sclb.dsyr(-1 / (1 + np.dot(x, A_inv_dot_x)), A_inv_dot_x, a=self.A_inv.T, overwrite_a=True) #self.A_inv -= np.outer(A_inv_dot_x, A_inv_dot_x) sclb.dsymv(-(np.dot(self.w, x) - y), self.A_inv.T, x, beta=1, y=self.w, overwrite_y=True)
def cholesky_grad_python(g): dL = anp.tril(g) dL[-1,-1] /= 2 * L[-1,-1] for k in range(N-2, -1, -1): dL[k+1:,k] -= dsymv(1., dL[k+1:,k+1:], L[k+1:,k], lower=True) dL[k+1:,k] -= anp.diag(dL[k+1:,k+1:]) * L[k+1:,k] dL[k+1:,k] /= L[k,k] dL[k,k] -= anp.dot(dL[k+1:,k], L[k+1:,k]) dL[k,k] /= 2 * L[k,k] return (dL + dL.T)/2.
def cholesky_grad(g): dL = onp.tril(g) dL[...,-1,-1] /= 2 * L[...,-1,-1] for k in range(N-2, -1, -1): dL[...,k+1:,k] -= dsymv(1., dL[...,k+1:,k+1:], L[...,k+1:,k], lower=True) dL[...,k+1:,k] -= diag(dL[...,k+1:,k+1:]) * L[...,k+1:,k] dL[...,k+1:,k] /= L[...,k:k+1,k] dL[...,k,k] -= dot(dL[...,k+1:,k], L[...,k+1:,k]) dL[...,k,k] /= 2 * L[...,k,k] return (dL + T(dL))/2.
def cholesky_grad(g): dL = onp.tril(g) dL[..., -1, -1] /= 2 * L[..., -1, -1] for k in range(N - 2, -1, -1): dL[..., k + 1:, k] -= dsymv(1., dL[..., k + 1:, k + 1:], L[..., k + 1:, k], lower=True) dL[..., k + 1:, k] -= diag(dL[..., k + 1:, k + 1:]) * L[..., k + 1:, k] dL[..., k + 1:, k] /= L[..., k:k + 1, k] dL[..., k, k] -= dot(dL[..., k + 1:, k], L[..., k + 1:, k]) dL[..., k, k] /= 2 * L[..., k, k] return (dL + T(dL)) / 2.