@@ -18,7 +18,7 @@ flux_balance_analysis(model::M, optimizer) where {M<:MetabolicModel} =
Run flux balance analysis (FBA) on the `model` optionally specifying `objective_rxn(s)` and their `weights` (empty `weights` mean equal weighting per reaction).
Optionally also specify any additional flux constraints with `constraints`, a dictionary mapping reaction `id`s to tuples of (lb, ub) flux constraints.
Note, the `optimizer` must be set to perform the analysis, any JuMP solver will work.
Note, the `optimizer` must be set to perform the analysis, any JuMP solver will work.
The `solver_attributes` can also be specified in the form of a dictionary where each (key, value) pair will be passed to `set_optimizer_attribute(cbmodel, key, value)`.
This function builds the optimization problem from the model, and hence uses the constraints implied by the model object.
Returns a dictionary of reaction `id`s mapped to fluxes if solved successfully, otherwise an empty dictionary.
@@ -116,7 +116,7 @@ Run flux variability analysis (FVA) on the `model` with `objective_rxn(s)` and o
It runs fba on the model once to determine the optimum of the objective.
Optionally also specify any additional flux constraints with `constraints`, a dictionary mapping reaction `id`s to tuples of (ub, lb) flux constraints.
The model is then constrained to produce objective flux bounded by `optimum_bound` from below (set to slightly less than 1.0 for stability) and each flux in the model sequentially minimized and maximized.
Note, the `optimizer` must be set to perform the analysis, any JuMP solver will work.
Note, the `optimizer` must be set to perform the analysis, any JuMP solver will work.
The `solver_attributes` can also be specified in the form of a dictionary where each (key, value) pair will be passed to `set_optimizer_attribute(cbmodel, key, value)`.
This function builds the optimization problem from the model, and hence uses the constraints implied by the model object.
Returns two dictionaries (`fva_max` and `fva_min`) that each reaction `id`s to dictionaries of the resultant flux distributions (if solved successfully) when that `id` is optimized.
Perform basic hit and run sampling for `N` iterations using `model` with `optimizer` from `JuMP`.
Perform basic hit and run sampling for `N` iterations using `model` with `optimizer` from `JuMP`.
Additional constraints supplied by `constraints` as a dictionary of reaction `id`s mapped to a tuple of `(lb, ub)` of fluxes.
Every `keepevery` iteration is logged as a sample, where the sample size matrix has `samplesize` columns.
Solver specific settings can be set using `solver_attributes`.
Warm up points are generated in a flux variability sense, unless `random_objective` is true, in which case a randomly weighted objective is used 2*number of reactions to define the warmup points.
Note that N needs to be >> samplesize.
Sample size is the size of the samples kept in memory.
Note that N needs to be >> samplesize.
Sample size is the size of the samples kept in memory.
The larger samplesize is the better the approximation becomes, but the more memory the sampler requires.
See also: [`achr`](@ref)
...
...
@@ -126,13 +126,13 @@ function hit_and_run(
current_point=zeros(size(wpoints,1))
current_point.=wpoints[:,rand(1:nwpts)]# pick random initial point
δdirtol=1e-6# too small directions get ignored ≈ 0 (solver precision issue)
δdirtol=1e-6# too small directions get ignored ≈ 0 (solver precision issue)
sample_num=0
samplelength=0
updatesamplesizelength=true
forn=1:N
# direction = random point - current point
# direction = random point - current point
ifupdatesamplesizelength
direction_point=(@viewwpoints[:,rand(1:nwpts)])-(@viewcurrent_point[:])# use warmup points to find direction in warmup phase
else
...
...
@@ -157,7 +157,7 @@ function hit_and_run(
upper=1e10
end
lower>λmin&&(λmin=lower)# max min step size that satisfies all bounds
upper<λmax&&(λmax=upper)# min max step size that satisfies all bounds
upper<λmax&&(λmax=upper)# min max step size that satisfies all bounds
end
ifλmax<=λmin||λmin==-1e10||λmax==1e10# this sometimes can happen
...
...
@@ -260,12 +260,12 @@ function achr(
shat=mean(wpoints,dims=2)[:]# mean point
δdirtol=1e-6# too small directions get ignored ≈ 0 (solver precision issue)
δdirtol=1e-6# too small directions get ignored ≈ 0 (solver precision issue)
sample_num=0
samplelength=0
updatesamplesizelength=true
forn=1:N
ifupdatesamplesizelength# switch to samples
ifupdatesamplesizelength# switch to samples
direction_point=(@viewwpoints[:,rand(1:nwpts)])-(@viewcurrent_point[:])# use warmup points to find direction in warmup phase
else
direction_point=(@viewsamples[:,rand(1:(samplelength))])-(@viewshat[:])# after warmup phase, only find directions in sampled space
...
...
@@ -287,7 +287,7 @@ function achr(
upper=1e10
end
lower>λmin&&(λmin=lower)# max min step size that satisfies all bounds
upper<λmax&&(λmax=upper)# min max step size that satisfies all bounds
upper<λmax&&(λmax=upper)# min max step size that satisfies all bounds
end
ifλmax<=λmin||λmin==-1e10||λmax==1e10# this sometimes can happen