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