def test_merge_nc(self): symb = cp.symbolic(self.A_nc, p = None, merge_function = cp.merge_size_fill(0,0)) self.assertEqual(symb.n, 23) self.assertEqual(symb.nnz, 150) self.assertEqual(symb.clique_number, 12) self.assertEqual(symb.Nsn, 10) self.assertEqual(symb.fill,(73,0)) p = amd.order(self.A_nc) symb = cp.symbolic(self.A_nc, p = p, merge_function = cp.merge_size_fill(4,4)) self.assertEqual(symb.n, 23) self.assertTrue(symb.nnz > 150) self.assertTrue(symb.Nsn < 10) self.assertTrue(symb.fill[0] >= 36) self.assertTrue(symb.fill[1] > 0)
def test_merge(self): symb = cp.symbolic(self.A, p = None, merge_function = cp.merge_size_fill(0,0)) self.assertEqual(symb.n, 17) self.assertEqual(symb.nnz, 56) self.assertEqual(symb.Nsn, 9) self.assertEqual(symb.fill,(0,0)) self.assertEqual(symb.clique_number, 5) #self.assertEqual(symb.p, None) #self.assertEqual(symb.ip, None) symb = cp.symbolic(self.A, p = None, merge_function = cp.merge_size_fill(2,2)) self.assertEqual(symb.n, 17) self.assertTrue(symb.nnz > 56) self.assertTrue(symb.Nsn < 9) self.assertTrue(symb.fill[0] >= 0) self.assertTrue(symb.fill[1] > 0)
def test_merge_nc(self): symb = cp.symbolic(self.A_nc, p=None, merge_function=cp.merge_size_fill(0, 0)) self.assertEqual(symb.n, 23) self.assertEqual(symb.nnz, 150) self.assertEqual(symb.clique_number, 12) self.assertEqual(symb.Nsn, 10) self.assertEqual(symb.fill, (73, 0)) p = amd.order(self.A_nc) symb = cp.symbolic(self.A_nc, p=p, merge_function=cp.merge_size_fill(4, 4)) self.assertEqual(symb.n, 23) self.assertTrue(symb.nnz > 150) self.assertTrue(symb.Nsn < 10) self.assertTrue(symb.fill[0] >= 36) self.assertTrue(symb.fill[1] > 0)
def test_merge(self): symb = cp.symbolic(self.A, p=None, merge_function=cp.merge_size_fill(0, 0)) self.assertEqual(symb.n, 17) self.assertEqual(symb.nnz, 56) self.assertEqual(symb.Nsn, 9) self.assertEqual(symb.fill, (0, 0)) self.assertEqual(symb.clique_number, 5) #self.assertEqual(symb.p, None) #self.assertEqual(symb.ip, None) symb = cp.symbolic(self.A, p=None, merge_function=cp.merge_size_fill(2, 2)) self.assertEqual(symb.n, 17) self.assertTrue(symb.nnz > 56) self.assertTrue(symb.Nsn < 9) self.assertTrue(symb.fill[0] >= 0) self.assertTrue(symb.fill[1] > 0)
def _conelp_convert(P, **kwargs): """ Chordal conversion. """ tsize = kwargs.get('tsize',0) tfill = kwargs.get('tfill',0) inplace = kwargs.get('inplace',True) coupling = kwargs.get('coupling','full') prob = P.problem_data mf = chompack.merge_size_fill(tsize,tfill) cprob, b2s, symbs = chompack.convert_conelp(*prob,\ coupling = coupling,\ merge_function = mf) if inplace: P.problem_data = cprob P.blocks_to_sparse = b2s return cprob
print("Solving SDP with CVXOPT..") prob = (c, G, matrix(h), dims) sol = solvers.conelp(*prob) Z1 = matrix(sol['z'], (n,n)) # convert SDP and solve prob2, blocks_to_sparse, symbs = cp.convert_conelp(*prob) print("Solving converted SDP (no merging)..") sol2 = solvers.conelp(*prob2) # convert block-diagonal solution to spmatrix blki,I,J,bn = blocks_to_sparse[0] Z2 = spmatrix(sol2['z'][blki],I,J) # compute completion symb = cp.symbolic(Z2, p=cp.maxcardsearch) Z2c = cp.psdcompletion(cp.cspmatrix(symb)+Z2, reordered=False) prob3, blocks_to_sparse, symbs = cp.convert_conelp(*prob, coupling = 'full', merge_function = cp.merge_size_fill(5,5)) print("Solving converted SDP (with merging)..") sol3 = solvers.conelp(*prob3) # convert block-diagonal solution to spmatrix blki,I,J,bn = blocks_to_sparse[0] Z3 = spmatrix(sol3['z'][blki],I,J) # compute completion symb = cp.symbolic(Z3, p=cp.maxcardsearch) Z3c = cp.psdcompletion(cp.cspmatrix(symb)+Z3, reordered=False)
""" if m == 0 or n == 0: return spmatrix([], [], [], (m,n)) nnz = min(max(0, int(round(a*m*n))), m*n) nz = matrix(random.sample(range(m*n), nnz), tc='i') return spmatrix(normal(nnz,1), nz%m, matrix([int(ii) for ii in nz/m]), (m,n)) random.seed(1) # Generate random sparse matrix of order ... n = 200 # and with density ... rho = 0.02 As = sp_rand(n,n,rho) + spmatrix(10.0,range(n),range(n)) # We will use (greedy) clique merging in this example: fmerge = merge_size_fill(16,4) # Compute symbolic factorization with AMD ordering and clique merging; only lower triangular part of As is accessed print("Computing symbolic factorization..") p = amd.order symb = symbolic(As, p = p, merge_function = fmerge) print("Order of matrix : %i" % (symb.n)) print("Number of nonzeros : %i" % (symb.nnz)) print("Number of supernodes : %i" % (symb.Nsn)) print("Largest supernode : %i" % (max([symb.snptr[k+1]-symb.snptr[k] for k in range(symb.Nsn)]))) print("Largest clique : %i\n" % (symb.clique_number)) A = cspmatrix(symb) # create new cspmatrix from symbolic factorization A += As # add spmatrix 'As' to cspmatrix 'A'; this ignores the upper triangular entries in As
] A = spmatrix(1.0, I, J, (17, 17)) # Test if A is chordal p = cp.maxcardsearch(A) print("\nMaximum cardinality search") print(" -- perfect elimination order:"), cp.peo(A, p) # Test if natural ordering 0,1,2,...,17 is a perfect elimination order p = range(17) print("\nNatural ordering") print(" -- perfect elimination order:"), cp.peo(A, p) p = amd.order(A) print("\nAMD ordering") print(" -- perfect elimination order:"), cp.peo(A, p) # Compute a symbolic factorization symb = cp.symbolic(A, p) print("\nSymbolic factorization:") print("Fill :"), sum(symb.fill) print("Number of cliques :"), symb.Nsn print(symb) # Compute a symbolic factorization with clique merging symb2 = cp.symbolic(A, p, merge_function=cp.merge_size_fill(3, 3)) print("Symbolic factorization with clique merging:") print("Fill (fact.+merging) :"), sum(symb2.fill) print("Number of cliques :"), symb2.Nsn print(symb2)
J = range(17) + [0,1,1,2,2,2,3,3,4,4,4,5,5,6,6,6,7,7,8,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,13,13,14,14,15] A = spmatrix(1.0,I,J,(17,17)) # Test if A is chordal p = cp.maxcardsearch(A) print("\nMaximum cardinality search") print(" -- perfect elimination order:"), cp.peo(A,p) # Test if natural ordering 0,1,2,...,17 is a perfect elimination order p = range(17) print("\nNatural ordering") print(" -- perfect elimination order:"), cp.peo(A,p) p = amd.order(A) print("\nAMD ordering") print(" -- perfect elimination order:"), cp.peo(A,p) # Compute a symbolic factorization symb = cp.symbolic(A, p) print("\nSymbolic factorization:") print("Fill :"), sum(symb.fill) print("Number of cliques :"), symb.Nsn print(symb) # Compute a symbolic factorization with clique merging symb2 = cp.symbolic(A, p, merge_function = cp.merge_size_fill(3,3)) print("Symbolic factorization with clique merging:") print("Fill (fact.+merging) :"), sum(symb2.fill) print("Number of cliques :"), symb2.Nsn print(symb2)