示例#1
0
 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)
示例#2
0
 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)
示例#3
0
    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
示例#4
0
    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