cameo also contains state-of-the-art deterministic methods for knockout prediction:
Burgard, A.P., Pharkya, P., Maranas, C.D. (2003), "OptKnock: A Bilevel Programming Framework for Identifying Gene Knockout Strategies for Microbial Strain Optimization," Biotechnology and Bioengineering, 84(6), 647-657.
OptKnock uses the following bi-level formulation:
$$ \begin{matrix} maximize & \mathit{v_{chemical}} & & (\mathbf{OptKnock}) \\ \mathit{y_j} & & & \\ subject~to & maximize & \mathit{v_{biomass}} & (\mathbf{Primal}) \\ & \mathit{v_j} & & & & \\ \end{matrix}\\ \begin{bmatrix} subject~to & \sum_{j=1}^{M}S_{ij}v_{j} = 0,\\ & v_{carbon\_uptake} = v_{carbon~target}\\ & v_{apt} \ge v_{apt\_main}\\ & v_{biomass} \ge v_{target_biomass}\\ & v_{j}^{min} \cdot y_j \le v_j \le v_{j}^{max} \cdot y_j, \forall j \in \boldsymbol{M} \\ \end{bmatrix}\\ \begin{align} & y_j = {0, 1}, & & \forall j \in \boldsymbol{M} & \\ & \sum_{j \in M} (1 - y_j) \le K& & & \\ \end{align} $$from cameo import models
from cameo.strain_design.deterministic.linear_programming import OptKnock
model = models.bigg.iJO1366
On initialization, OptKnock will compute essential reaction, blocked reaction (via FVA, it is optional). All of those preprocessing conditions allow OptKnock to run faster by reducing the search space (the number of variables).
Exchange reactions are also removed from the formulation.
optknock = OptKnock(model)
Running OptKnock requires at least two parameters:
OptKnockout will return one solution by default, but max_results can be set to another number. It will try to find up to max_results unless the problem becomes infeasible, meaning that all solutions have been found.
%time result = optknock.run(2, "EX_succ_e", max_results=2)
CPU times: user 13min 50s, sys: 5.44 s, total: 13min 56s Wall time: 4min 47s
result