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)
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)
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))
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))))
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))
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))
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)
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)
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)
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)
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))
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())
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())
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())
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())
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))