1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
"""Test functionalities of MOMA."""
from typing import List
import numpy as np
import pytest
from cobra import Model
from cobra.flux_analysis.moma import add_moma
def test_moma_sanity(model: Model, qp_solvers: List[str]) -> None:
"""Test optimization criterion and optimality for MOMA."""
model.solver = qp_solvers
sol = model.optimize()
with model:
model.reactions.PFK.knock_out()
knock_sol = model.optimize()
ssq = (knock_sol.fluxes - sol.fluxes).pow(2).sum()
with model:
add_moma(model, linear=False)
model.reactions.PFK.knock_out()
moma_sol = model.optimize()
moma_ssq = (moma_sol.fluxes - sol.fluxes).pow(2).sum()
# Use normal FBA as reference solution.
with model:
add_moma(model, solution=sol, linear=False)
model.reactions.PFK.knock_out()
moma_ref_sol = model.optimize()
moma_ref_ssq = (moma_ref_sol.fluxes - sol.fluxes).pow(2).sum()
assert np.isclose(moma_sol.objective_value, moma_ssq)
assert moma_ssq < ssq
assert np.isclose(moma_sol.objective_value, moma_ref_sol.objective_value)
assert np.isclose(moma_ssq, moma_ref_ssq)
def test_linear_moma_sanity(model: Model, all_solvers: List[str]) -> None:
"""Test optimization criterion and optimality for linear MOMA."""
model.solver = all_solvers
sol = model.optimize()
with model:
model.reactions.PFK.knock_out()
knock_sol = model.optimize()
sabs = (knock_sol.fluxes - sol.fluxes).abs().sum()
with model:
add_moma(model, linear=True)
model.reactions.PFK.knock_out()
moma_sol = model.optimize()
moma_sabs = (moma_sol.fluxes - sol.fluxes).abs().sum()
# Use normal FBA as reference solution.
with model:
add_moma(model, solution=sol, linear=True)
model.reactions.PFK.knock_out()
moma_ref_sol = model.optimize()
moma_ref_sabs = (moma_ref_sol.fluxes - sol.fluxes).abs().sum()
assert np.allclose(moma_sol.objective_value, moma_sabs)
assert moma_sabs < sabs
assert np.isclose(moma_sol.objective_value, moma_ref_sol.objective_value)
assert np.isclose(moma_sabs, moma_ref_sabs)
with model:
add_moma(model, linear=True)
with pytest.raises(ValueError):
add_moma(model)
|