Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed dgf bug #463

Merged
merged 10 commits into from
Apr 10, 2024
8 changes: 4 additions & 4 deletions .github/workflows/run_tox.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@ jobs:

- uses: actions/checkout@v2

- name: Set up Python 3.9
- name: Set up Python 3.10
uses: actions/setup-python@v2
with:
python-version: '3.9'
python-version: '3.10'

- name: Set up Python 3.10
- name: Set up Python 3.11
uses: actions/setup-python@v2
with:
python-version: '3.10'
python-version: '3.11'

- name: Install build dependencies
run: |
Expand Down
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repos:
- id: check-merge-conflict
- id: detect-private-key
- repo: https://github.com/psf/black
rev: 22.10.0
rev: 24.3.0
hooks:
- id: black
- repo: https://github.com/pycqa/isort
Expand All @@ -19,6 +19,6 @@ repos:
name: isort (python)
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.0.278
rev: v0.3.4
hooks:
- id: ruff
2 changes: 1 addition & 1 deletion docs/getting_started.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This page explains how to install Maud and use its command line interface.

## Installing Maud

Maud is compatible with Python versions 3.9 and above
Maud is compatible with Python versions 3.10 and above.

We recommend using a fresh virtual environment to install Maud. To make one and
then activate it, run the following commands:
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
24 changes: 24 additions & 0 deletions maud/data/example_inputs/linear_multidgf/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name = "linear_multidgf"
kinetic_model_file = "kinetic_model.toml"
priors_file = "priors.toml"
experiments_file = "experiments.toml"
likelihood = true
steady_state_threshold_abs = 1e-6

[cmdstanpy_config]
refresh = 1
iter_warmup = 300
iter_sampling = 300
chains = 4
save_warmup = true
seed = 1234

[ode_solver_config]
abs_tol = 1e-4
rel_tol = 1e-6
max_num_steps = 1e6

[algebra_solver_config]
abs_tol = 1e-4
rel_tol = 1e-6
max_num_steps = 1e6
32 changes: 32 additions & 0 deletions maud/data/example_inputs/linear_multidgf/experiments.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[[experiment]]
id = "condition1"
is_train = true
is_test = true
temperature = 299.0
measurements = [
{target_type = "mic", metabolite = "M1", compartment = "c", value = 0.59, error_scale = 0.1},
{target_type = "mic", metabolite = "M1", compartment = "e", value = 1.09, error_scale = 0.05},
{target_type = "mic", metabolite = "M2", compartment = "e", value = 1.05, error_scale = 0.05},
{target_type = "flux", reaction = "r3", value = 0.19, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r1", value = 1.5, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r2", value = 1.5, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r3", value = 1.5, error_scale = 0.1},
]
initial_state = [
{metabolite = "M2", compartment = "c", value = 0.38},
]

[[experiment]]
id = "condition2"
is_train = true
is_test = true
measurements = [
{target_type = "mic", metabolite = "M1", compartment = "c", value = 0.54, error_scale = 0.1},
{target_type = "mic", metabolite = "M2", compartment = "c", value = 0.38, error_scale = 0.1},
{target_type = "mic", metabolite = "M1", compartment = "e", value = 1.12, error_scale = 0.05},
{target_type = "mic", metabolite = "M2", compartment = "e", value = 1.14, error_scale = 0.05},
{target_type = "flux", reaction = "r3", value = 0.39, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r1", value = 1.5, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r2", value = 1.5, error_scale = 0.1},
{target_type = "enzyme", enzyme = "r3", value = 1.5, error_scale = 0.1},
]
66 changes: 66 additions & 0 deletions maud/data/example_inputs/linear_multidgf/kinetic_model.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name = "Example kinetic model"

compartment = [
{id = 'c', name = 'cytosol', volume = 1},
{id = 'e', name = 'external', volume = 1},
]

metabolite = [
{id = "M1", name = "Metabolite number 1"},
{id = "M2", name = "Metabolite number 2"},
]

enzyme = [
{id = "r1", name = "r1ase", subunits = 1},
{id = "r2", name = "r2ase", subunits = 1},
{id = "r3", name = "r3ase", subunits = 1},
]

metabolite_in_compartment = [
{metabolite_id = "M1", compartment_id = "e", balanced = false},
{metabolite_id = "M1", compartment_id = "c", balanced = true},
{metabolite_id = "M2", compartment_id = "c", balanced = true},
{metabolite_id = "M2", compartment_id = "e", balanced = false},
]
enzyme_reaction = [
{enzyme_id = "r1", reaction_id = "r1"},
{enzyme_id = "r2", reaction_id = "r2"},
{enzyme_id = "r3", reaction_id = "r3"},
]

[[reaction]]
id = "r1"
name = "Reaction number 1"
mechanism = "reversible_michaelis_menten"
stoichiometry = { M1_e = -1, M1_c = 1}

[[reaction]]
id = "r2"
name = "Reaction number 2"
mechanism = "irreversible_michaelis_menten"
stoichiometry = { M1_c = -1, M2_c = 1}

[[reaction]]
id = "r3"
name = "Reaction number 3"
mechanism = "reversible_michaelis_menten"
stoichiometry = { M2_c = -1, M2_e = 1}
transported_charge = 1

[[allostery]]
enzyme_id = "r1"
metabolite_id = "M2"
compartment_id = "c"
modification_type = "activation"

[[allostery]]
enzyme_id = "r2"
metabolite_id = "M1"
compartment_id = "c"
modification_type = "inhibition"

[[competitive_inhibition]]
enzyme_id = "r2"
reaction_id = "r2"
metabolite_id = "M1"
compartment_id = "c"
37 changes: 37 additions & 0 deletions maud/data/example_inputs/linear_multidgf/parameters.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
kcat = [
{exploc = 1, scale = 0.6, reaction = "r1", enzyme = "r1"},
{exploc = 1, scale = 0.6, reaction = "r2", enzyme = "r2"},
{exploc = 1, scale = 0.6, reaction = "r3", enzyme = "r3"},
]

km = [
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "e", enzyme = "r1"},
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "c", enzyme = "r1"},
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "c", enzyme = "r2"},
{exploc = 1, scale = 0.6, metabolite = "M2", compartment = "c", enzyme = "r3"},
{exploc = 1, scale = 0.6, metabolite = "M2", compartment = "e", enzyme = "r3"},
]

transfer_constant = [
{exploc = 1, scale = 0.6, enzyme = "r1"},
{exploc = 1, scale = 0.6, enzyme = "r2"},
]

dissociation_constant = [
{exploc = 1, scale = 0.6, enzyme = "r1", metabolite = "M2", compartment = "c", modification_type = "activation"},
{exploc = 1, scale = 0.6, enzyme = "r2", metabolite = "M1", compartment = "c", modification_type = "inhibition"},
]

psi = [
{location = -0.95, scale = 0.2, experiment = "condition1"},
{location = -0.95, scale = 0.2, experiment = "condition2"},
]

ki = [
{exploc = 1, scale = 0.6, enzyme = "r2", reaction = "r2", metabolite = "M1", compartment = "c"},
]

[dgf]
ids = [ "M1", "M2" ]
mean_vector = [-1, -2]
covariance_matrix = [ [0.5, 0.5], [0.5, 0.5] ]
37 changes: 37 additions & 0 deletions maud/data/example_inputs/linear_multidgf/priors.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
kcat = [
{exploc = 1, scale = 0.6, reaction = "r1", enzyme = "r1"},
{exploc = 1, scale = 0.6, reaction = "r2", enzyme = "r2"},
{exploc = 1, scale = 0.6, reaction = "r3", enzyme = "r3"},
]

km = [
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "e", enzyme = "r1"},
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "c", enzyme = "r1"},
{exploc = 1, scale = 0.6, metabolite = "M1", compartment = "c", enzyme = "r2"},
{exploc = 1, scale = 0.6, metabolite = "M2", compartment = "c", enzyme = "r3"},
{exploc = 1, scale = 0.6, metabolite = "M2", compartment = "e", enzyme = "r3"},
]

transfer_constant = [
{exploc = 1, scale = 0.6, enzyme = "r1"},
{exploc = 1, scale = 0.6, enzyme = "r2"},
]

dissociation_constant = [
{exploc = 1, scale = 0.6, enzyme = "r1", metabolite = "M2", compartment = "c", modification_type = "activation"},
{exploc = 1, scale = 0.6, enzyme = "r2", metabolite = "M1", compartment = "c", modification_type = "inhibition"},
]

psi = [
{location = -0.95, scale = 0.2, experiment = "condition1"},
{location = -0.95, scale = 0.2, experiment = "condition2"},
]

ki = [
{exploc = 1, scale = 0.6, enzyme = "r2", reaction = "r2", metabolite = "M1", compartment = "c"},
]

[dgf]
ids = [ "M1", "M2" ]
mean_vector = [ -10, -32]
covariance_matrix = [ [5,2], [2,4] ]
Empty file.
2 changes: 2 additions & 0 deletions maud/data_model/maud_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,6 @@ def inits_dict(self) -> Dict:
for met, init in met_to_init.items()
if met not in param.fixed_ids[0]
]
elif param.fixable:
inits_dict[param.name + "_free"] = param.inits.inits_unscaled
return inits_dict
6 changes: 4 additions & 2 deletions maud/data_model/maud_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ class MaudParameter(BaseModel):
init_input: Optional[List[InitAtomInput]]
ids: List[List[str]]
split_ids: List[List[List[str]]]
fixable: bool = False
measurements: Optional[List[Measurement]] = None

@computed_field
def fixed_ids(self) -> Optional[List[List[str]]]:
"""Set the fixed_ids field."""
if self.name != "dgf":
if not self.fixable:
return None
elif self.user_input is None:
return None
Expand All @@ -60,7 +61,7 @@ def fixed_ids(self) -> Optional[List[List[str]]]:
@computed_field
def fixed_values(self) -> Optional[List[List[float]]]:
"""Set the fixed_values field."""
if self.name != "dgf":
if not self.fixable:
return None
elif self.user_input is None:
return None
Expand Down Expand Up @@ -244,6 +245,7 @@ class Dgf(MaudParameter):
default_scale: float = 10
prior_in_test_model: bool = False
prior_in_train_model: bool = True
fixable: bool = True


class DissociationConstant(MaudParameter):
Expand Down
22 changes: 11 additions & 11 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ classifiers = [
license = {text = "GNU General Public License version 3"}
description = "Bayesian statistical models of metabolic networks"
readme = "README.rst"
requires-python = ">=3.9"
requires-python = ">=3.10"
dependencies = [
"pip >= 20",
"arviz >= 0.12.1",
"arviz >= 0.18.0",
"importlib_resources >= 3.2",
"numpy",
"scipy",
Expand Down Expand Up @@ -76,6 +76,7 @@ packages = [
"maud.data.example_inputs.example_ode",
"maud.data.example_inputs.linear",
"maud.data.example_inputs.methionine",
"maud.data.example_inputs.linear_multidgf",
"maud.data.example_outputs",
"maud.data.example_outputs.linear",
"maud.data.example_outputs.linear.user_input",
Expand All @@ -85,7 +86,6 @@ packages = [

[tool.black]
line-length = 80
python-version = ['py38', 'py39']
exclude = '''
(
__init__.py
Expand Down Expand Up @@ -117,23 +117,23 @@ markers = ["raises"]
[tool.ruff]
# Enable the following rules:
# pycodestyle (`E`), Pyflakes (`F`), pycodestyle (`W`), flake8-bugbear (`B`)
select = ["E", "F", "B", "W", "D"]
ignore = [
lint.select = ["E", "F", "B", "W", "D"]
lint.ignore = [
"B905", # Use zip() without a `strict` parameter.
"D107", # Init methods can be undocumented.
"D203", # Class docstrints don't need blank lines before them.
"D213", # https://beta.ruff.rs/docs/rules/multi-line-summary-second-line/
"D104", # __init__.py can be empty.
]
fixable = ["ALL"]
unfixable = []
lint.fixable = ["ALL"]
lint.unfixable = []
line-length = 80
target-version = "py310"

[tool.tox]
legacy_tox_ini = """
[tox]
envlist = isort, black, ruff, safety, py3{9,10}
envlist = isort, black, ruff, safety, py3{10,11}

[testenv]
deps =
Expand All @@ -143,11 +143,11 @@ legacy_tox_ini = """
commands =
pytest --cov=maud --cov-report=term --ignore=tests/test_integration {posargs}

[testenv:py38]
[testenv:py310]
passenv =
CMDSTAN

[testenv:py39]
[testenv:py311]
passenv =
CMDSTAN

Expand All @@ -171,7 +171,7 @@ legacy_tox_ini = """
deps=
ruff
commands=
ruff .
ruff check .

[testenv:safety]
deps=
Expand Down
11 changes: 9 additions & 2 deletions tests/test_unit/test_load_maud_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import numpy as np
from numpy.testing import assert_equal

from maud.data.example_inputs import linear
from maud.data.example_inputs import linear, linear_multidgf
from maud.loading_maud_inputs import load_maud_input


Expand All @@ -22,7 +22,7 @@ def test_load_maud_input():
"dissociation_constant": [["r1_M2_c_activation", "r2_M1_c_inhibition"]],
}
linear_files = importlib_resources.files(linear)
mi = load_maud_input(data_path=linear_files._paths[0]) # path 0 is package
mi = load_maud_input(data_path=str(linear_files)) # path 0 is package
r1 = next(r for r in mi.kinetic_model.reactions if r.id == "r1")
assert r1.stoichiometry == {"M1_e": -1, "M1_c": 1}
assert "r1_r1" in mi.parameters.kcat.ids[0]
Expand All @@ -36,3 +36,10 @@ def test_load_maud_input():
actual = v.tolist() if isinstance(v, np.ndarray) else v
expected = expected_stan_input[k]
assert_equal(actual, expected, err_msg=f"{k} different from expected.")


def test_load_multidgf():
"""Test that the multidgf input loads correctly."""
files = importlib_resources.files(linear_multidgf)
mi = load_maud_input(data_path=str(files)) # path 0 is package
assert mi.inits_dict["dgf_free"] == [-10.0, -32.0]
Loading