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