def test_instanciation_from_eig_vals_equal_01(self): rank, N = 6, 10 eig_vals = np.ones(rank) eig_vecs, _ = qr(rndm.randn(N, rank), mode='economic') dpp = FiniteDPP(kernel_type='correlation', projection=True, **{'K_eig_dec': (eig_vals, eig_vecs)}) dpp.compute_K() K = (eig_vecs * eig_vals).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.K, K)) # If projection=True with self.assertRaises(ValueError) as context: dpp.compute_L() self.assertTrue('cannot be computed' in str(context.exception)) # If projection=False dpp = FiniteDPP(kernel_type='correlation', projection=False, **{'K_eig_dec': (eig_vals, eig_vecs)}) with self.assertRaises(FloatingPointError) as context: dpp.compute_L() self.assertTrue('cannot be computed' in str(context.exception))
def test_instanciation_from_A_zono(self): rank, N = 6, 10 A = rndm.randn(rank, N) dpp = FiniteDPP(kernel_type='correlation', projection=True, **{'A_zono': A}) dpp.compute_K() K = A.T.dot(np.linalg.inv(A.dot(A.T))).dot(A) self.assertTrue(np.allclose(dpp.K, K)) # raise warning when projection not set to True # https://docs.python.org/3/library/warnings.html with warnings.catch_warnings(record=True) as w: FiniteDPP(kernel_type='correlation', projection=False, **{'A_zono': rndm.randn(rank, N)}) self.assertTrue('Weird setting' in str(w[-1].message)) # Raise error when not full row rank with self.assertRaises(ValueError) as context: FiniteDPP(kernel_type='correlation', projection=True, **{'A_zono': rndm.randn(N, rank)}) self.assertTrue('not full row rank' in str(context.exception))
def test_instanciation_from_kernel(self): rank, N = 6, 10 eig_vals = 1 + rndm.geometric(p=0.5, size=rank) eig_vecs, _ = qr(rndm.randn(N, rank), mode='economic') dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L': (eig_vecs * eig_vals).dot(eig_vecs.T)}) dpp.compute_K() K = (eig_vecs * (eig_vals / (1.0 + eig_vals))).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.K, K))
def test_computation_of_correlation_kernel_from_valid_parameters(self): kernel_type = 'correlation' for idx, (proj, param) in enumerate(self.list_of_valid_params): with self.subTest(index=idx, projection=proj, param=param.keys()): dpp = FiniteDPP(kernel_type, projection=proj, **param) dpp.compute_K() if 'K' in param: K = param['K'] elif 'K_eig_dec' in param: e_vals, e_vecs = param['K_eig_dec'] K = (e_vecs * e_vals).dot(e_vecs.T) elif 'A_zono' in param: e_vals = np.ones(param['A_zono'].shape[0]) e_vecs, _ = la.qr(param['A_zono'].T, mode='economic') K = (e_vecs * e_vals).dot(e_vecs.T) self.assertTrue(np.allclose(dpp.K, K))
def test_computation_of_correlation_kernel_from_valid_parameters(self): kernel_type = 'likelihood' for idx, (proj, param) in enumerate(self.list_of_valid_params): with self.subTest(index=idx, projection=proj, param=param.keys()): dpp = FiniteDPP(kernel_type, projection=proj, **param) dpp.compute_K() if 'L' in param: e_vals, e_vecs = la.eigh(param['L']) elif 'L_eig_dec' in param: e_vals, e_vecs = param['L_eig_dec'] elif 'L_gram_factor' in param: L = param['L_gram_factor'].T.dot(param['L_gram_factor']) e_vals, e_vecs = la.eigh(L) K = (e_vecs * (e_vals / (1.0 + e_vals))).dot(e_vecs.T) self.assertTrue(np.allclose(dpp.K, K))
def test_instanciation_from_L_gram_factor_tall(self): rank, N = 6, 10 phi = rndm.randn(rank, N).T dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L_gram_factor': phi}) dpp.compute_L() L = phi.T.dot(phi) self.assertTrue(np.allclose(dpp.L, L)) dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L_gram_factor': phi}) dpp.compute_K() eig_vals, eig_vecs = eigh(L) K = (eig_vecs * (eig_vals / (1.0 + eig_vals))).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.K, K))
def test_instanciation_from_eig_vals_in_01(self): rank, N = 6, 10 eig_vals = rndm.rand(rank) eig_vecs, _ = qr(rndm.randn(N, rank), mode='economic') dpp = FiniteDPP(kernel_type='correlation', projection=False, **{'K_eig_dec': (eig_vals, eig_vecs)}) dpp.compute_K() K = (eig_vecs * eig_vals).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.K, K)) dpp = FiniteDPP(kernel_type='correlation', projection=False, **{'K_eig_dec': (eig_vals, eig_vecs)}) dpp.compute_L() L = (eig_vecs * (eig_vals / (1.0 - eig_vals))).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.L, L))