def test_kronecker(): np.random.seed(1) # Create random matrices [a, b, c] = [np.random.rand(3, 3 + i) for i in range(3)] custom = kronecker(a, b, c) # Custom version nested = at.slinalg.kron(a, at.slinalg.kron(b, c)) np.testing.assert_array_almost_equal( custom.eval(), nested.eval()) # Standard nested version
def test_kron_dot(): np.random.seed(1) # Create random matrices Ks = [np.random.rand(3, 3) for i in range(3)] # Create random vector with correct shape tot_size = np.prod([k.shape[1] for k in Ks]) x = np.random.rand(tot_size).reshape((tot_size, 1)) # Construct entire kronecker product then multiply big = kronecker(*Ks) slow_ans = at.dot(big, x) # Use tricks to avoid construction of entire kronecker product fast_ans = kron_dot(Ks, x) np.testing.assert_array_almost_equal(slow_ans.eval(), fast_ans.eval())
def test_kron_solve_lower(): np.random.seed(1) # Create random matrices Ls = [np.tril(np.random.rand(3, 3)) for i in range(3)] # Create random vector with correct shape tot_size = np.prod([L.shape[1] for L in Ls]) x = np.random.rand(tot_size).reshape((tot_size, 1)) # Construct entire kronecker product then solve big = kronecker(*Ls) slow_ans = at.slinalg.solve_lower_triangular(big, x) # Use tricks to avoid construction of entire kronecker product fast_ans = kron_solve_lower(Ls, x) np.testing.assert_array_almost_equal(slow_ans.eval(), fast_ans.eval())
def test_multiops(self): X1 = np.linspace(0, 1, 3)[:, None] X21 = np.linspace(0, 1, 5)[:, None] X22 = np.linspace(0, 1, 4)[:, None] X2 = cartesian(X21, X22) X = cartesian(X1, X21, X22) with pm.Model() as model: cov1 = ( 3 + pm.gp.cov.ExpQuad(1, 0.1) + pm.gp.cov.ExpQuad(1, 0.1) * pm.gp.cov.ExpQuad(1, 0.1) ) cov2 = pm.gp.cov.ExpQuad(1, 0.1) * pm.gp.cov.ExpQuad(2, 0.1) cov = pm.gp.cov.Kron([cov1, cov2]) K_true = kronecker(cov1(X1).eval(), cov2(X2).eval()).eval() K = cov(X).eval() npt.assert_allclose(K_true, K)