Exemple #1
0
    def factorize(self):
        u"""Factorize matrix A as limited-memory LDLᵀ.

        :returns:
            :L: L as a llmat matrix
            :d: as a Numpy array
        """
        super(CySparseLLDLSolver, self).factorize()
        nnz = len(self.lvals)
        row = np.empty(nnz, dtype=np.int64)
        col = np.empty(nnz, dtype=np.int64)
        val = np.empty(nnz, dtype=np.float64)

        elem = 0
        for j in xrange(len(self.colptr) - 1):
            for k in xrange(self.colptr[j], self.colptr[j + 1]):
                row[elem] = self.rowind[k]
                col[elem] = j
                val[elem] = self.lvals[k]
                elem += 1

        L = LLSparseMatrix(size=self.n,
                           itype=INT64_T,
                           dtype=FLOAT64_T)

        L.put_triplet(row, col, val)
        return (L, self.d)
Exemple #2
0
 def jac(self, *args, **kwargs):
     """Evaluate constraints Jacobian at x."""
     vals, rows, cols = super(CySparseNLPModel, self).jac(*args, **kwargs)
     J = LLSparseMatrix(nrow=self.ncon,
                        ncol=self.nvar,
                        size_hint=vals.size,
                        store_symmetric=False,
                        itype=types.INT64_T,
                        dtype=types.FLOAT64_T)
     J.put_triplet(rows, cols, vals)
     return J
Exemple #3
0
    def hess(self, *args, **kwargs):
        """Evaluate Lagrangian Hessian at (x, z).

        Note that `rows`, `cols` and `vals` must represent a LOWER triangular
        sparse matrix in the coordinate format (COO).
        """
        vals, rows, cols = super(CySparseNLPModel, self).hess(*args, **kwargs)
        H = LLSparseMatrix(size=self.nvar,
                           size_hint=vals.size,
                           store_symmetric=True,
                           itype=types.INT64_T,
                           dtype=types.FLOAT64_T)
        H.put_triplet(rows, cols, vals)
        return H
Exemple #4
0
class LLMatPutTripletBenchmark(benchmark.Benchmark):

    label = "Simple put_triplet with 100 elements, size = 1,000 and put_size = 1,000"
    each = 100

    def setUp(self):

        self.nbr_elements = 100
        self.size = 1000
        self.put_size = 1000

        assert self.put_size <= self.size

        self.A_c = LLSparseMatrix(size=self.size,
                                  size_hint=self.nbr_elements,
                                  itype=INT32_T,
                                  dtype=FLOAT64_T)
        construct_sparse_matrix(self.A_c, self.size, self.nbr_elements)

        self.A_p = spmatrix.ll_mat(self.size, self.size, self.nbr_elements)
        construct_sparse_matrix(self.A_p, self.size, self.nbr_elements)

        self.A_sppy = None

        self.id1 = np.arange(0, self.put_size, dtype=np.int32)
        self.id2 = np.full(self.put_size, 37, dtype=np.int32)

        self.b = np.arange(0, self.put_size, dtype=np.float64)

    def eachSetUp(self):
        self.A_sppy = csarray((self.size, self.size),
                              dtype=np.float64,
                              storagetype='row')

    #def tearDown(self):
    #    for i in xrange(self.size):
    #        for j in xrange(self.size):
    #            assert self.A_c[i, j] == self.A_p[i, j]

    def test_pysparse(self):
        self.A_p.put(self.b, self.id1, self.id2)
        return

    def test_cysparse(self):
        self.A_c.put_triplet(self.id1, self.id2, self.b)
        return

    def test_sppy(self):
        self.A_sppy.put(self.b, self.id1, self.id2, init=True)
Exemple #5
0
 def A(self, *args, **kwargs):
     """
     Evaluate sparse Jacobian of the linear part of the
     constraints. Useful to obtain constraint matrix
     when problem is a linear programming problem.
     """
     vals, rows, cols = super(CySparseAmplModel,
                              self).A(*args, **kwargs)
     A = LLSparseMatrix(nrow=self.ncon,
                        ncol=self.nvar,
                        size_hint=vals.size,
                        store_symmetric=False,
                        type=types.INT64_T,
                        dtype=types.FLOAT64_T)
     A.put_triplet(rows, cols, vals)
     return A
Exemple #6
0
class LLMatPutTripletBenchmark(benchmark.Benchmark):


    label = "Simple put_triplet with 100 elements, size = 1,000 and put_size = 1,000"
    each = 100


    def setUp(self):

        self.nbr_elements = 100
        self.size = 1000
        self.put_size = 1000

        assert self.put_size <= self.size

        self.A_c = LLSparseMatrix(size=self.size, size_hint=self.nbr_elements, itype=INT32_T, dtype=FLOAT64_T)
        construct_sparse_matrix(self.A_c, self.size, self.nbr_elements)

        self.A_p = spmatrix.ll_mat(self.size, self.size, self.nbr_elements)
        construct_sparse_matrix(self.A_p, self.size, self.nbr_elements)

        self.A_sppy = None

        self.id1 = np.arange(0, self.put_size, dtype=np.int32)
        self.id2 = np.full(self.put_size, 37, dtype=np.int32)

        self.b = np.arange(0, self.put_size,dtype=np.float64)


    def eachSetUp(self):
        self.A_sppy = csarray((self.size, self.size), dtype=np.float64, storagetype='row')

    #def tearDown(self):
    #    for i in xrange(self.size):
    #        for j in xrange(self.size):
    #            assert self.A_c[i, j] == self.A_p[i, j]

    def test_pysparse(self):
        self.A_p.put(self.b, self.id1, self.id2)
        return

    def test_cysparse(self):
        self.A_c.put_triplet(self.id1, self.id2, self.b)
        return

    def test_sppy(self):
        self.A_sppy.put(self.b, self.id1, self.id2, init=True)
Exemple #7
0
    def _jac(self, x, lp=False):
        """Helper method to assemble the Jacobian matrix.

        See the documentation of :meth:`jac` for more information.

        The positional argument `lp` should be set to `True` only if the
        problem is known to be a linear program. In this case, the evaluation
        of the constraint matrix is cheaper and the argument `x` is ignored.
        """
        m = self.m
        model = self.model
        on = self.original_n

        lowerC = np.array(model.lowerC, dtype=np.int64)
        nlowerC = model.nlowerC
        upperC = np.array(model.upperC, dtype=np.int64)
        nupperC = model.nupperC
        rangeC = np.array(model.rangeC, dtype=np.int64)
        nrangeC = model.nrangeC

        # Initialize sparse Jacobian
        nnzJ = self.model.nnzj + m
        J = LLSparseMatrix(nrow=self.ncon,
                           ncol=self.nvar,
                           size_hint=nnzJ,
                           store_symmetric=False,
                           itype=types.INT64_T,
                           dtype=types.FLOAT64_T)

        # Insert contribution of general constraints
        if lp:
            J[:on, :on] = self.model.A()
        else:
            J[:on, :on] = self.model.jac(x[:on])

        # Create a few index lists
        rlowerC = np.array(range(nlowerC), dtype=np.int64)
        rupperC = np.array(range(nupperC), dtype=np.int64)
        rrangeC = np.array(range(nrangeC), dtype=np.int64)

        # Insert contribution of slacks on general constraints
        J.put_triplet(lowerC, on + rlowerC,
                      -1.0 * np.ones(nlowerC, dtype=np.float64))
        J.put_triplet(upperC, on + nlowerC + rupperC,
                      -1.0 * np.ones(nupperC, dtype=np.float64))
        J.put_triplet(rangeC, on + nlowerC + nupperC + rrangeC,
                      -1.0 * np.ones(nrangeC, dtype=np.float64))

        return J