def test_fixedpoint_2(self):
        """classes with cardinality 1 and zero degrees"""
        # test Matrix 1
        n, seed = (40, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)
        A[0, :] = 0

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="dcm",
            method="fixed-point",
            max_steps=300,
            verbose=False,
            initial_guess="uniform",
            linsearch="False",
        )

        g._solution_error()
        # print('degseq = ', np.concatenate((g.dseq_out, g.dseq_in)))
        # print('expected degseq = ',g.expected_dseq)
        # debug
        # print(g.r_dseq_out)
        # print(g.r_dseq_in)
        # print(g.rnz_dseq_out)
        # print(g.rnz_dseq_in)
        # print('\ntest 7: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-1)
Beispiel #2
0
    def test_quasinewton_0(self):
        n, seed = (4, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)
        # print(A)

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="decm",
            method="quasinewton",
            max_steps=100,
            verbose=False,
            initial_guess="uniform",
        )

        g._solution_error()
        # debug
        # print('\n test 1, no zeros, n = {}, error = {}'.format(n, g.error))

        # test result
        self.assertTrue(g.error < 1)
Beispiel #3
0
    def test_decm(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """

        n, s = (4, 25)

        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sup_ext=10,
                                                      sym=False,
                                                      seed=s,
                                                      intweights=True)

        g = sample.DirectedGraph(A)

        g.solve_tool(
            model="decm",
            method="quasinewton",
            initial_guess="uniform",
            max_steps=200,
            verbose=False,
        )

        # g._solution_error()
        # debug
        # print(g.r_dseq_out)
        # print(g.r_dseq_in)
        # print(g.rnz_dseq_out)
        # print(g.rnz_dseq_in)
        # print('\ntest 0: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-1)
    def test_iterative_dcm(self):

        n, seed = (3, 42)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        # rd
        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "eigenvalues"
        g._initialize_problem("dcm", "fixed-point")
        x0 = 0.5 * np.ones(4)

        f_sample = -g.fun(x0)
        g.last_model = "dcm"
        g._set_solved_problem(f_sample)
        f_full = np.concatenate((g.x, g.y))
        f_correct = -np.array([2.5, 2.5, 0, 0, 1, 1.25])

        # debug
        # print(a)
        # print(x0, x)
        # print(f_full)

        # test result
        self.assertTrue(np.allclose(f_full, f_correct))
Beispiel #5
0
    def test_loglikelihood_hessian_dcm_exp_simmetry(self):

        n, seed = (3, 42)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("dcm", "newton")
        theta = np.random.rand(2 * n)
        x0 = np.exp(-theta)

        k_out = g.args[0]
        k_in = g.args[1]
        nz_index_out = g.args[2]
        nz_index_in = g.args[3]

        f = loglikelihood_hessian_dcm_exp(theta, g.args)
        f_t = f.T

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f-f_t)

        # test result
        self.assertTrue(np.allclose(f - f_t, np.zeros((2 * n, 2 * n))))
Beispiel #6
0
    def test_loglikelihood_dcm_exp(self):

        A = np.array([[0, 2, 2], [2, 0, 2], [0, 2, 0]])

        bA = np.array([[1 if aa != 0 else 0 for aa in a] for a in A])

        k_out = np.sum(bA, axis=1)
        k_in = np.sum(bA, axis=0)
        s_out = np.sum(A, axis=1)
        s_in = np.sum(A, axis=0)

        g = sample.DirectedGraph(A)
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("decm", "newton")
        # theta = np.random.rand(6)
        theta = 0.5 * np.ones(12)
        x0 = np.exp(-theta)

        f_sample = g.step_fun(x0)
        g.last_model = "decm"
        f_exp = -loglikelihood_decm_exp(theta, g.args)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f_sample)
        # print(f_sample)
        # print(f_exp)

        # test result
        self.assertTrue(
            np.round(f_sample, decimals=5) == np.round(f_exp, decimals=5))
Beispiel #7
0
    def test_loglikelihood_hessian_diag_vs_normal_dcm_exp(self):

        n, seed = (3, 42)
        # a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)
        a = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0]])

        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("dcm", "newton")
        theta = np.array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
        x0 = np.exp(-theta)

        k_out = g.args[0]
        k_in = g.args[1]
        nz_index_out = g.args[2]
        nz_index_in = g.args[3]

        g.last_model = "dcm"
        f_diag = loglikelihood_hessian_diag_dcm_exp(theta, g.args)
        f_full = loglikelihood_hessian_dcm_exp(theta, g.args)
        f_full_d = np.diag(f_full)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f_sample)
        # print(f_exp)

        # test result
        self.assertTrue(np.allclose(f_diag, f_full_d))
    def test_loglikelihood_dcm(self):
        """
        a = np.array([[0, 1, 1],
                      [1, 0, 1],
                      [0, 1, 0]])
        """
        n, seed = (3, 42)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "eigenvalues"
        g._initialize_problem("dcm", "quasinewton")
        x0 = np.concatenate((g.r_x, g.r_y))

        # call loglikelihood function
        f_sample = -g.step_fun(x0)
        f_correct = 4 * np.log(1 / 2) - 3 * np.log(5 / 4)
        # debug
        # print(x0)
        # print(f_sample)
        # print(f_correct)

        # test result
        self.assertTrue(round(f_sample, 3) == round(f_correct, 3))
Beispiel #9
0
    def test_dcm_new(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        A = np.array([
            [0, 1, 1],
            [1, 0, 0],
            [0, 1, 0],
        ])

        g = sample.DirectedGraph(A)

        g.solve_tool(
            model="dcm_exp",
            method="quasinewton",
            initial_guess="uniform",
            max_steps=200,
            verbose=False,
        )

        # g._solution_error()
        # debug
        # print(g.r_dseq_out)
        # print(g.r_dseq_in)
        # print(g.rnz_dseq_out)
        # print(g.rnz_dseq_in)
        # print('\ntest 0: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-1)
    def test_3(self):
        n, seed = (40, 35)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)
        A[0, :] = 0

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="decm_exp",
            method="quasinewton",
            max_steps=20000,
            verbose=False,
            initial_guess="uniform",
            linsearch=True,
        )

        g._solution_error()
        # debug
        print("\n test 3, zeros, dimension n = {}, error = {}".format(
            n, g.error))

        # test result
        self.assertTrue(g.error < 1)
Beispiel #11
0
    def test_dcm(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        A = np.array(
            [
                [0, 1, 1],
                [1, 0, 0],
                [0, 1, 0],
            ]
        )

        g = sample.DirectedGraph(A)

        g.solve_tool(
            model="dcm",
            max_steps=200,
            verbose=False,
        )
        l = -mof.loglikelihood_dcm(g.solution_array, g.args)

        # g._solution_error()
        # debug
        # print(g.r_dseq_out)
        # print(g.r_dseq_in)
        # print(g.rnz_dseq_out)
        # print(g.rnz_dseq_in)
        # print('\ntest 0: error = {}'.format(g.error))

        # test result
        self.assertTrue(l == g.model_loglikelihood())
    def test_newton_3(self):
        n, seed = (40, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="decm",
            method="newton",
            max_steps=300,
            verbose=False,
            initial_guess="uniform",
        )

        g._solution_error()

        # print(g.expected_dseq)
        # print(g.dseq_out,g.dseq_in)
        # print('\n test 3, no zeros, dimension n = {} error = {}'.format(n, g.error))
        # print(g.error_dseq)

        # test result
        self.assertTrue(g.error < 1)
Beispiel #13
0
    def test_loglikelihood_prime_dcm_exp(self):

        n, seed = (3, 42)
        # a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)
        a = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0]])

        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("dcm", "newton")
        theta = np.array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
        x0 = np.exp(-theta)

        k_out = g.args[0]
        k_in = g.args[1]
        nz_index_out = g.args[2]
        nz_index_in = g.args[3]

        f = lambda x: loglikelihood_dcm_exp(x, g.args)
        f_sample = approx_fprime(theta, f, epsilon=1e-6)
        g.last_model = "dcm"
        f_exp = loglikelihood_prime_dcm_exp(theta, g.args)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f_sample)
        # print(f_exp)

        # test result
        self.assertTrue(np.allclose(f_sample, f_exp))
    def test_iterative_3(self):

        n, seed = (40, 22)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)
        a[0, :] = 0

        k_out = np.sum(a, 1)
        k_in = np.sum(a, 0)

        g = sample.DirectedGraph(a)
        g._solve_problem(
            model="dcm_exp",
            method="fixed-point",
            max_steps=3000,
            verbose=False,
            initial_guess="uniform",
            linsearch="False",
        )

        g._solution_error()
        err = g.error
        # debug
        # print('\ntest 1: error = {}'.format(err))

        # test result
        self.assertTrue(err < 1)
    def test_emi(self):

        n, seed = (50, 1)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        k_out = np.sum(a, 1)
        k_in = np.sum(a, 0)

        g = sample.DirectedGraph(a)
        g._solve_problem(
            model="dcm",
            method="quasinewton",
            max_steps=3000,
            verbose=False,
            initial_guess="uniform",
            linsearch="False",
        )

        g._solution_error()
        err = g.error
        # debug
        print("\ntest emi: error = {}".format(err))

        # test result
        self.assertTrue(err < 1)
Beispiel #16
0
    def test_fixedpoint_dcm_2(self):
        # test Matrix 1
        n, seed = (40, 35)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="decm",
            method="fixed-point",
            max_steps=25000,
            verbose=False,
            initial_guess="uniform",
            linsearch=True,
        )

        g._solution_error()
        # debug
        # print("\n test 3, no zeros, dimension n = {}, error = {}".format(n, g.error))

        # test result
        self.assertTrue(g.error < 1)
    def test_crema_original_newton_random_dense_20_dir(self):

        network = mg.random_weighted_matrix_generator_dense(n=20,
                                                            sup_ext=10,
                                                            sym=False,
                                                            seed=None)
        network_bin = (network > 0).astype(int)

        g = sample.DirectedGraph(adjacency=network)

        g.solve_tool(
            model="crema",
            method="quasinewton",
            initial_guess="random",
            adjacency=network_bin,
            max_steps=1000,
            verbose=False,
        )

        g._solution_error()

        # test result

        self.assertTrue(g.relative_error_strength < 1e-1)
        self.assertTrue(g.relative_error_strength < 1e-2)
Beispiel #18
0
    def test_loglikelihood_prime_dcm_exp(self):

        A = np.array([[0, 2, 2], [2, 0, 2], [0, 2, 0]])

        bA = np.array([[1 if aa != 0 else 0 for aa in a] for a in A])

        k_out = np.sum(bA, axis=1)
        k_in = np.sum(bA, axis=0)
        s_out = np.sum(A, axis=1)
        s_in = np.sum(A, axis=0)

        g = sample.DirectedGraph(A)
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("decm", "newton")
        # theta = np.random.rand(6)
        theta = 0.5 * np.ones(12)
        x0 = np.exp(-theta)

        f = lambda x: loglikelihood_decm_exp(x, g.args)
        f_sample = approx_fprime(theta, f, epsilon=1e-6)
        f_exp = loglikelihood_prime_decm_exp(theta, g.args)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f_sample)
        # print(f_exp)

        # test result
        self.assertTrue(np.allclose(f_sample, f_exp))
Beispiel #19
0
    def test_loglikelihood_hessian_dcm_exp(self):

        n, seed = (3, 42)
        a = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        g = sample.DirectedGraph(a)
        g.degree_reduction()
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("dcm", "newton")
        theta = np.random.rand(2 * n)
        x0 = np.exp(-theta)

        k_out = g.args[0]
        k_in = g.args[1]
        nz_index_out = g.args[2]
        nz_index_in = g.args[3]

        f_sample = np.zeros((n * 2, n * 2))
        for i in range(n * 2):
            f = lambda x: loglikelihood_prime_dcm_exp(x, g.args)[i]
            f_sample[i, :] = approx_fprime(theta, f, epsilon=1e-6)

        f_exp = loglikelihood_hessian_dcm_exp(theta, g.args)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print(f_sample)
        # print(f_exp)

        # test result
        self.assertTrue(np.allclose(f_sample, f_exp))
    def test_3(self):
        # test Matrix 1
        n, seed = (40, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)
        A[0, :] = 0

        g = sample.DirectedGraph(A)

        g._solve_problem(
            model="dcm",
            method="quasinewton",
            max_steps=100,
            verbose=False,
            initial_guess="uniform",
        )

        g._solution_error()
        # debug
        # print(g.r_dseq_out)
        # print(g.r_dseq_in)
        # print(g.rnz_dseq_out)
        # print(g.rnz_dseq_in)
        # print('\ntest 3: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-2)
    def test_dcm_exp(self):
        n, seed = (4, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        x0 = np.random.rand(2 * n)
        g = sample.DirectedGraph(A)
        g.initial_guess = x0
        g._set_initial_guess('dcm_exp')
        g._set_solved_problem_dcm(x0)
        self.assertTrue(np.concatenate((g.x, g.y)).all() == x0.all())
Beispiel #22
0
    def test_adjacency_init(self):
        a = np.array([[0, 1, 1], [1, 0, 1], [0, 1, 0]])
        k_out = np.array([2, 2, 1])
        k_in = np.array([1, 2, 2])

        g0 = sample.DirectedGraph()
        g0._initialize_graph(a)
        # debug
        # test result
        self.assertTrue((k_out == g0.dseq_out).all())
        self.assertTrue((k_in == g0.dseq_in).all())
    def test_dcm_uniform(self):
        n, seed = (4, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=False, seed=seed)

        g = sample.DirectedGraph(A)
        g.initial_guess = 'uniform'
        g._set_initial_guess('dcm')
        self.assertTrue(
            np.concatenate((
                g.r_x,
                g.r_y)).all() == np.array([0., 0.5, 0.5, 0.5, 0., 0.5]).all())
Beispiel #24
0
    def test_edgelist_init_string_directed(self):
        e = np.array([("1", "a"), ("2", "b"), ("2", "a")])
        k_out = np.array([1, 2, 0, 0])
        k_in = np.array([0, 0, 2, 1])

        g0 = sample.DirectedGraph()
        g0._initialize_graph(edgelist=e)
        # debug
        # test result
        self.assertTrue((k_out == g0.dseq_out).all())
        self.assertTrue((k_in == g0.dseq_in).all())
Beispiel #25
0
    def test_edgelist_init(self):
        e = np.array([(0, 1), (0, 2), (1, 2), (1, 0), (2, 1)])
        k_out = np.array([2, 2, 1])
        k_in = np.array([1, 2, 2])

        g0 = sample.DirectedGraph()
        g0._initialize_graph(edgelist=e)
        # debug
        # test result

        self.assertTrue((k_out == g0.dseq_out).all())
        self.assertTrue((k_in == g0.dseq_in).all())
    def test_decm_exp_uniform(self):
        n, seed = (4, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        g = sample.DirectedGraph(A)
        g.initial_guess = 'uniform'
        g._set_initial_guess('decm_exp')
        tester = np.exp(np.ones(4 * n))
        self.assertTrue(g.x0.all() == tester.all())
    def test_decm(self):
        n, seed = (4, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        x0 = np.random.rand(4 * n)
        g = sample.DirectedGraph(A)
        g.initial_guess = x0
        g._set_initial_guess('decm')
        g._set_solved_problem_decm(x0)
        self.assertTrue(np.concatenate((g.x, g.y)).all() == x0.all())
    def test_crema(self):
        n, seed = (4, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        x0 = np.random.rand(2 * n)
        g = sample.DirectedGraph(A)
        g.initial_guess = x0
        g._set_initial_guess_crema_directed()
        g._set_solved_problem_decm(x0)
        self.assertTrue(g.x0.all() == x0.all())
    def test_decm_uniform(self):
        n, seed = (4, 22)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sym=False,
                                                      seed=seed,
                                                      sup_ext=100,
                                                      intweights=True)

        g = sample.DirectedGraph(A)
        g.initial_guess = 'uniform'
        g._set_initial_guess('decm')
        self.assertTrue(
            np.concatenate((g.x, g.y, g.out_strength,
                            g.in_strength)).all() == np.ones(4 * n).all())
Beispiel #30
0
    def test_loglikelihood_hessian_diag_dcm_exp_zeros(self):

        # convergence relies heavily on x0
        n, s = (10, 35)
        # n, s = (5, 35)
        A = mg.random_weighted_matrix_generator_dense(n,
                                                      sup_ext=100,
                                                      sym=False,
                                                      seed=s,
                                                      intweights=True)
        A[0, :] = 0
        A[:, 5] = 0

        bA = np.array([[1 if aa != 0 else 0 for aa in a] for a in A])

        k_out = np.sum(bA, axis=1)
        k_in = np.sum(bA, axis=0)
        s_out = np.sum(A, axis=1)
        s_in = np.sum(A, axis=0)

        g = sample.DirectedGraph(A)
        g.initial_guess = "uniform"
        g.regularise = "identity"
        g._initialize_problem("decm", "newton")
        # theta = np.random.rand(6)
        theta = 0.5 * np.ones(n * 4)
        theta[np.concatenate((k_out, k_in, s_out, s_in)) == 0] = 1e4

        x0 = np.exp(-theta)

        f_sample = np.zeros(n * 4)
        for i in range(n * 4):
            f = lambda x: loglikelihood_prime_decm_exp(x, g.args)[i]
            f_sample[i] = approx_fprime(theta, f, epsilon=1e-6)[i]

        f_exp = loglikelihood_hessian_diag_decm_exp(theta, g.args)

        # debug
        # print(a)
        # print(theta, x0)
        # print(g.args)
        # print('approx',f_sample)
        # print('my',f_exp)
        # print('gradient', loglikelihood_prime_decm_exp(theta, g.args))
        # print('diff',f_sample - f_exp)
        # print('max',np.max(np.abs(f_sample - f_exp)))

        # test result
        self.assertTrue(np.allclose(f_sample, f_exp))