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))
Пример #4
0
    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))
Пример #5
0
    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))
Пример #6
0
    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))
Пример #7
0
    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))
Пример #10
0
    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))