def tester(p, q, r, s): d = q - r A = np.random.normal(size=(p, q)) AtA = np.dot(A.T, A) B = np.zeros((q, q)) c = np.random.normal(size=(r, r)) B[0:r, 0:r] = np.dot(c.T, c) di = np.random.uniform(size=d) B[r:q, r:q] = np.diag(1 / di) Qi = np.linalg.inv(B[0:r, 0:r]) s = 0.5 _, d2 = np.linalg.slogdet(s * np.eye(p, p) + np.dot(A, np.dot(B, A.T))) _, bd = np.linalg.slogdet(B) d1 = _smw_logdet(s, A, AtA, Qi, di, bd) assert_allclose(d1, d2)
def check_smw_logdet(p, q, r, s): # Helper to check that _smw_logdet results match non-optimized equivalent d = q - r A = np.random.normal(size=(p, q)) AtA = np.dot(A.T, A) B = np.zeros((q, q)) c = np.random.normal(size=(r, r)) B[0:r, 0:r] = np.dot(c.T, c) di = np.random.uniform(size=d) B[r:q, r:q] = np.diag(1 / di) Qi = np.linalg.inv(B[0:r, 0:r]) s = 0.5 _, d2 = np.linalg.slogdet(s * np.eye(p, p) + np.dot(A, np.dot(B, A.T))) _, bd = np.linalg.slogdet(B) d1 = _smw_logdet(s, A, AtA, Qi, di, bd) assert_allclose(d1, d2)
def test_smw_logdet(): np.random.seed(23) p = 5 q = 4 r = 2 s = 2 A = np.random.normal(size=(p, q)) AtA = np.dot(A.T, A) B = np.zeros((q, q)) c = np.random.normal(size=(r, r)) B[0:r, 0:r] = np.dot(c.T, c) di = np.random.uniform(size=s) B[r:q, r:q] = np.diag(1/di) Qi = np.linalg.inv(B[0:r, 0:r]) s = 0.5 _, d2 = np.linalg.slogdet(s*np.eye(p, p) + np.dot(A, np.dot(B, A.T))) _, bd = np.linalg.slogdet(B) d1 = _smw_logdet(s, A, AtA, Qi, di, bd) assert_allclose(d1, d2)