Skip to content
Snippets Groups Projects
Select Git revision
  • 9b45ba2b474cc23cb46d128eef1aa9d60aa70321
  • master default protected
  • dev
  • sybilNLO
  • gprBug
  • maximumtotalflux
  • easyConstraint
  • switchbug
  • thuong
  • momafix
  • rmReactBug
11 results

sysBiolAlg_mtfClass.R

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    sysBiolAlg_mtfClass.R 13.91 KiB
    #  sysBiolAlg_mtfClass.R
    #  FBA and friends with R.
    #
    #  Copyright (C) 2010-2014 Gabriel Gelius-Dietrich, Dpt. for Bioinformatics,
    #  Institute for Informatics, Heinrich-Heine-University, Duesseldorf, Germany.
    #  All right reserved.
    #  Email: geliudie@uni-duesseldorf.de
    #
    #  This file is part of sybil.
    #
    #  Sybil is free software: you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation, either version 3 of the License, or
    #  (at your option) any later version.
    #
    #  Sybil is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with sybil.  If not, see <http://www.gnu.org/licenses/>.
    
    
    #------------------------------------------------------------------------------#
    #                   definition of the class sysBiolAlg_mtf                     #
    #------------------------------------------------------------------------------#
    
    setClass(Class = "sysBiolAlg_mtf",
             representation(
                 maxobj = "numeric"
             ),
             contains = "sysBiolAlg"
    )
    
    
    #------------------------------------------------------------------------------#
    #                            default constructor                               #
    #------------------------------------------------------------------------------#
    
    # contructor for class sysBiolAlg_mtf
    setMethod(f = "initialize",
              signature = "sysBiolAlg_mtf",
              definition = function(.Object,
                                    model,
                                    wtobj = NULL,
                                    react = NULL, lb = NULL, ub = NULL,
                                    costcoefbw = NULL,
                                    costcoeffw = NULL,
                                    lpdir = "min",
                                    absMAX = SYBIL_SETTINGS("MAXIMUM"),
                                    useNames = SYBIL_SETTINGS("USE_NAMES"),
                                    cnames = NULL,
                                    rnames = NULL,
                                    pname = NULL,
                                    scaling = NULL,
                                    writeProbToFileName = NULL, ...) {
    
                  if ( ! missing(model) ) {
    
                      if (is.null(wtobj)) {
                          tmp <- .generateWT(model, react, lb, ub, ...)
                          wtobj  <- tmp[["obj"]]
                      }
                      
                      stopifnot(is(model, "modelorg"),
                                is(wtobj, "numeric"),
                                is(absMAX, "numeric"))
                      stopifnot(lpdir %in% c("min", "max"))
    
                      # If wtobj is longer than 1, mtf algorithm has to run several
                      # times. In that case, wtobj is not written in the problem
                      # object, it is written separately (maxobj) and used for
                      # each iteration.
    
                      if (length(wtobj) > 1) {
                          maxobj <- wtobj
                          currmo <- 0
                      }
                      else {
                          maxobj <- NULL
                          currmo <- wtobj[1]
                      }
    
                      
                      #  the problem: minimize:
                      #
                      #            |      |      |
                      #         S  |  0   |  0   |  = b
                      #            |      |      |
                      #       -------------------------
                      #            |      |      |
                      #         1  |  1   |  0   | >= 0
                      #            |      |      |
                      #       -------------------------
                      #            |      |      |
                      #         -1 |  0   |  1   | >= 0
                      #            |      |      |
                      #       -------------------------
                      #       c_wt |  0   |  0   | >= c^T * v_wt
                      #            |      |      |
                      #  lb   wt_lb|  0   |  0   |
                      #  ub   wt_ub|10000 |10000 |
                      #            |      |      |
                      #  obj    0  |  1   |  1   |
    
                      # NOTE: if lpdir == "max" the 2nd and 3rd block
                      # will be <= instead of >= and signs change.
    
                      # ---------------------------------------------
                      # problem dimensions
                      # ---------------------------------------------
    
                      nc     <- react_num(model)
                      nr     <- met_num(model)
    
                      nCols  <- 3*nc
                      nRows  <- nr + 2*nc + 1
    
    
                      # ---------------------------------------------
                      # constraint matrix
                      # ---------------------------------------------
    
                      # the initial matrix dimensions
                      LHS <- Matrix::Matrix(0, 
                                            nrow = nRows,
                                            ncol = nCols,
                                            sparse = TRUE)
    
                      # rows for the mutant strain
                      LHS[1:nr,1:nc] <- S(model)
    
                      # location of the mutant strain
                      fi <- c(1:nc)
    
                      # rows for the delta match matrix
                      if(lpdir=="min"){
                      	diag(LHS[(nr+1)   :(nr+nc)  ,1       :nc    ]) <-  1
                      	diag(LHS[(nr+1)   :(nr+nc)  ,(nc+1)  :(2*nc)]) <-  1
                      	diag(LHS[(nr+nc+1):(nr+2*nc),1       :nc    ]) <- -1
                      	diag(LHS[(nr+nc+1):(nr+2*nc),(2*nc+1):(3*nc)]) <-  1
                      }else{
                      	diag(LHS[(nr+1)   :(nr+nc)  ,1       :nc    ]) <-  1
                      	diag(LHS[(nr+1)   :(nr+nc)  ,(nc+1)  :(2*nc)]) <-  -1
                      	diag(LHS[(nr+nc+1):(nr+2*nc),1       :nc    ]) <- -1
                      	diag(LHS[(nr+nc+1):(nr+2*nc),(2*nc+1):(3*nc)]) <-  1
                      }
                      
    
                      # fix the value of the objective function
                      LHS[(nr+2*nc+1),1:nc] <- obj_coef(model)
    
    
                      # ---------------------------------------------
                      # columns
                      # ---------------------------------------------
    
                      lower  <- c(lowbnd(model), rep(0, 2*nc))
                      upper  <- c(uppbnd(model), rep(absMAX, 2*nc))
    
    
                      # ---------------------------------------------
                      # rows
                      # ---------------------------------------------
    
                      #rlower <- c(rhs(model), rep(0, 2*nc), currmo)
                      #rupper <- c(rhs(model), rep(absMAX, 2*nc + 1))
                      rlower <- c(rep(0, nr), rep(0, 2*nc), currmo)
                      rupper <- c(rep(0, nr), rep(absMAX, 2*nc + 1))
                      if(lpdir == "min"){
                      	rtype  <- c(rep("E", nr), rep("L", 2*nc), "L")
                      }else{
                      	rtype  <- c(rep("E", nr), rep("U", 2*nc), "L")
                      }
    
                      # ---------------------------------------------
                      # objective function
                      # ---------------------------------------------
    
                      if (is.null(costcoeffw)) {
                          fw <- rep(1, nc)
                      }
                      else {
                          stopifnot(is(costcoeffw, "numeric"),
                                    (length(costcoeffw) == nc))
                          fw <- costcoeffw
                      }
    
                      if (is.null(costcoefbw)) {
                          bw <- fw
                      }
                      else {
                          stopifnot(is(costcoefbw, "numeric"),
                                    (length(costcoefbw) == nc))
                          bw <- costcoefbw
                      }
    
    
                      cobj <- c(rep(0, nc), bw, fw)
    
    
                      # ---------------------------------------------
                      # row and column names for the problem object
                      # ---------------------------------------------
    
                      if (isTRUE(useNames)) {
                          if (is.null(cnames)) {
                              cn <- c(react_id(model),
                                      paste("bw", react_id(model), sep = "_"),
                                      paste("fw", react_id(model), sep = "_")
                              )
                              colNames <- .makeLPcompatible(cn, prefix = "x")
                          }
                          else {
                              stopifnot(is(cnames, "character"),
                                        length(cnames) == nCols)
                              colNames <- cnames
                          }
    
                          if (is.null(rnames)) {
                              rn <- c(met_id(model),
                                      paste("bw", 1:nc, sep = "_"),
                                      paste("fw", 1:nc, sep = "_"),
                                      "obj_wt"
                              )
                              rowNames <- .makeLPcompatible(rn, prefix = "r")
                          }
                          else {
                              stopifnot(is(rnames, "character"),
                                        length(rnames) == nRows)
                              rowNames <- rnames
                          }
    
                          if (is.null(pname)) {
                              probName <- .makeLPcompatible(
                                  paste("MTF", mod_id(model), sep = "_"),
                                  prefix = "")
                          }
                          else {
                              stopifnot(is(pname, "character"),
                                        length(pname) == 1)
                              probName <- pname
                          }
                      }
                      else {
                          colNames <- NULL
                          rowNames <- NULL
                          probName <- NULL
                      }
    
    
                      # ---------------------------------------------
                      # build problem object
                      # ---------------------------------------------
    
                      .Object <- callNextMethod(.Object,
                                                sbalg      = "mtf",
                                                pType      = "lp",
                                                scaling    = scaling,
                                                fi         = fi,
                                                nCols      = nCols,
                                                nRows      = nRows,
                                                mat        = LHS,
                                                ub         = upper,
                                                lb         = lower,
                                                obj        = cobj,
                                                rlb        = rlower,
                                                rub        = rupper,
                                                rtype      = rtype,
                                                lpdir      = lpdir,
                                                ctype      = NULL,
                                                cnames     = colNames,
                                                rnames     = rowNames,
                                                pname      = probName,
                                                algPar     = list("wtobj" = wtobj,
                                                                 "costcoefbw" = bw,
                                                                 "costcoeffw" = fw),
                                                ...)
    
                      .Object@maxobj <- as.numeric(maxobj)
    
                      if (!is.null(writeProbToFileName)) {
                          writeProb(problem(.Object),
                                    fname = as.character(writeProbToFileName))
                      }
    #
    #                  # ---------------------------------------------
    #                  # build problem object
    #                  # ---------------------------------------------
    #
    #                  lp <- optObj(solver = solver, method = method)
    #                  lp <- initProb(lp, nrows = nRows, ncols = nCols)
    #
    #                  # ---------------------------------------------
    #                  # set control parameters
    #                  # ---------------------------------------------
    #
    #                  if (!any(is.na(solverParm))) {
    #                      setSolverParm(lp, solverParm)
    #                  }
    #    
    #
    #                  loadLPprob(lp,
    #                             nCols = nCols,
    #                             nRows = nRows,
    #                             mat   = LHS,
    #                             ub    = upper,
    #                             lb    = lower,
    #                             obj   = cobj,
    #                             rlb   = rlower,
    #                             rub   = rupper,
    #                             rtype = rtype,
    #                             lpdir = "min"
    #                  )
    #                  
    #                  if (!is.null(scaling)) {
    #                      scaleProb(lp, scaling)
    #                  }
    #                  
    #                  .Object@problem   <- lp
    #                  .Object@algorithm <- "mtf"
    #                  .Object@nr        <- as.integer(nRows)
    #                  .Object@nc        <- as.integer(nCols)
    #                  .Object@fldind    <- as.integer(fi)
    #                  validObject(.Object)
    
                  }
                  return(.Object)
              }
    )
    
    
    #------------------------------------------------------------------------------#
    #                                other methods                                 #
    #------------------------------------------------------------------------------#
    
    setMethod("changeMaxObj", signature(object = "sysBiolAlg_mtf"),
        function(object, j) {
    
            if (!is.null(object@maxobj)) {
                changeRowsBnds(problem(object), i = nr(object),
                               lb = object@maxobj[j], ub = SYBIL_SETTINGS("MAXIMUM"))
            }
    
            return(invisible(TRUE))
        }
    )