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