From 7f0fc9d252d9883e7e30ceebcaffbc46aae2ecb6 Mon Sep 17 00:00:00 2001 From: stelmo <stelmozors@gmail.com> Date: Thu, 1 Apr 2021 14:47:49 +0200 Subject: [PATCH] added constraint modification callback --- src/analysis/fba.jl | 23 ++++++++++++----------- src/base/utilities.jl | 12 ++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/analysis/fba.jl b/src/analysis/fba.jl index f5adcfdd3..7b9beed1e 100644 --- a/src/analysis/fba.jl +++ b/src/analysis/fba.jl @@ -65,16 +65,23 @@ sol = fba(model, biomass, optimizer; solver_attributes=atts) function fba( model::CobraModel, optimizer; - objective_func::Union{Reaction,Array{Reaction,1}} = Reaction[], - weights = Float64[], - solver_attributes = Dict{Any,Any}(), - constraints = Dict{String,Tuple{Float64,Float64}}(), - sense = MOI.MAX_SENSE, + modifications = [(model, opt_model)->nothing] ) + +objective_func::Union{Reaction,Array{Reaction,1}} = Reaction[] +weights = Float64[] +solver_attributes = Dict{Any,Any}() +sense = MOI.MAX_SENSE + # get core optimization problem cbm = make_optimization_model(model, optimizer, sense = sense) v = cbm[:x] # fluxes + # apply callbacks + for mod in modifications + mod(model, cbm) + end + # modify core optimization problem according to user specifications if !isempty(solver_attributes) # set other attributes for (k, val) in solver_attributes @@ -82,12 +89,6 @@ function fba( end end - # set additional constraints - for (rxnid, con) in constraints - ind = model.reactions[findfirst(model.reactions, rxnid)] - set_bound(ind, cbm; lb = con[1], ub = con[2]) - end - # if an objective function is supplied, modify the default objective if typeof(objective_func) == Reaction || !isempty(objective_func) # ensure that an array of objective indices are fed in diff --git a/src/base/utilities.jl b/src/base/utilities.jl index ac473dd56..e2d6d7233 100644 --- a/src/base/utilities.jl +++ b/src/base/utilities.jl @@ -34,3 +34,15 @@ function set_bound(vind, opt_model; ub = 1000, lb = -1000) end set_normalized_rhs(opt_model[:ubs][vind], ub) end + +""" + modify_constraint(reaction::Reaction, lb, ub) + +Modify constraints of model reaction. +""" +function modify_constraint(reaction::Reaction, lb, ub) + (model, opt_model) -> begin + ind = model.reactions[reaction] + set_bound(ind, opt_model, lb=lb, ub=ub) + end +end -- GitLab