print print ' Printing at most 5 first components of vectors' print print 'Initial point: ', x0[:max_n] print 'Lower bounds on x: ', nlp.Lvar[:max_n] print 'Upper bounds on x: ', nlp.Uvar[:max_n] print 'f( x0 ) = ', nlp.obj( x0 ) g0 = nlp.grad( x0 ) print 'grad f( x0 ) = ', g0[:max_n] if max_m > 0: print 'Initial multipliers: ', pi0[:max_m] print 'Lower constraint bounds: ', nlp.Lcon[:max_m] print 'Upper constraint bounds: ', nlp.Ucon[:max_m] c0 = nlp.cons( x0 ) print 'c( x0 ) = ', c0[:max_m] J = nlp.jac( x0 ) H = nlp.hess( x0, pi0 ) print print ' nnzJ = ', J.nnz print ' nnzH = ', H.nnz print print ' Printing at most first 5x5 principal submatrix' print print 'J( x0 ) = ', J[:max_m,:max_n] print 'Hessian (lower triangle):', H[:max_n,:max_n]
def cons(self, x): """ Evaluate the vector of general constraints for the modified problem. Constraints are stored in the order in which they appear in the original problem. If constraint i is a range constraint, c[i] will be the constraint that has the slack on the lower bound on c[i]. The constraint with the slack on the upper bound on c[i] will be stored in position m + k, where k is the position of index i in rangeC, i.e., k=0 iff constraint i is the range constraint that appears first, k=1 iff it appears second, etc. Constraints appear in the following order: 1. [ c ] general constraints in origninal order 2. [ cR ] 'upper' side of range constraints 3. [ b ] linear constraints corresponding to bounds on original problem 4. [ bR ] linear constraints corresponding to 'upper' side of two-sided bounds """ n = self.n on = self.original_n m = self.m om = self.original_m equalC = self.equalC lowerC = self.lowerC nlowerC = self.nlowerC upperC = self.upperC nupperC = self.nupperC rangeC = self.rangeC nrangeC = self.nrangeC mslow = on + self.n_con_low msup = mslow + self.n_con_up s_low = x[on:mslow] # len(s_low) = n_con_low s_up = x[mslow:msup] # len(s_up) = n_con_up c = numpy.empty(m) c[:om] = AmplModel.cons(self, x[:on]) c[om:om + nrangeC] = c[rangeC] c[equalC] -= self.Lcon[equalC] c[lowerC] -= self.Lcon[lowerC] c[lowerC] -= s_low[:nlowerC] c[upperC] -= self.Ucon[upperC] c[upperC] *= -1 c[upperC] -= s_up[:nupperC] c[rangeC] -= self.Lcon[rangeC] c[rangeC] -= s_low[nlowerC:] c[om:om + nrangeC] -= self.Ucon[rangeC] c[om:om + nrangeC] *= -1 c[om:om + nrangeC] -= s_up[nupperC:] # Add linear constraints corresponding to bounds on original problem lowerB = self.lowerB nlowerB = self.nlowerB Lvar = self.Lvar upperB = self.upperB nupperB = self.nupperB Uvar = self.Uvar rangeB = self.rangeB nrangeB = self.nrangeB nt = on + self.n_con_low + self.n_con_up ntlow = nt + self.n_var_low t_low = x[nt:ntlow] t_up = x[ntlow:] b = c[om + nrangeC:] b[:nlowerB] = x[lowerB] - Lvar[lowerB] - t_low[:nlowerB] b[nlowerB:nlowerB + nrangeB] = x[rangeB] - Lvar[rangeB] - t_low[nlowerB:] b[nlowerB + nrangeB:nlowerB + nrangeB + nupperB] = Uvar[upperB] - x[upperB] - t_up[:nupperB] b[nlowerB + nrangeB + nupperB:] = Uvar[rangeB] - x[rangeB] - t_up[nupperB:] return c
print print ' Printing at most 5 first components of vectors' print print 'Initial point: ', x0[:max_n] print 'Lower bounds on x: ', nlp.Lvar[:max_n] print 'Upper bounds on x: ', nlp.Uvar[:max_n] print 'f( x0 ) = ', nlp.obj(x0) g0 = nlp.grad(x0) print 'grad f( x0 ) = ', g0[:max_n] if max_m > 0: print 'Initial multipliers: ', pi0[:max_m] print 'Lower constraint bounds: ', nlp.Lcon[:max_m] print 'Upper constraint bounds: ', nlp.Ucon[:max_m] c0 = nlp.cons(x0) print 'c( x0 ) = ', c0[:max_m] J = nlp.jac(x0) H = nlp.hess(x0, pi0) print print ' nnzJ = ', J.nnz print ' nnzH = ', H.nnz print print ' Printing at most first 5x5 principal submatrix' print print 'J( x0 ) = ', J[:max_m, :max_n] print 'Hessian (lower triangle):', H[:max_n, :max_n]
def cons(self, x): """ Evaluate the vector of general constraints for the modified problem. Constraints are stored in the order in which they appear in the original problem. If constraint i is a range constraint, c[i] will be the constraint that has the slack on the lower bound on c[i]. The constraint with the slack on the upper bound on c[i] will be stored in position m + k, where k is the position of index i in rangeC, i.e., k=0 iff constraint i is the range constraint that appears first, k=1 iff it appears second, etc. Constraints appear in the following order: 1. [ c ] general constraints in origninal order 2. [ cR ] 'upper' side of range constraints 3. [ b ] linear constraints corresponding to bounds on original problem 4. [ bR ] linear constraints corresponding to 'upper' side of two-sided bounds """ n = self.n ; on = self.original_n m = self.m ; om = self.original_m equalC = self.equalC lowerC = self.lowerC ; nlowerC = self.nlowerC upperC = self.upperC ; nupperC = self.nupperC rangeC = self.rangeC ; nrangeC = self.nrangeC mslow = on + self.n_con_low msup = mslow + self.n_con_up s_low = x[on:mslow] # len(s_low) = n_con_low s_up = x[mslow:msup] # len(s_up) = n_con_up c = numpy.empty(m) c[:om] = AmplModel.cons(self, x[:on]) c[om:om+nrangeC] = c[rangeC] c[equalC] -= self.Lcon[equalC] c[lowerC] -= self.Lcon[lowerC] ; c[lowerC] -= s_low[:nlowerC] c[upperC] -= self.Ucon[upperC] ; c[upperC] *= -1 c[upperC] -= s_up[:nupperC] c[rangeC] -= self.Lcon[rangeC] ; c[rangeC] -= s_low[nlowerC:] c[om:om+nrangeC] -= self.Ucon[rangeC] c[om:om+nrangeC] *= -1 c[om:om+nrangeC] -= s_up[nupperC:] # Add linear constraints corresponding to bounds on original problem lowerB = self.lowerB ; nlowerB = self.nlowerB ; Lvar = self.Lvar upperB = self.upperB ; nupperB = self.nupperB ; Uvar = self.Uvar rangeB = self.rangeB ; nrangeB = self.nrangeB nt = on + self.n_con_low + self.n_con_up ntlow = nt + self.n_var_low t_low = x[nt:ntlow] t_up = x[ntlow:] b = c[om+nrangeC:] b[:nlowerB] = x[lowerB] - Lvar[lowerB] - t_low[:nlowerB] b[nlowerB:nlowerB+nrangeB] = x[rangeB] - Lvar[rangeB] - t_low[nlowerB:] b[nlowerB+nrangeB:nlowerB+nrangeB+nupperB] = Uvar[upperB] - x[upperB] - t_up[:nupperB] b[nlowerB+nrangeB+nupperB:] = Uvar[rangeB] - x[rangeB] - t_up[nupperB:] return c