Example #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)
Example #2
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)
Example #3
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)
Example #4
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)
Example #5
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
Example #6
0
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)
Example #7
0
    """
    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)