# <markdowncell>
# Example script for creating SBML repressilator with sbmlutils.
# https://github.com/matthiaskoenig/libsbgn-python
import os
from pathlib import Path
from sbmlutils.factory import (
AssignmentRule,
Compartment,
FactoryResult,
Model,
ModelUnits,
Parameter,
Reaction,
Species,
Units,
create_model,
)
from sbmlutils.metadata import *
from sbmlutils.metadata import BQB
from combine_notebooks import RESULTS_DIR
model = Model(
"repressilator_sbmlutils",
units=Units,
model_units=ModelUnits(
time=Units.second,
substance=Units.mole,
extent=Units.mole,
volume=Units.litre,
),
compartments=[
Compartment(
sid="cell",
value=1.0,
sboTerm="SBO:0000290",
annotations=[(BQB.IS, "obo.go/GO:0005623")],
)
],
# obo.go/GO:3A0005623
species=[
Species(
sid="PX",
compartment="cell",
name="LacI protein",
sboTerm="SBO:0000252",
initialAmount=0,
hasOnlySubstanceUnits=True,
annotations=[(BQB.IS, "uniprot/P03023")],
),
Species(
sid="PY",
compartment="cell",
name="TetR protein",
sboTerm="SBO:0000252",
initialAmount=0,
hasOnlySubstanceUnits=True,
annotations=[(BQB.IS, "uniprot/P04483")],
),
Species(
sid="PZ",
compartment="cell",
name="cI protein",
sboTerm="SBO:0000252",
initialAmount=0,
hasOnlySubstanceUnits=True,
annotations=[(BQB.IS, "uniprot/P03034")],
),
Species(
sid="X",
compartment="cell",
name="Lacl mRNA",
sboTerm="SBO:0000250",
initialAmount=20,
hasOnlySubstanceUnits=True,
annotations=[
(BQB.IS_VERSION_OF, "chebi/CHEBI:33699"),
(BQB.IS_VERSION_OF, "kegg.compound/C00046"),
(BQB.ENCODES, "uniprot/P03023"),
],
),
Species(
sid="Y",
compartment="cell",
name="TetR mRNA",
sboTerm="SBO:0000250",
initialAmount=20,
hasOnlySubstanceUnits=True,
annotations=[
(BQB.IS_VERSION_OF, "chebi/CHEBI:33699"),
(BQB.IS_VERSION_OF, "kegg.compound/C00046"),
(BQB.ENCODES, "uniprot/P04483"),
],
),
Species(
sid="Z",
compartment="cell",
name="cl mRNA",
sboTerm="SBO:0000250",
initialAmount=0,
hasOnlySubstanceUnits=True,
annotations=[
(BQB.IS_VERSION_OF, "chebi/CHEBI:33699"),
(BQB.IS_VERSION_OF, "kegg.compound/C00046"),
(BQB.ENCODES, "uniprot/P03034"),
],
),
],
parameters=[
Parameter(sid="tau_mRNA", name="mRNA half life", constant=True, value=2.0),
Parameter(sid="kd_mRNA", name="kd_mRNA", constant=False, sboTerm="SBO:0000356"),
Parameter(sid="k_tl", name="k_tl", constant=False, sboTerm="SBO:0000016"),
Parameter(
sid="t_ave",
name="average mRNA life time",
constant=False,
sboTerm="SBO:0000348",
),
Parameter(sid="eff", name="translation efficiency", constant=True, value=20),
Parameter(sid="kd_prot", name="kd_prot", constant=False, sboTerm="SBO:0000356"),
Parameter(sid="tau_prot", name="protien half life", constant=True, value=10),
Parameter(sid="a0_tr", name="a0_tr", constant=False, sboTerm="SBO:0000485"),
Parameter(sid="ps_0", name="tps_repr", constant=True, value=0.0005),
Parameter(sid="ps_a", name="tps_active", constant=True, value=0.5),
Parameter(sid="KM", name="KM", constant=True, value=40),
Parameter(sid="n", name="n", constant=True, value=2.0),
Parameter(sid="a_tr", name="a_tr", constant=False, sboTerm="SBO:0000186"),
],
rules=[
AssignmentRule(
variable="kd_mRNA",
sid="kd_mRNA",
value="ln(2) / tau_mRNA",
name="kd_MRNA",
sboTerm=None,
),
AssignmentRule(
variable="t_ave",
sid="t_ave",
value="tau_mRNA / ln(2)",
name="t_ave",
sboTerm=None,
),
AssignmentRule(
variable="k_tl", sid="k_tl", value="eff / t_ave", name="k_tl", sboTerm=None
),
AssignmentRule(
variable="kd_prot",
sid="kd_prot",
value="ln(2) / tau_prot",
name="kd_prot",
sboTerm=None,
),
AssignmentRule(
variable="a0_tr", sid="a0_tr", value="ps_0 * 60", name="a0_tr", sboTerm=None
),
AssignmentRule(
variable="a_tr",
sid="a_tr",
value="(ps_a - ps_0) * 60",
name="a_tr",
sboTerm=None,
),
],
reactions=[
Reaction(
sid="Reaction1",
sboTerm="SBO:0000179",
name="degradation of LacI transcripts",
reversible=False,
equation="X -> ",
formula=("kd_mRNA * X", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006402")],
),
Reaction(
sid="Reaction2",
sboTerm="SBO:0000179",
name="degradation of TetR transcripts",
reversible=False,
equation="Y -> ",
formula=("kd_mRNA * Y", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006402")],
),
Reaction(
sid="Reaction3",
sboTerm="SBO:0000179",
name="degradation of CI transcripts",
reversible=False,
equation="Z -> ",
formula=("kd_mRNA * Z", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006402")],
),
Reaction(
sid="Reaction4",
sboTerm="SBO:0000184",
name="translation of LacI",
reversible=False,
equation=" -> PX [X]",
formula=("k_tl * X", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006412")],
),
Reaction(
sid="Reaction5",
sboTerm="SBO:0000184",
name="translation of TetR",
reversible=False,
equation=" -> PY [Y]",
formula=("k_tl * Y", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006412")],
),
Reaction(
sid="Reaction6",
sboTerm="SBO:0000184",
name="translation of CI",
reversible=False,
equation=" -> PZ [Z]",
formula=("k_tl *Z", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006412")],
),
Reaction(
sid="Reaction7",
sboTerm="SBO:0000179",
name="degradation of LacI",
reversible=False,
equation="PX -> ",
formula=("kd_prot * PX", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0030163")],
),
Reaction(
sid="Reaction8",
sboTerm="SBO:0000179",
name="degradation of TetR",
reversible=False,
equation="PY -> ",
formula=("kd_prot * PY", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0030163")],
),
Reaction(
sid="Reaction9",
sboTerm="SBO:0000179",
name="degradation of CI",
reversible=False,
equation="PZ -> ",
formula=("kd_prot * PZ", None),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0030163")],
),
Reaction(
sid="Reaction10",
sboTerm="SBO:0000183",
name="transcription of LacI",
reversible=False,
equation=" -> X [PZ]",
formula=(
"a0_tr + (a_tr * power(KM, n)) / (power(KM, n) + power(PZ, n))",
None,
),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006351")],
),
Reaction(
sid="Reaction11",
sboTerm="SBO:0000183",
name="transcription of TetR",
reversible=False,
equation=" -> Y [PX]",
formula=(
"a0_tr + (a_tr * power(KM, n)) / (power(KM, n) + power(PX, n))",
None,
),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006351")],
),
Reaction(
sid="Reaction12",
sboTerm="SBO:0000184",
name="transcription of CI",
reversible=False,
equation=" -> Z [PY]",
formula=(
"a0_tr + (a_tr * power(KM, n)) / (power(KM, n) + power(PY, n))",
None,
),
annotations=[(BQB.IS_VERSION_OF, "obo.go/GO:0006351")],
),
],
)
def create_repressilator(sbml_path: Path) -> FactoryResult:
"""Create the repressilator model in the results_dir."""
results = create_model(
model=model,
filepath=sbml_path,
sbml_level=2,
sbml_version=3,
)
return results
if __name__ == "__main__":
# RESOURCES_DIR: Path = Path(__file__).parent / "resources"
# RESULTS_DIR: Path = RESOURCES_DIR / "results"
sbml_path = RESULTS_DIR / "repressilator_sbml_sbmlutils.xml"
os.makedirs(os.path.dirname(str(sbml_path)), exist_ok=True)
create_repressilator(sbml_path=sbml_path)
─────────────────────────────────────────────────── Create SBML ───────────────────────────────────────────────────
INFO Create SBML for model 'repressilator_sbmlutils' factory.py:3526
WARNING 'name' should be set on 'Model(sid='repressilator_sbmlutils', packages=[<Package.COMP_V1: factory.py:441 'comp-v1'>], model_units=<sbmlutils.factory.ModelUnits object at 0x7f0b8800b8b0>, units=<class 'sbmlutils.factory.Units'>, compartments=[cell = 1.0 [None]], species=[<sbmlutils.factory.Species object at 0x7f0b8800b850>, <sbmlutils.factory.Species object at 0x7f0b8800b820>, <sbmlutils.factory.Species object at 0x7f0b8800b7f0>, <sbmlutils.factory.Species object at 0x7f0b8800b7c0>, <sbmlutils.factory.Species object at 0x7f0b8800b790>, <sbmlutils.factory.Species object at 0x7f0b8800b760>], parameters=[tau_mRNA = 2.0 [None], kd_mRNA = None [None], k_tl = None [None], t_ave = None [None], eff = 20 [None], kd_prot = None [None], tau_prot = 10 [None], a0_tr = None [None], ps_0 = 0.0005 [None], ps_a = 0.5 [None], KM = 40 [None], n = 2.0 [None], a_tr = None [None]], rules=[kd_mRNA = ln(2) / tau_mRNA [UnitDefinition(dimensionless, dimensionless)], t_ave = tau_mRNA / ln(2) [UnitDefinition(dimensionless, dimensionless)], k_tl = eff / t_ave [UnitDefinition(dimensionless, dimensionless)], kd_prot = ln(2) / tau_prot [UnitDefinition(dimensionless, dimensionless)], a0_tr = ps_0 * 60 [UnitDefinition(dimensionless, dimensionless)], a_tr = (ps_a - ps_0) * 60 [UnitDefinition(dimensionless, dimensionless)]], reactions=[<sbmlutils.factory.Reaction object at 0x7f0b8800b340>, <sbmlutils.factory.Reaction object at 0x7f0b8800b1f0>, <sbmlutils.factory.Reaction object at 0x7f0b8800b220>, <sbmlutils.factory.Reaction object at 0x7f0b8800b130>, <sbmlutils.factory.Reaction object at 0x7f0b8800afe0>, <sbmlutils.factory.Reaction object at 0x7f0b8800b040>, <sbmlutils.factory.Reaction object at 0x7f0b8800aef0>, <sbmlutils.factory.Reaction object at 0x7f0b8800ae30>, <sbmlutils.factory.Reaction object at 0x7f0b8800ad70>, <sbmlutils.factory.Reaction object at 0x7f0b8800acb0>, <sbmlutils.factory.Reaction object at 0x7f0b8800abf0>, <sbmlutils.factory.Reaction object at 0x7f0b8800ab30>], _FrozenClass__isfrozen=True)'
INFO 'length' should be set in 'model_units'. factory.py:266
INFO 'area' should be set in 'model_units'. factory.py:266
WARNING 'sboTerm' should be set on 'Parameter(tau_mRNA, mRNA half life)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(eff, translation efficiency)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(tau_prot, protien half life)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(ps_0, tps_repr)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(ps_a, tps_active)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(KM, KM)' factory.py:466
WARNING 'sboTerm' should be set on 'Parameter(n, n)' factory.py:466
WARNING 'name' should be set on 'Compartment(cell, SBO:0000290, [(<BQB.IS: 'BQB_IS'>, factory.py:441 'obo.go/GO:0005623')])'
────────────────────────────────────────────────── Validate SBML ──────────────────────────────────────────────────
file:///home/vboxuser/Documents/compbiolibs/combine-notebooks/results/repressilator_sbmlutils.xml valid : TRUE validation error(s) : 0 validation warnings(s) : 31 check time (s) : 0.065
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING E0: SBML unit consistency (core, L231, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression 'log(2) / tau_mRNA' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E1: SBML unit consistency (core, L243, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression 'tau_mRNA / log(2)' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E2: SBML unit consistency (core, L255, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression 'eff / t_ave' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E3: SBML unit consistency (core, L264, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression 'log(2) / tau_prot' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E4: SBML unit consistency (core, L276, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression 'ps_0 * 60' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E5: SBML unit consistency (core, L285, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <assignmentRule> <math> expression '(ps_a - ps_0) * 60' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E6: SBML unit consistency (core, L320, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_mRNA * X' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E7: SBML unit consistency (core, L350, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_mRNA * Y' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E8: SBML unit consistency (core, L380, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_mRNA * Z' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E9: SBML unit consistency (core, L413, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'k_tl * X' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E10: SBML unit consistency (core, L446, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'k_tl * Y' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E11: SBML unit consistency (core, L479, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'k_tl * Z' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E12: SBML unit consistency (core, L509, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_prot * PX' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E13: SBML unit consistency (core, L539, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_prot * PY' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E14: SBML unit consistency (core, L569, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'kd_prot * PZ' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E15: SBML unit consistency (core, L602, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'a0_tr + a_tr * pow(KM, n) / (pow(KM, n) + pow(PZ, n))' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E16: SBML unit consistency (core, L659, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'a0_tr + a_tr * pow(KM, n) / (pow(KM, n) + pow(PX, n))' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E17: SBML unit consistency (core, L716, code) validation.py:186 [Warning] Missing unit declarations on parameters or literal numbers in expression In situations where a mathematical expression contains literal numbers or parameters whose units have not been declared, it is not possible to verify accurately the consistency of the units in the expression. The units of the <kineticLaw> <math> expression 'a0_tr + a_tr * pow(KM, n) / (pow(KM, n) + pow(PY, n))' cannot be fully checked. Unit consistency reported as either no errors or further unit errors related to this object may not be accurate.
WARNING E18: Modeling practice (core, L144, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'tau_mRNA' does not have a 'units' attribute.
WARNING E19: Modeling practice (core, L145, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'kd_mRNA' does not have a 'units' attribute.
WARNING E20: Modeling practice (core, L158, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'k_tl' does not have a 'units' attribute.
WARNING E21: Modeling practice (core, L171, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 't_ave' does not have a 'units' attribute.
WARNING E22: Modeling practice (core, L184, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'eff' does not have a 'units' attribute.
WARNING E23: Modeling practice (core, L185, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'kd_prot' does not have a 'units' attribute.
WARNING E24: Modeling practice (core, L198, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'tau_prot' does not have a 'units' attribute.
WARNING E25: Modeling practice (core, L199, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'a0_tr' does not have a 'units' attribute.
WARNING E26: Modeling practice (core, L212, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'ps_0' does not have a 'units' attribute.
WARNING E27: Modeling practice (core, L213, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'ps_a' does not have a 'units' attribute.
WARNING E28: Modeling practice (core, L214, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'KM' does not have a 'units' attribute.
WARNING E29: Modeling practice (core, L215, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'n' does not have a 'units' attribute.
WARNING E30: Modeling practice (core, L216, code) validation.py:186 [Warning] It's best to declare units for every parameter in a model As a principle of best modeling practice, the units of a <parameter> should be declared rather than be left undefined. Doing so improves the ability of software to check the consistency of units and helps make it easier to detect potential errors in models. The <parameter> with the id 'a_tr' does not have a 'units' attribute.
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────