def objective(self, obj): if isinstance(obj, CyLPExpr): self.objective_ = obj.evaluate() obj = None #for varName in self.allVarNames: for varName in self.varNames: v_coef = self.generateVarObjCoef(varName) obj = sparseConcat(obj, v_coef, how='h') self.objective_ = obj
def objective(self, obj): if isinstance(obj, CyLPExpr): self.objective_ = obj.evaluate() obj = None #for varName in self.allVarNames: for varName in self.varNames: v_coef = self.generateVarObjCoef(varName) obj = sparseConcat(obj, v_coef, how='h') obj = np.squeeze(np.asarray(obj.todense())) self.objective_ = obj
def removeVariable(self, name): ''' Remove a variable named ``name`` from the model ''' if not self.inds.hasVar(name): raise Exception('Variable "%s" does not exist.' % name) self.nVars -= self.pvdims[name] start = self.inds.varIndex[name][0] end = start + self.pvdims[name] o = self.objective_ if isinstance(o, np.ndarray): o = np.concatenate((o[:start], o[end:]), axis=0) else: if end == o.shape[1]: if start == 0: print('Problem empty.') else: o = o[0, :start] elif start == 0: o = o[0, end:] else: o = sparseConcat(o[0, :start], o[0, end:], how='h') # I'm not exactly sure why the objective gets changed into # csr_matrixPlus here when it may not be coming in. Shouldn't it # just always be? self.objective_ = csr_matrixPlus(o) del self.pvdims[name] self.varNames.remove(name) self.inds.removeVar(name) for i in range(len(self.variables)): var = self.variables[i] if var.name == name: del self.variables[i] break #Removing the variable from the constraints cons = self.constraints for c in cons: if name in c.varNames: c.varNames.remove(name) del c.parentVarDims[name] for v in list(c.varCoefs.keys()): if v.name == name: del c.varCoefs[v] for c in cons[:]: self.inds if not c.varCoefs: self.removeConstraint(c.name)
def removeVariable(self, name): ''' Remove a variable named ``name`` from the model ''' if not self.inds.hasVar(name): raise Exception('Variable "%s" does not exist.' % name) self.nVars -= self.pvdims[name] start = self.inds.varIndex[name][0] end = start + self.pvdims[name] o = self.objective_ if isinstance(o, np.ndarray): o = np.concatenate((o[:start], o[end:]), axis=0) else: if end == o.shape[1]: if start == 0: print 'Problem empty.' else: o = o[0, :start] elif start == 0: o = o[0, end:] else: o = sparseConcat(o[0, :start], o[0, end:], how='h') self.objective_ = csr_matrixPlus(o) del self.pvdims[name] self.varNames.remove(name) self.inds.removeVar(name) for i in range(len(self.variables)): var = self.variables[i] if var.name == name: del self.variables[i] break #Removing the variable from the constraints cons = self.constraints for c in cons: if name in c.varNames: c.varNames.remove(name) del c.parentVarDims[name] for v in c.varCoefs.keys(): if v.name == name: del c.varCoefs[v] for c in cons[:]: self.inds if not c.varCoefs: self.removeConstraint(c.name)
def generateVarMatrix(self, varName): ''' Create the coefficient matrix for a variable named varName. Return a csr_matrixPlus. ''' #dim = self.allParentVarDims[varName] dim = self.pvdims[varName] mainCoef = None for c in self.constraints: coef = sparse.coo_matrix((c.nRows, dim)) keys = [k for k in c.varCoefs.keys() if k.name == varName] for var in keys: coef = coef + c.varCoefs[var] mainCoef = sparseConcat(mainCoef, coef, 'v') return mainCoef
def makeMatrices(self): ''' Makes coef matrix and rhs vector from CyLPConstraints in self.constraints ''' #if len(self.constraints) == 0: # return self.makeIndexFactory() #self.getVarBounds() # Create the aggregated coef matrix masterCoefMat = None masterCoefMat = None if self.nCons > 0: for varName in self.varNames:# self.pvdims.keys():#self.allVarNames: vmat = self.generateVarMatrix(varName) if vmat is None: vmat = csc_matrixPlus((self.nCons, self.pvdims[varName])) masterCoefMat = sparseConcat(masterCoefMat, vmat, 'h') # Create bound vectors c_lower = np.array([]) c_upper = np.array([]) for c in self.constraints: if not c.isRange: c_lower = np.concatenate((c_lower, c.lower), axis=0) c_upper = np.concatenate((c_upper, c.upper), axis=0) # Create variables bound vectors v_lower = np.array([]) v_upper = np.array([]) if self.nVars: v_lower = -getCoinInfinity() * np.ones(self.nVars) v_upper = getCoinInfinity() * np.ones(self.nVars) for v in self.variables: varinds = self.inds.varIndex[v.name] v_lower[varinds] = v.lower v_upper[varinds] = v.upper #v_lower = np.concatenate((v_lower, v.lower), axis=0) #v_upper = np.concatenate((v_upper, v.upper), axis=0) #if masterCoefMat is not None: return masterCoefMat, c_lower, c_upper, v_lower, v_upper
def addVariable(self, name, dim, isInt=False): ''' Create a new instance of :py:class:`CyLPVar` using the given arguments and add it to current model's variable list. ''' if dim == 0: return var = CyLPVar(name, dim, isInt) self.variables.append(var) #If mulidim, correct dim if isinstance(dim, tuple): dim = reduce(mul, dim) if not self.inds.hasVar(var.name): self.inds.addVar(var.name, dim) self.nVars += dim self.varNames.append(var.name) self.pvdims[var.name] = dim if var.dims: var.mpsNames = [var.name + '_' + '_'.join(x) for x in \ product(*[map(str, range(i)) for i in var.dims])] else: var.mpsNames = [ '%s_%s' % (var.name, i) for i in range(var.dim) ] o = self.objective_ if isinstance(o, np.ndarray): o = np.concatenate((o, np.zeros(dim)), axis=0) else: o = sparseConcat(o, csr_matrixPlus(np.zeros(dim)), 'h') # I'm not exactly sure why the objective gets changed into # csr_matrixPlus here when it may not be coming in. Shouldn't it # just always be? self.objective_ = csr_matrixPlus(o) else: raise Exception('Varaible %s already exists.' % var.name) return var
def addVariable(self, name, dim, isInt=False): ''' Create a new instance of :py:class:`CyLPVar` using the given arguments and add it to current model's variable list. ''' if dim == 0: return var = CyLPVar(name, dim, isInt) self.variables.append(var) #If mulidim, correct dim if isinstance(dim, tuple): dim = reduce(mul, dim) if not self.inds.hasVar(var.name): self.inds.addVar(var.name, dim) self.nVars += dim self.varNames.append(var.name) self.pvdims[var.name] = dim if var.dims: var.mpsNames = [var.name + '_' + '_'.join(x) for x in \ product(*[map(str, range(i)) for i in var.dims])] else: var.mpsNames = ['%s_%s' % (var.name, i) for i in xrange(var.dim)] o = self.objective_ if isinstance(o, np.ndarray): o = np.concatenate((o, np.zeros(dim)), axis=0) else: o = sparseConcat(o, csr_matrixPlus(np.zeros(dim)), 'h') self.objective_ = csr_matrixPlus(o) else: raise Exception('Varaible %s already exists.' % var.name) return var