def compute_u_and_g(phi, mask=True): #print(-phi[1]) L = utils.m_chol(-phi[1]) k = np.shape(phi[0])[-1] # Moments u0 = utils.m_chol_solve(L, 0.5 * phi[0]) u1 = utils.m_outer(u0, u0) + 0.5 * utils.m_chol_inv(L) u = [u0, u1] # G g = (-0.5 * np.einsum('...i,...i', u[0], phi[0]) + 0.5 * utils.m_chol_logdet(L) + 0.5 * np.log(2) * k) #+ 0.5 * np.log(2) * self.dims[0][0]) return (u, g)
def compute_u_and_g(phi, mask=True): #print(-phi[1]) L = utils.m_chol(-phi[1]) k = np.shape(phi[0])[-1] # Moments u0 = utils.m_chol_solve(L, 0.5*phi[0]) u1 = utils.m_outer(u0, u0) + 0.5 * utils.m_chol_inv(L) u = [u0, u1] # G g = (-0.5 * np.einsum('...i,...i', u[0], phi[0]) + 0.5 * utils.m_chol_logdet(L) + 0.5 * np.log(2) * k) #+ 0.5 * np.log(2) * self.dims[0][0]) return (u, g)
def random(self): # TODO/FIXME: You shouldn't draw random values for # observed/fixed elements! # Note that phi[1] is -0.5*inv(Cov) U = utils.m_chol(-2 * self.phi[1]) mu = self.u[0] z = np.random.normal(0, 1, self.get_shape(0)) # Compute mu + U'*z #return mu + np.einsum('...ij,...i->...j', U, z) #scipy.linalg.solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False, overwrite_b=False, debug=False) #print('gaussian.random', np.shape(mu), np.shape(z)) z = utils.m_solve_triangular(U, z, trans='T', lower=False) return mu + z
def random(self): # TODO/FIXME: You shouldn't draw random values for # observed/fixed elements! # Note that phi[1] is -0.5*inv(Cov) U = utils.m_chol(-2*self.phi[1]) mu = self.u[0] z = np.random.normal(0, 1, self.get_shape(0)) # Compute mu + U'*z #return mu + np.einsum('...ij,...i->...j', U, z) #scipy.linalg.solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False, overwrite_b=False, debug=False) #print('gaussian.random', np.shape(mu), np.shape(z)) z = utils.m_solve_triangular(U, z, trans='T', lower=False) return mu + z