mxlmodels 1.1.0__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. mxlmodels-1.3.0/.editorconfig +19 -0
  2. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.github/dependabot.yml +1 -1
  3. mxlmodels-1.3.0/.github/workflows/release.yml +166 -0
  4. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.github/workflows/tests.yml +2 -2
  5. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.gitignore +7 -5
  6. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/PKG-INFO +3 -1
  7. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/README.md +2 -0
  8. mxlmodels-1.3.0/docs/_dynamic_enterobactin.ipynb +153 -0
  9. mxlmodels-1.1.0/docs/pop_dyn.ipynb → mxlmodels-1.3.0/docs/_population_dynamics.ipynb +1 -3
  10. mxlmodels-1.1.0/docs/trip_dyn.ipynb → mxlmodels-1.3.0/docs/_tripartite_dynamics.ipynb +1 -3
  11. mxlmodels-1.3.0/docs/davis2017.ipynb +321 -0
  12. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/ebeling2026.ipynb +15 -5
  13. mxlmodels-1.1.0/docs/saadat2021.ipynb → mxlmodels-1.3.0/docs/ebenhoeh2014.ipynb +2 -4
  14. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/elowitz2000_repressilator.ipynb +1 -3
  15. mxlmodels-1.3.0/docs/fvcb.ipynb +326 -0
  16. mxlmodels-1.3.0/docs/hahn1987.ipynb +197 -0
  17. mxlmodels-1.3.0/docs/index.md +8 -0
  18. mxlmodels-1.3.0/docs/lazar1997.ipynb +112 -0
  19. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/lotka_volterra.ipynb +1 -3
  20. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/matuszynska2016_npq.ipynb +15 -5
  21. mxlmodels-1.3.0/docs/matuszynska2016_phd.ipynb +53 -0
  22. mxlmodels-1.3.0/docs/matuszynska2019.ipynb +61 -0
  23. mxlmodels-1.3.0/docs/nguyen2026_tomato.ipynb +125 -0
  24. mxlmodels-1.3.0/docs/pfennig2024_synechocystis.ipynb +234 -0
  25. mxlmodels-1.3.0/docs/poolman2000.ipynb +89 -0
  26. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/prigogine1968_brusselator.ipynb +1 -3
  27. mxlmodels-1.3.0/docs/saadat2021.ipynb +53 -0
  28. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/selkov1968_oscillator.ipynb +1 -3
  29. mxlmodels-1.3.0/docs/stylesheets/extra.css +3 -0
  30. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/yokota1985.ipynb +1 -3
  31. mxlmodels-1.3.0/docs/zhu_2009.ipynb +141 -0
  32. mxlmodels-1.3.0/mkdocs.yml +81 -0
  33. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/pyproject.toml +7 -6
  34. mxlmodels-1.3.0/src/mxlmodels/__init__.py +74 -0
  35. mxlmodels-1.3.0/src/mxlmodels/_dynamic_enterobactin.py +183 -0
  36. mxlmodels-1.3.0/src/mxlmodels/_names.py +235 -0
  37. mxlmodels-1.1.0/src/mxlmodels/pop_dyn.py → mxlmodels-1.3.0/src/mxlmodels/_population_dynamics.py +1 -1
  38. mxlmodels-1.1.0/src/mxlmodels/trip_dyn.py → mxlmodels-1.3.0/src/mxlmodels/_tripartite_dynamics.py +1 -1
  39. mxlmodels-1.3.0/src/mxlmodels/bellasio2019.py +1168 -0
  40. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/__init__.py +13 -1
  41. mxlmodels-1.3.0/src/mxlmodels/davis2017.py +560 -0
  42. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/ebeling2026.py +10 -2
  43. mxlmodels-1.3.0/src/mxlmodels/ebenhoeh2014.py +789 -0
  44. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/elowitz2000_repressilator.py +10 -6
  45. mxlmodels-1.3.0/src/mxlmodels/fuente2024.py +742 -0
  46. mxlmodels-1.3.0/src/mxlmodels/hahn1987.py +430 -0
  47. mxlmodels-1.3.0/src/mxlmodels/lazar1997.py +359 -0
  48. mxlmodels-1.3.0/src/mxlmodels/li2021.py +978 -0
  49. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/lotka_volterra_v1.py +12 -2
  50. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/lotka_volterra_v2.py +12 -2
  51. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/matuszynska2016_npq.py +9 -4
  52. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/matuszynska2016_phd.py +10 -5
  53. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/matuszynska2019.py +9 -4
  54. mxlmodels-1.3.0/src/mxlmodels/nguyen2026_tomato.py +1212 -0
  55. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/pfennig2024_synechocystis.py +9 -7
  56. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/poolman2000.py +10 -6
  57. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/prigogine1968_brusselator.py +8 -5
  58. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/saadat2021.py +9 -4
  59. mxlmodels-1.1.0/src/mxlmodels/selkov1968_glycolysis_oscillator.py → mxlmodels-1.3.0/src/mxlmodels/selkov1968_oscillator.py +8 -5
  60. mxlmodels-1.3.0/src/mxlmodels/sir.py +56 -0
  61. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/yokota1985.py +9 -4
  62. mxlmodels-1.3.0/src/mxlmodels/zhu2009.py +128 -0
  63. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_dynamic_enterobactin.py +6 -1
  64. mxlmodels-1.3.0/tests/test_ebenhoeh2014.py +24 -0
  65. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_import.py +1 -0
  66. mxlmodels-1.3.0/tests/test_nguyen2026_tomato.py +29 -0
  67. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_pfennig2024_synechocystis.py +1 -1
  68. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/uv.lock +333 -329
  69. mxlmodels-1.1.0/.github/workflows/docs.yml +0 -43
  70. mxlmodels-1.1.0/.github/workflows/python-publish.yml +0 -55
  71. mxlmodels-1.1.0/.github/workflows/release-to-slack.yml +0 -77
  72. mxlmodels-1.1.0/docs/matuszynska2016_phd.ipynb +0 -29
  73. mxlmodels-1.1.0/docs/matuszynska2019.ipynb +0 -35
  74. mxlmodels-1.1.0/docs/pfennig2024-synechocystis.ipynb +0 -61
  75. mxlmodels-1.1.0/docs/poolman2000.ipynb +0 -29
  76. mxlmodels-1.1.0/src/mxlmodels/__init__.py +0 -46
  77. mxlmodels-1.1.0/src/mxlmodels/dyn_entro.py +0 -184
  78. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.gitattributes +0 -0
  79. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  80. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.github/ISSUE_TEMPLATE/discussion.md +0 -0
  81. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  82. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.pre-commit-config.yaml +0 -0
  83. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.python-version +0 -0
  84. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/.vscode/settings.json +0 -0
  85. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/CONTRIBUTING.md +0 -0
  86. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/LICENSE +0 -0
  87. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/SECURITY.md +0 -0
  88. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/docs/assets/logo.png +0 -0
  89. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/__init__.py +0 -0
  90. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/README.md +0 -0
  91. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/cool_white_led.csv +0 -0
  92. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/fluorescent_lamp.csv +0 -0
  93. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/halogen_lamp.csv +0 -0
  94. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/incandescent_bulb.csv +0 -0
  95. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/solar.csv +0 -0
  96. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/lights/warm_white_led.csv +0 -0
  97. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/ocp_absorption.csv +0 -0
  98. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/per_pigment/README.md +0 -0
  99. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/per_pigment/allophycocyanin.csv +0 -0
  100. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/per_pigment/beta_carotene.csv +0 -0
  101. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/per_pigment/chla.csv +0 -0
  102. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/per_pigment/phycocyanin.csv +0 -0
  103. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/photosystem_composition.csv +0 -0
  104. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/data/pfennig2024/pigment_concentrations.csv +0 -0
  105. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/src/mxlmodels/py.typed +0 -0
  106. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/__init__.py +0 -0
  107. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_ebeling_2026.py +0 -0
  108. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_elowitz2000_repressilator.py +0 -0
  109. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_lotka_volterra_v1.py +0 -0
  110. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_lotka_volterra_v2.py +0 -0
  111. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_matuszynska2016_npq.py +0 -0
  112. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_matuszynska2016_phd.py +0 -0
  113. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_matuszynska2019.py +0 -0
  114. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_poolman2000.py +0 -0
  115. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_population_dynamics.py +0 -0
  116. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_prigogine1968_brusselator.py +0 -0
  117. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_saadat2021.py +0 -0
  118. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_selkov1968_glycolysis_oscillator.py +0 -0
  119. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_tripartite_dynamics.py +0 -0
  120. {mxlmodels-1.1.0 → mxlmodels-1.3.0}/tests/test_yokota1985.py +0 -0
@@ -0,0 +1,19 @@
1
+
2
+ # Unix-style newlines with a newline ending every file
3
+ [*]
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+
7
+ # Matches multiple files with brace expansion notation
8
+ # Set default charset
9
+ [*.{js,py}]
10
+ charset = utf-8
11
+
12
+ # 4 space indentation
13
+ [*.py]
14
+ indent_style = space
15
+ indent_size = 4
16
+
17
+ [.toml]
18
+ indent_style = space
19
+ indent_size = 2
@@ -5,7 +5,7 @@ updates:
5
5
  directory: "/"
6
6
  schedule:
7
7
  interval: "weekly"
8
- day: "monday"
8
+ day: "saturday"
9
9
  time: "05:00"
10
10
  assignees:
11
11
  - "marvinvanaalst"
@@ -0,0 +1,166 @@
1
+ name: Upload Python Package
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch: {}
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build-documentation:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: write
16
+ steps:
17
+ - uses: actions/checkout@v6
18
+ with:
19
+ fetch-depth: 0 # fetch all commits/branches
20
+
21
+ - name: Configure Git Credentials
22
+ run: |
23
+ git config user.name github-actions[bot]
24
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@v8.2.0
28
+
29
+ - name: Set up Python
30
+ run: uv python install 3.12
31
+
32
+ - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
33
+ - uses: actions/cache@v5
34
+ with:
35
+ key: mkdocs-material-${{ env.cache_id }}
36
+ path: .cache
37
+ restore-keys: |
38
+ mkdocs-material-
39
+
40
+ - run: uv sync --all-extras --all-groups
41
+ - run: uv run python -c "import toml;print('VERSION={}'.format(toml.load(open('pyproject.toml'))['project']['version']))" >> $GITHUB_ENV
42
+ - run: uv run mike deploy --update-aliases --push ${{ env.VERSION }} latest
43
+ - run: uv run mike set-default --push latest
44
+
45
+ build-release:
46
+ runs-on: ubuntu-latest
47
+ steps:
48
+ - uses: actions/checkout@v6
49
+
50
+ - name: Install uv
51
+ uses: astral-sh/setup-uv@v8.2.0
52
+
53
+ - name: Set up Python
54
+ run: uv python install 3.13
55
+
56
+ - name: Set Python version
57
+ run: uv venv --python 3.13
58
+
59
+ - name: Build release distribution
60
+ run: uv build
61
+
62
+ - name: Upload distributions
63
+ uses: actions/upload-artifact@v7
64
+ with:
65
+ name: release-dists
66
+ path: dist/
67
+
68
+ pypi-publish:
69
+ runs-on: ubuntu-latest
70
+ needs:
71
+ - build-release
72
+ - build-documentation
73
+ permissions:
74
+ id-token: write
75
+
76
+ environment:
77
+ name: pypi
78
+
79
+ steps:
80
+ - name: Retrieve release distributions
81
+ uses: actions/download-artifact@v8
82
+ with:
83
+ name: release-dists
84
+ path: dist/
85
+
86
+ - name: Publish release distributions to PyPI
87
+ uses: pypa/gh-action-pypi-publish@release/v1
88
+ with:
89
+ packages-dir: dist/
90
+
91
+ notify-slack:
92
+ runs-on: ubuntu-latest
93
+ needs:
94
+ - pypi-publish
95
+
96
+ # github.event.release.* not populated if run via
97
+ # workflow_dispatch
98
+ if: github.event_name == 'release'
99
+
100
+ steps:
101
+ - name: Send release notification to Slack
102
+ env:
103
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
104
+ RELEASE_NAME: ${{ github.event.release.name }}
105
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
106
+ RELEASE_BODY: ${{ github.event.release.body }}
107
+ RELEASE_URL: ${{ github.event.release.html_url }}
108
+ REPO: ${{ github.repository }}
109
+ run: |
110
+ payload=$(jq -n \
111
+ --arg text "*New Release Published* :tada:" \
112
+ --arg repo "$REPO" \
113
+ --arg name "$RELEASE_NAME" \
114
+ --arg tag "$RELEASE_TAG" \
115
+ --arg body "$RELEASE_BODY" \
116
+ --arg url "$RELEASE_URL" \
117
+ '{
118
+ text: $text,
119
+ blocks: [
120
+ {
121
+ type: "section",
122
+ text: {
123
+ type: "mrkdwn",
124
+ text: "*New Release Published* :tada:"
125
+ }
126
+ },
127
+ {
128
+ type: "section",
129
+ fields: [
130
+ { type: "mrkdwn", text: "*Repository:*\n\($repo)" },
131
+ { type: "mrkdwn", text: "*Tag:*\n\($tag)" }
132
+ ]
133
+ },
134
+ {
135
+ type: "section",
136
+ text: {
137
+ type: "mrkdwn",
138
+ text: "*Release:*\n\($name)"
139
+ }
140
+ },
141
+ {
142
+ type: "section",
143
+ text: {
144
+ type: "mrkdwn",
145
+ text: "*Notes:*\n\($body)"
146
+ }
147
+ },
148
+ {
149
+ type: "actions",
150
+ elements: [
151
+ {
152
+ type: "button",
153
+ text: {
154
+ type: "plain_text",
155
+ text: "View Release"
156
+ },
157
+ url: $url
158
+ }
159
+ ]
160
+ }
161
+ ]
162
+ }')
163
+
164
+ curl -X POST -H 'Content-type: application/json' \
165
+ --data "$payload" \
166
+ "$SLACK_WEBHOOK_URL"
@@ -12,10 +12,10 @@ jobs:
12
12
  default-tests:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v6
16
16
 
17
17
  - name: Install uv
18
- uses: astral-sh/setup-uv@v4
18
+ uses: astral-sh/setup-uv@v8.2.0
19
19
 
20
20
  - name: Set up Python
21
21
  run: uv python install 3.13
@@ -1,3 +1,10 @@
1
+ # temporary files and folders
2
+ papers/
3
+ *temp*
4
+ tmp
5
+ src/mxlbricks
6
+ src/mxlweb
7
+
1
8
  # Byte-compiled / optimized / DLL files
2
9
  __pycache__/
3
10
  *.py[cod]
@@ -102,11 +109,6 @@ venv.bak/
102
109
  # mypy
103
110
  .mypy_cache/
104
111
 
105
- # temporary files and folders
106
- *temp*
107
- tmp
108
- src/mxlbricks
109
- src/mxlweb
110
112
 
111
113
  # pixi environments
112
114
  .pixi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mxlmodels
3
- Version: 1.1.0
3
+ Version: 1.3.0
4
4
  Summary: MxlModels is a Python package of reference mechanistic models.
5
5
  Author-email: Marvin van Aalst <marvin.vanaalst@gmail.com>
6
6
  Maintainer-email: Marvin van Aalst <marvin.vanaalst@gmail.com>
@@ -55,6 +55,8 @@ Done. Simple as that.
55
55
  | Matuszyńska 2019 | Merges PETC (Ebenhöh 2014), NPQ (Matuszynska 2016) and CBB (Poolman 2000) |
56
56
  | Saadat 2021 | 2019 + Mehler (Valero ?) & Thioredoxin & extendend PSI states & consumption |
57
57
  | Ebeling 2026 | unpublishd |
58
+ | Hahn 1987 | Photosynthesis and Photorespiration |
59
+ | Lazar 1997 | Fluorescence induction |
58
60
 
59
61
 
60
62
  ## Tool family 🏠
@@ -28,6 +28,8 @@ Done. Simple as that.
28
28
  | Matuszyńska 2019 | Merges PETC (Ebenhöh 2014), NPQ (Matuszynska 2016) and CBB (Poolman 2000) |
29
29
  | Saadat 2021 | 2019 + Mehler (Valero ?) & Thioredoxin & extendend PSI states & consumption |
30
30
  | Ebeling 2026 | unpublishd |
31
+ | Hahn 1987 | Photosynthesis and Photorespiration |
32
+ | Lazar 1997 | Fluorescence induction |
31
33
 
32
34
 
33
35
  ## Tool family 🏠
@@ -0,0 +1,153 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "8616db3a",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Race for iron: shaping tripartite community\n",
9
+ "\n",
10
+ "This model was being developed collaboratively within the SFB MibiNet community to study how the structure of a synthetic microbial community is shaped by different siderophores"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": null,
16
+ "id": "c6f8d298",
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "import matplotlib.lines as mlines\n",
21
+ "import numpy as np\n",
22
+ "import pandas as pd\n",
23
+ "from matplotlib import colormaps\n",
24
+ "from matplotlib import pyplot as plt\n",
25
+ "from mxlpy import Simulator, plot, scan\n",
26
+ "\n",
27
+ "from mxlmodels import get_dynamic_enterobactin"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": null,
33
+ "id": "40b6a58d",
34
+ "metadata": {},
35
+ "outputs": [],
36
+ "source": [
37
+ "_ = (\n",
38
+ " Simulator(get_dynamic_enterobactin())\n",
39
+ " .simulate(20)\n",
40
+ " .get_result()\n",
41
+ " .unwrap_or_err()\n",
42
+ " .variables.plot()\n",
43
+ ")"
44
+ ]
45
+ },
46
+ {
47
+ "cell_type": "code",
48
+ "execution_count": null,
49
+ "id": "35201750",
50
+ "metadata": {},
51
+ "outputs": [],
52
+ "source": [
53
+ "total_biomass = 0.11 # g/L\n",
54
+ "\n",
55
+ "res = scan.time_course(\n",
56
+ " get_dynamic_enterobactin(),\n",
57
+ " to_scan=pd.DataFrame(\n",
58
+ " [\n",
59
+ " (f * total_biomass, (1 - f) * total_biomass)\n",
60
+ " for f in np.linspace(0.05, 0.95, 19)\n",
61
+ " ],\n",
62
+ " columns=[\"x1\", \"x2\"],\n",
63
+ " ),\n",
64
+ " time_points=np.linspace(0, 20, 101),\n",
65
+ ")"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": null,
71
+ "id": "07954d38",
72
+ "metadata": {},
73
+ "outputs": [],
74
+ "source": [
75
+ "fig, ax = plt.subplots(figsize=(6, 4))\n",
76
+ "res.variables[\"x1\"].unstack().T.plot(\n",
77
+ " ax=ax, lw=\"0.8\", alpha=0.3, color=\"green\", legend=False\n",
78
+ ")\n",
79
+ "res.variables[\"x2\"].unstack().T.plot(\n",
80
+ " ax=ax, lw=\"0.8\", alpha=0.5, color=\"red\", legend=False\n",
81
+ ")\n",
82
+ "res.variables[\"s1\"].unstack().T.plot(\n",
83
+ " ax=ax, lw=\"0.8\", alpha=0.5, color=\"black\", legend=False\n",
84
+ ")\n",
85
+ "plot.add_grid(ax)\n",
86
+ "ax.legend(\n",
87
+ " handles=[\n",
88
+ " mlines.Line2D([], [], color=\"green\", label=\"x1\"),\n",
89
+ " mlines.Line2D([], [], color=\"red\", label=\"x2\"),\n",
90
+ " mlines.Line2D([], [], color=\"black\", label=\"s1\"),\n",
91
+ " ]\n",
92
+ ")\n",
93
+ "ax.set(\n",
94
+ " title=\"\",\n",
95
+ " xlabel=\"time / h\",\n",
96
+ " ylabel=\"conc / (g / L)\",\n",
97
+ ")\n",
98
+ "plt.show()"
99
+ ]
100
+ },
101
+ {
102
+ "cell_type": "code",
103
+ "execution_count": null,
104
+ "id": "d22b8f7e",
105
+ "metadata": {},
106
+ "outputs": [],
107
+ "source": [
108
+ "cmap = colormaps[\"RdYlGn_r\"]\n",
109
+ "colors = cmap(res.to_scan[\"x2\"] / res.to_scan.sum(axis=1))\n",
110
+ "\n",
111
+ "fig, (ax1, ax2) = plt.subplots(2, 1)\n",
112
+ "\n",
113
+ "ax = res.fluxes[\"mu1\"].unstack().T.plot(ax=ax1, color=colors, legend=False)\n",
114
+ "ax.set(\n",
115
+ " ylim=(0.0, 0.5),\n",
116
+ " xlabel=\"time / h\",\n",
117
+ " ylabel=\"growth rate e. coli / (1/h)\",\n",
118
+ ")\n",
119
+ "plot.add_grid(ax)\n",
120
+ "\n",
121
+ "ax = res.fluxes[\"mu2\"].unstack().T.plot(ax=ax2, color=colors, legend=False)\n",
122
+ "ax.set(\n",
123
+ " ylim=(0.0, 0.5),\n",
124
+ " xlabel=\"time / h\",\n",
125
+ " ylabel=\"growth rate c. glut / (1/h)\",\n",
126
+ ")\n",
127
+ "plot.add_grid(ax)\n",
128
+ "plt.show()"
129
+ ]
130
+ }
131
+ ],
132
+ "metadata": {
133
+ "kernelspec": {
134
+ "display_name": "git-mxl-meta (3.13.12)",
135
+ "language": "python",
136
+ "name": "python3"
137
+ },
138
+ "language_info": {
139
+ "codemirror_mode": {
140
+ "name": "ipython",
141
+ "version": 3
142
+ },
143
+ "file_extension": ".py",
144
+ "mimetype": "text/x-python",
145
+ "name": "python",
146
+ "nbconvert_exporter": "python",
147
+ "pygments_lexer": "ipython3",
148
+ "version": "3.13.12"
149
+ }
150
+ },
151
+ "nbformat": 4,
152
+ "nbformat_minor": 5
153
+ }
@@ -7,9 +7,7 @@
7
7
  "metadata": {},
8
8
  "outputs": [],
9
9
  "source": [
10
- "from mxlpy import Simulator, plot\n",
11
- "\n",
12
- "from mxlmodels import get_population_dynamics\n",
10
+ "from mxlmodels import Simulator, get_population_dynamics, plot\n",
13
11
  "\n",
14
12
  "res = Simulator(get_population_dynamics()).simulate(1).get_result().unwrap_or_err()\n",
15
13
  "\n",
@@ -7,9 +7,7 @@
7
7
  "metadata": {},
8
8
  "outputs": [],
9
9
  "source": [
10
- "from mxlpy import Simulator, plot\n",
11
- "\n",
12
- "from mxlmodels import get_tripartite_dynamics\n",
10
+ "from mxlmodels import Simulator, get_tripartite_dynamics, plot\n",
13
11
  "\n",
14
12
  "res = Simulator(get_tripartite_dynamics()).simulate(10).get_result().unwrap_or_err()\n",
15
13
  "\n",