def construct(self,model,controlNames,newObjective): ''' Top Level Function Build Complete Framework ''' self.newObjective = newObjective result = LinearModel() result.addModel(model) sObjective = self._scaleMap(model.getObjective(),self.objectiveCoeffecent) sObjective[self.newObjective] = .01 result.setObjective(sObjective) for (libName,libPrefix) in self.libdata: result = self._constructRegulationObjecive(result, controlNames, libName, libPrefix, -1.0) pass result = self._primalDual(result, result.getObjective()) for (libName,libPrefix) in self.libdata: result = self.constructControl(result,controlNames,libPrefix,libName) if self.rGeneMap != None: self.geneControl(result,libPrefix + "y__",controlNames,libName) if self.simoLimit !=0: result = self._controlValueLimit(result,controlNames,postfix="y__") return result
def _primalDual(self,model,objective,prime=True,dual=True,equal=True): ''' class PathwayTarget: @type model: LinearModel @rtype: LinearModel Construct Core Linear Optimization Matrix with primal dual equality row i and column j Primal: min Z = sum(j): [c(j)*v(j)] ST. sum(j) [S(ij)*v(j)] = 0 E i l(j) < v(j) < u(j) E j Hameltonian: Max(lambda,mu,nu): Min(v): sum(j)c(j)*v(j) + sum(i)lambda(i)*S(ij)v(j) + mu(j)(l(j)-v(j)) + nu(j)(v(j)-u(j)) => c'v + lambda*(Sv) + mu(l-v) + nu(v-u) => Max: mu*l - nu*u ST c + lambda*S + mu + nu = 0 Dual: max Z_dual = l*mu - u*nu ST. S'*lambda - mu + nu = -c' mu(j) > 0 E j nu(j) > 0 E j Equality condition: Z = Z_dual ==> sum(j) [c(j)'*v(j)] = sum(j) [l(j)*mu(j) - u(j)*nu] ==> -c*v + mu*l - u*nu = 0 ''' pName = self.pName dName = self.dName result = LinearModel() #Primal: if prime: #S*v for (row, column, value) in model.getSparseMatrix(): result.addData(self.primeRName + row, pName + column, value) #S*v <=> b for row in model.getRowLimits().keys(): result.addRowLimit(self.primeRName + row, model.getRowLimit(row)) #u<=v<=l for column in model.getColumnNames(): result.addColumnLimit(pName + column, model.getColumnLimit(column)) #Dual: if dual: #S'*lambda for (row, column, value) in model.getSparseMatrix(): result.addData(self.dualRName + column, dName + row, value) #lambda <=> +- inf for row in model.getRowLimits().keys(): result.addColumnLimit(dName + row, (None,None)) #S'*lambda = -c' for column in model.getColumnNames(): if column in objective.keys(): value = objective[column] result.addRowLimit(self.dualRName + column, (-value, -value)) else: result.addRowLimit(self.dualRName + column, (0.0, 0.0)) #S'*lambda - mu + nu = -c' for column in model.getColumnLimits().keys(): (lower, upper) = model.getColumnLimit(column) if lower != None: result.addData(self.dualRName + column, '__mu__' + column, -1) result.addColumnLimit('__mu__' + column, (0.0, None)) if upper != None: result.addData(self.dualRName + column, '__nu__' + column, 1) result.addColumnLimit('__nu__' + column, (0.0, None)) if equal: #objective relation #Z^prime = Z^dual # cv = l*mu - u*nu = 0 # -cv + l*mu - u*nu = 0 for column in model.getColumnNames(): if column in objective.keys(): value = objective[column] result.addData(self.equalityRName, pName + column, -value) else: result.addData(self.equalityRName, pName + column, 0) for column in model.getColumnLimits().keys(): (lower, upper) = model.getColumnLimit(column) if lower != None and lower != 0.0: result.addData(self.equalityRName, '__mu__' + column, lower) if upper != None and upper != 0.0: result.addData(self.equalityRName, '__nu__' + column, -upper) result.addRowLimit(self.equalityRName,(0,0)) objective = {} objective[self.pName + self.newObjective] = -1 result.setObjective(objective) return result