def test_cm_0(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        A = np.array(
            [
                [0, 1, 1],
                [1, 0, 1],
                [1, 1, 0],
            ]
        )

        g = sample.UndirectedGraph(A)

        g._solve_problem(
            model="cm",
            method="newton",
            max_steps=100,
            verbose=False,
            linsearch=True,
            initial_guess='degrees_minor'
        )

        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 5: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-1)
    def test_cm_2(self):
        """classes with cardinality more than 1 and zero degrees"""
        # test Matrix 1
        n, seed = (100, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=True, seed=seed)

        g = sample.UndirectedGraph(A)

        g._solve_problem(
            model="cm",
            method="newton",
            max_steps=300,
            verbose=False,
            linsearch="True",
            initial_guess='random'
        )

        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 9: error = {}'.format(g.error))

        # test result
        self.assertTrue(g.error < 1e-1)
Beispiel #3
0
    def test_ECM_Dianati_random_dense_20_undir(self):

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

        g = sample_und.UndirectedGraph(adjacency=network)

        g.solve_tool(
            model="ecm_exp",
            method="newton",
            max_steps=1000,
            verbose=False,
            initial_guess="uniform",
        )

        g._solution_error()

        # test result

        self.assertTrue(g.error < 1e-1)
        self.assertTrue(g.error < 1e-2)
Beispiel #4
0
    def test_fixedpoint_cm_6(self):
        """classes with cardinality > 1, no zero degree"""
        n, seed = (20, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=True, seed=seed)

        g = sample.UndirectedGraph(A)

        g._solve_problem(
            model="cm_exp",
            method="fixed-point",
            initial_guess="random",
            max_steps=300,
            verbose=False,
            linsearch="True",
        )

        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 6: error = {}'.format(g.error))

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

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

        g = sample_und.UndirectedGraph(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 #6
0
    def test_edgelist_init_string_undirected(self):
        e = np.array([("1", "a"), ("2", "b"), ("2", "a")])
        k = np.array([1, 2, 2, 1])

        g0 = sample.UndirectedGraph()
        g0._initialize_graph(edgelist=e)
        # debug
        # test result
        self.assertTrue(k.all() == g0.dseq.all())
    def test_cm_uniform(self):
        n, seed = (4, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=True, seed=seed)

        g = sample_u.UndirectedGraph(A)
        g.initial_guess = 'uniform'
        g.last_model = "cm"
        g._set_initial_guess('cm')

        self.assertTrue(g.x0.all() == np.array([0.5, 0.5]).all())
Beispiel #8
0
    def test_edgelist_init_string_undirected_weighted(self):
        e = np.array([("1", "a", 3), ("2", "b", 4), ("2", "a", 3)])
        k = np.array([1, 2, 2, 1])
        s = np.array([3., 7., 6., 4.])

        g0 = sample.UndirectedGraph()
        g0._initialize_graph(edgelist=e)
        # debug
        # test result
        self.assertTrue((k == g0.dseq).all())
        self.assertTrue((s == g0.strength_sequence).all())
    def test_cm(self):
        n, seed = (4, 22)
        A = mg.random_binary_matrix_generator_dense(n, sym=True, seed=seed)

        x0 = np.random.rand(n)
        g = sample_u.UndirectedGraph(A)
        g.initial_guess = x0
        g._set_initial_guess_cm()
        g.full_return = False
        g.last_model = "cm"
        g._set_solved_problem_cm(g.x0)
        self.assertTrue(g.x.all() == x0.all())
    def test_ecm(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(n)
        g = sample_u.UndirectedGraph(A)
        g.initial_guess = x0
        g._set_initial_guess_crema_undirected()
        self.assertTrue(g.x0.all() == x0.all())
    def test_crema_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_u.UndirectedGraph(A)
        g.initial_guess = 'strengths_minor'
        g._set_initial_guess('crema')

        x = (g.strength_sequence > 0).astype(float) / (g.strength_sequence + 1)
        self.assertTrue(g.x0.all() == x.all())
Beispiel #12
0
    def test_ECM_quasinewton_random_dense_20_undir(self):

        network = mg.random_weighted_matrix_generator_dense(n=20,
                                                            sup_ext=10,
                                                            sym=True,
                                                            seed=10,
                                                            intweights=True)

        g = sample_und.UndirectedGraph(adjacency=network)

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

        g._solution_error()

        # test result
        self.assertTrue(g.error < 1e-1)
    def test_0(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        """
        A = np.array(
            [
                [0, 1, 1, 0],
                [1, 0, 0, 1],
                [1, 0, 0, 0],
                [0, 1, 0, 0],
            ]
        )
        e = [(0,1), (0,2), (1,3)]
        d = [1,1,2,2]
        print(e)
        print(d)
        """
        N, seed = (50, 42)
        A = mg.random_binary_matrix_generator_dense(N, sym=True, seed=seed)
        # number of copies to generate

        g = sample.UndirectedGraph(A)

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

        x = g.x
        # g._solution_error()
        err = g.error

        # print('\ntest 5: error = {}'.format(g.error))
        n = 100
        output_dir = "sample_cm/"
        # random.seed(100)
        g.ensemble_sampler(n=n, output_dir=output_dir, seed=42)

        d = {'{}'.format(i): g.dseq[i] for i in range(N)}

        # read all sampled graphs and check the average degree distribution is close enough
        d_emp = {'{}'.format(i): 0 for i in range(N)}

        for l in range(n):
            f = output_dir + "{}.txt".format(l)
            if not os.stat(f).st_size == 0:
                g_tmp = nx.read_edgelist(f)
                d_tmp = dict(g_tmp.degree)
                for item in d_tmp.keys():
                    d_emp[item] += d_tmp[item]

        for item in d_emp.keys():
            d_emp[item] = d_emp[item] / n

        a_diff = np.array([abs(d[item] - d_emp[item]) for item in d.keys()])
        d_diff = {item: d[item] - d_emp[item] for item in d.keys()}

        ensemble_error = np.linalg.norm(a_diff, np.inf)

        #debug
        """
        for i in range(N):
            for j in range(N):
                if i!=j:
                    aux = x[i]*x[j]
                    # print("({},{}) p = {}".format(i,j,aux/(1+aux)))
        """

        # debug
        """
        print('original dseq',d)
        print('original dseq sum ',g.dseq.sum())
        print('ensemble average dseq', d_emp)
        print('ensemble dseq sum ',np.array([d_emp[key] for key in d_emp.keys()]).sum())
        print(d_diff)
        print('empirical error', ensemble_error)
        print('theoretical error', err)
        """

        l = os.listdir(output_dir)
        for f in l:
            os.remove(output_dir + f)
        os.rmdir(output_dir)

        # test result
        self.assertTrue(ensemble_error < 3)
Beispiel #14
0
    def test_1(self):
        n, seed = (10, 42)
        # network = mg.random_weighted_matrix_generator_dense(n=n, sup_ext=10, sym=True, seed=seed, intweights=True)
        network = mg.random_weighted_matrix_generator_uniform_custom_density(
            n=n, p=0.2, sym=True, sup_ext=30, intweights=True, seed=seed)
        # number of copies to generate

        g = sample.UndirectedGraph(adjacency=network)

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

        # g._solution_error()
        err = g.error

        # print('\ntest 5: error = {}'.format(g.error))
        n_sample = 300
        output_dir = "sample_crema_ecm_prob/"
        # random.seed(100)
        g.ensemble_sampler(n=n_sample, output_dir=output_dir, seed=42)

        d = {'{}'.format(i): g.dseq[i] for i in range(n)}
        s = {'{}'.format(i): g.strength_sequence[i] for i in range(n)}

        # read all sampled graphs and check the average degree distribution
        d_emp = {'{}'.format(i): 0 for i in range(n)}
        s_emp = {'{}'.format(i): 0 for i in range(n)}

        for l in range(n_sample):
            f = output_dir + "{}.txt".format(l)
            if not os.stat(f).st_size == 0:
                g_tmp = nx.read_edgelist(f, data=(("weight", float), ))
                d_tmp = dict(g_tmp.degree)
                s_tmp = dict(g_tmp.degree(weight='weight'))
                for item in d_tmp.keys():
                    d_emp[item] += d_tmp[item]
                    s_emp[item] += s_tmp[item]

        for item in d_emp.keys():
            d_emp[item] = d_emp[item] / n_sample
            s_emp[item] = s_emp[item] / n_sample

        ad_diff = np.array([abs(d[item] - d_emp[item]) for item in d.keys()])
        as_diff = np.array([abs(s[item] - s_emp[item]) for item in s.keys()])
        a_diff = np.concatenate((ad_diff, as_diff))
        d_diff = {item: abs(d[item] - d_emp[item]) for item in d.keys()}
        s_diff = {item: abs(s[item] - s_emp[item]) for item in s.keys()}

        ensemble_error = np.linalg.norm(a_diff, np.inf)

        # debug
        """
        print('\n original degree sequence ', d)
        print('\n original strength sequence ', s)
        print('\n ensemble average strength sequence', s_emp)
        print('\n degree by degree difference vector ', d_diff)
        print('\n strength by strength difference vector ', s_diff)
        print('\n empirical error = {}'.format(ensemble_error))
        print('\n theoretical error = {}'.format(err))
        """

        l = os.listdir(output_dir)
        for f in l:
            os.remove(output_dir + f)
        os.rmdir(output_dir)

        # test result
        self.assertTrue(ensemble_error < 4)
Beispiel #15
0
    def test_0(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        """
        A = np.array(
            [
                [0, 1, 1, 0],
                [1, 0, 0, 1],
                [1, 0, 0, 0],
                [0, 1, 0, 0],
            ]
        )
        e = [(0,1), (0,2), (1,3)]
        d = [1,1,2,2]
        print(e)
        print(d)
        """
        N, seed = (50, 42)
        A  = mg.random_weighted_matrix_generator_dense(
            n=N, sup_ext=10, sym=True, seed=seed, intweights=True
        )
        # number of copies to generate

        g = sample.UndirectedGraph(A)

        g._solve_problem(
            model="ecm",
            method="newton",
            max_steps=100,
            verbose=False,
            linsearch=True,
            initial_guess="uniform",
        )

        x = g.x
        # g._solution_error()
        err = g.error

        # print('\ntest 5: error = {}'.format(g.error))
        n = 1000
        output_dir = "sample_ecm/"
        # random.seed(100)
        g.ensemble_sampler(n=n, output_dir=output_dir, seed=42)

        d = {'{}'.format(i):g.dseq[i] for i in range(N)}
        s = {'{}'.format(i):g.strength_sequence[i] for i in range(N)}


        # read all sampled graphs and check the average degree distribution is close enough
        d_emp = {'{}'.format(i):0 for i in range(N)}
        s_emp = {'{}'.format(i):0 for i in range(N)}

        for l in range(n):
            f = output_dir + "{}.txt".format(l)
            if not os.stat(f).st_size == 0:
                g_tmp = nx.read_edgelist(f, data=(("weight", float),))
                d_tmp = dict(g_tmp.degree)
                s_tmp = dict(g_tmp.degree(weight='weight'))
                for item in d_tmp.keys(): 
                    d_emp[item] += d_tmp[item]
                    s_emp[item] += s_tmp[item]

        for item in d_emp.keys(): 
            d_emp[item] = d_emp[item]/n
            s_emp[item] = s_emp[item]/n

        ad_diff = np.array([abs(d[item] - d_emp[item]) for item in d.keys()])
        as_diff = np.array([abs(s[item] - s_emp[item]) for item in s.keys()])
        a_diff = np.concatenate((ad_diff, as_diff)) 
        d_diff = {item:d[item] - d_emp[item] for item in d.keys()}
        s_diff = {item:s[item] - s_emp[item] for item in s.keys()}

        ensemble_error = np.linalg.norm(a_diff, np.inf)

        #debug
        """
        for i in range(N):
            for j in range(N):
                if i!=j:
                    aux = x[i]*x[j]
                    # print("({},{}) p = {}".format(i,j,aux/(1+aux)))
        """


        # debug
        """
        print('\n original degree sequence ', d)
        print('\n original strength sequence ', s)
        print('\n ensemble average strength sequence', s_emp)
        print('\n degree by degree difference vector ', d_diff)
        print('\n strength by strength difference vector ', s_diff)
        print('\n empirical error = {}'.format(ensemble_error))
        print('\n theoretical error = {}'.format(err))
        """


        l = os.listdir(output_dir)
        for f in l:
            os.remove(output_dir + f)
        os.rmdir(output_dir)

        # test result
        self.assertTrue(ensemble_error<3)
    def test_0(self):
        """test with 3 classes of cardinality 1
        and no zero degrees
        """
        """
        A = np.array(
            [
                [0, 1, 1, 0],
                [1, 0, 0, 1],
                [1, 0, 0, 0],
                [0, 1, 0, 0],
            ]
        )
        e = [(0,1), (0,2), (1,3)]
        d = [1,1,2,2]
        print(e)
        print(d)
        """
        N, seed = (10, 42)
        A = mg.random_binary_matrix_generator_dense(N, sym=True, seed=seed)
        # number of copies to generate

        g = sample.UndirectedGraph(A)

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

        x = g.x
        # g._solution_error()
        err = g.error

        # print('\ntest 5: error = {}'.format(g.error))
        n = 10
        output_dir = "sample/"
        # random.seed(100)
        g_list = []
        for i in range(n):
            g.ensemble_sampler(n=1, output_dir=output_dir)
            g_list.append(np.loadtxt("sample/0.txt"))

        appo = True
        old = g_list[0]
        for i in range(1, n):
            appo = appo * np.all(old == g_list[i])

        # debug
        """
        print('original dseq',d)
        print('original dseq sum ',g.dseq.sum())
        print('ensemble average dseq', d_emp)
        print('ensemble dseq sum ',np.array([d_emp[key] for key in d_emp.keys()]).sum())
        print(d_diff)
        print('empirical error', ensemble_error)
        print('theoretical error', err)
        """

        l = os.listdir(output_dir)
        for f in l:
            os.remove(output_dir + f)
        os.rmdir(output_dir)

        # test result
        self.assertTrue(not appo)