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_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='likelihood', projection=True, **{'L_eig_dec': (eig_vals, eig_vecs)}) dpp.compute_L() L = (eig_vecs * eig_vals).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.L, L))
def test_instanciation_from_kernel(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_vecs * eig_vals).dot(eig_vecs.T)}) dpp.compute_L() L = (eig_vecs * (eig_vals / (1.0 - eig_vals))).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.L, L))
def test_computation_of_likehood_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_L() if 'L' in param: L = param['L'] elif 'L_eig_dec' in param: e_vals, e_vecs = param['L_eig_dec'] L = (e_vecs * e_vals).dot(e_vecs.T) elif 'L_gram_factor' in param: L = param['L_gram_factor'].T.dot(param['L_gram_factor']) self.assertTrue(np.allclose(dpp.L, L))
def test_proj_dpp_sampler_as_kDPP_with_likelihood_kernel(self): """ Test whether projection DPP sampled as a k-DPP with k=rank(K) generates samples with the right 1 and 2 points inclusion probabilities when DPP defined by orthogonal projection likelihood kernel L from its eigendecomposition """ eig_vals = np.ones(self.rank) eig_vecs, _ = qr(rndm.randn(self.N, self.rank), mode='economic') dpp = FiniteDPP(kernel_type='likelihood', projection=True, **{'L': (eig_vecs * eig_vals).dot(eig_vecs.T)}) dpp.flush_samples() for _ in range(self.nb_samples): dpp.sample_exact_k_dpp(self.rank) dpp.compute_L() dpp.K = dpp.L self.assertTrue(self.singleton_adequation(dpp, dpp.list_of_samples)) self.assertTrue(self.doubleton_adequation(dpp, dpp.list_of_samples))
def test_computation_of_likehood_kernel_should_raise_warning_with_L_eval( self): def eval_L_linear(X, Y=None): if Y is None: return X.dot(X.T) else: return X.dot(Y.T) X_data = rndm.rand(100, 6) dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L_eval_X_data': (eval_L_linear, X_data)}) # raise warning when projection not set to True # https://docs.python.org/3/library/warnings.html with warnings.catch_warnings(record=True) as w: dpp.compute_L() self.assertIn('Weird setting', str(w[-1].message))
def test_proj_dpp_sampler_as_kDPP_with_likelihood_kernel_eig_proj_false( self): """ Test whether projection DPP sampled as a k-DPP with k=rank(K) generates samples with the right 1 and 2 points inclusion probabilities when DPP defined by orthogonal projection likelihood kernel L from its eigendecomposition and projection is set to False in order to go through the computation of elementary symmetric polynomials etc """ eig_vals = np.zeros(self.N) eig_vals[:self.rank] = 1.0 eig_vecs, _ = qr(rndm.randn(self.N, self.N), mode='economic') dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L_eig_dec': (eig_vals, eig_vecs)}) dpp.flush_samples() for _ in range(self.nb_samples): dpp.sample_exact_k_dpp(self.rank) dpp.compute_L() dpp.K = dpp.L self.assertTrue(self.singleton_adequation(dpp, dpp.list_of_samples)) self.assertTrue(self.doubleton_adequation(dpp, dpp.list_of_samples))
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_geq_0(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_dec': (eig_vals, eig_vecs)}) dpp.compute_L() L = (eig_vecs * eig_vals).dot(eig_vecs.T) self.assertTrue(np.allclose(dpp.L, L)) dpp = FiniteDPP(kernel_type='likelihood', projection=False, **{'L_eig_dec': (eig_vals, eig_vecs)}) 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_likehood_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) try: dpp.compute_L() if 'K' in param: e_vals, e_vecs = la.eigh(param['K']) elif 'K_eig_dec' in param: e_vals, e_vecs = param['K_eig_dec'] elif 'A_zono' in param: e_vals = np.ones(param['A_zono'].shape[0]) e_vecs, _ = la.qr(param['A_zono'], mode='economic') L = (e_vecs * (e_vals / (1.0 - e_vals))).dot(e_vecs.T) self.assertTrue(np.allclose(dpp.L, L)) except (ValueError, FloatingPointError) as e: self.assertIn('cannot be computed', str(e.args))