raven-toolbox 0.2.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 (211) hide show
  1. raven_toolbox-0.2.0/.github/workflows/ci.yml +83 -0
  2. raven_toolbox-0.2.0/.gitignore +33 -0
  3. raven_toolbox-0.2.0/.readthedocs.yaml +28 -0
  4. raven_toolbox-0.2.0/CHANGELOG.md +281 -0
  5. raven_toolbox-0.2.0/IMPROVEMENTS.md +339 -0
  6. raven_toolbox-0.2.0/LICENSE +21 -0
  7. raven_toolbox-0.2.0/PKG-INFO +135 -0
  8. raven_toolbox-0.2.0/README.md +97 -0
  9. raven_toolbox-0.2.0/data/manifest.example.json +31 -0
  10. raven_toolbox-0.2.0/data/manifest.json +35 -0
  11. raven_toolbox-0.2.0/data/manifest.schema.json +82 -0
  12. raven_toolbox-0.2.0/docs/README.md +28 -0
  13. raven_toolbox-0.2.0/docs/_static/.gitkeep +0 -0
  14. raven_toolbox-0.2.0/docs/archive/ftinit_review_and_plan.md +184 -0
  15. raven_toolbox-0.2.0/docs/archive/localization_design.md +251 -0
  16. raven_toolbox-0.2.0/docs/archive/plan_get_model_from_homology.md +120 -0
  17. raven_toolbox-0.2.0/docs/conf.py +118 -0
  18. raven_toolbox-0.2.0/docs/guide/analysis_and_comparison.md +22 -0
  19. raven_toolbox-0.2.0/docs/guide/context_specific.md +41 -0
  20. raven_toolbox-0.2.0/docs/guide/index.md +21 -0
  21. raven_toolbox-0.2.0/docs/guide/io_and_manipulation.md +41 -0
  22. raven_toolbox-0.2.0/docs/guide/localization.md +20 -0
  23. raven_toolbox-0.2.0/docs/guide/omics.md +18 -0
  24. raven_toolbox-0.2.0/docs/guide/quickstart.md +67 -0
  25. raven_toolbox-0.2.0/docs/guide/reconstruction.md +41 -0
  26. raven_toolbox-0.2.0/docs/guide/tasks_and_gapfilling.md +26 -0
  27. raven_toolbox-0.2.0/docs/index.md +127 -0
  28. raven_toolbox-0.2.0/docs/installation.md +40 -0
  29. raven_toolbox-0.2.0/docs/maintenance/data_manifest.md +155 -0
  30. raven_toolbox-0.2.0/docs/maintenance/index.md +22 -0
  31. raven_toolbox-0.2.0/docs/maintenance/kegg_data_format.md +74 -0
  32. raven_toolbox-0.2.0/docs/maintenance/maintaining_binaries.md +236 -0
  33. raven_toolbox-0.2.0/docs/maintenance/maintaining_kegg_data.md +175 -0
  34. raven_toolbox-0.2.0/docs/reference/api/analysis.md +10 -0
  35. raven_toolbox-0.2.0/docs/reference/api/comparison.md +11 -0
  36. raven_toolbox-0.2.0/docs/reference/api/gapfilling.md +11 -0
  37. raven_toolbox-0.2.0/docs/reference/api/index.md +25 -0
  38. raven_toolbox-0.2.0/docs/reference/api/init.md +10 -0
  39. raven_toolbox-0.2.0/docs/reference/api/io.md +10 -0
  40. raven_toolbox-0.2.0/docs/reference/api/localization.md +12 -0
  41. raven_toolbox-0.2.0/docs/reference/api/manipulation.md +18 -0
  42. raven_toolbox-0.2.0/docs/reference/api/omics.md +10 -0
  43. raven_toolbox-0.2.0/docs/reference/api/reconstruction.md +24 -0
  44. raven_toolbox-0.2.0/docs/reference/api/resolvers.md +32 -0
  45. raven_toolbox-0.2.0/docs/reference/api/tasks.md +11 -0
  46. raven_toolbox-0.2.0/docs/reference/api/utils.md +16 -0
  47. raven_toolbox-0.2.0/docs/reference/changelog.md +2 -0
  48. raven_toolbox-0.2.0/docs/reference/improvements.md +2 -0
  49. raven_toolbox-0.2.0/docs/reference/index.md +26 -0
  50. raven_toolbox-0.2.0/docs/reference/known_issues.md +139 -0
  51. raven_toolbox-0.2.0/docs/reference/matlab_raven_backports.md +255 -0
  52. raven_toolbox-0.2.0/docs/reference/migration.md +120 -0
  53. raven_toolbox-0.2.0/docs/reference/todo.md +37 -0
  54. raven_toolbox-0.2.0/docs/reference/yaml_format.md +332 -0
  55. raven_toolbox-0.2.0/docs/requirements.txt +7 -0
  56. raven_toolbox-0.2.0/docs/studies/humangem_validation.md +117 -0
  57. raven_toolbox-0.2.0/docs/studies/index.md +26 -0
  58. raven_toolbox-0.2.0/docs/studies/init_param_calibration.md +342 -0
  59. raven_toolbox-0.2.0/docs/studies/init_solver_benchmark.md +67 -0
  60. raven_toolbox-0.2.0/docs/studies/kegg_hmm_cutoff_calibration.md +203 -0
  61. raven_toolbox-0.2.0/docs/studies/yeast_localization_benchmark.md +148 -0
  62. raven_toolbox-0.2.0/pyproject.toml +88 -0
  63. raven_toolbox-0.2.0/scripts/README.md +35 -0
  64. raven_toolbox-0.2.0/scripts/analyze_hmm_cutoffs.py +143 -0
  65. raven_toolbox-0.2.0/scripts/analyze_init_params.py +367 -0
  66. raven_toolbox-0.2.0/scripts/analyze_init_robustness.py +268 -0
  67. raven_toolbox-0.2.0/scripts/analyze_init_solvers.py +150 -0
  68. raven_toolbox-0.2.0/scripts/benchmark_localization_yeast.py +297 -0
  69. raven_toolbox-0.2.0/scripts/build_kegg_artefacts.py +130 -0
  70. raven_toolbox-0.2.0/scripts/make_registry_snippet.py +198 -0
  71. raven_toolbox-0.2.0/src/raven_toolbox/__init__.py +15 -0
  72. raven_toolbox-0.2.0/src/raven_toolbox/analysis/__init__.py +23 -0
  73. raven_toolbox-0.2.0/src/raven_toolbox/analysis/fseof.py +161 -0
  74. raven_toolbox-0.2.0/src/raven_toolbox/analysis/reporter.py +119 -0
  75. raven_toolbox-0.2.0/src/raven_toolbox/analysis/sampling.py +218 -0
  76. raven_toolbox-0.2.0/src/raven_toolbox/annotation/__init__.py +24 -0
  77. raven_toolbox-0.2.0/src/raven_toolbox/annotation/delta_g.py +115 -0
  78. raven_toolbox-0.2.0/src/raven_toolbox/annotation/sbo.py +180 -0
  79. raven_toolbox-0.2.0/src/raven_toolbox/binaries.py +185 -0
  80. raven_toolbox-0.2.0/src/raven_toolbox/biomass/__init__.py +50 -0
  81. raven_toolbox-0.2.0/src/raven_toolbox/biomass/config.py +95 -0
  82. raven_toolbox-0.2.0/src/raven_toolbox/biomass/gam.py +67 -0
  83. raven_toolbox-0.2.0/src/raven_toolbox/biomass/scale.py +207 -0
  84. raven_toolbox-0.2.0/src/raven_toolbox/comparison/__init__.py +23 -0
  85. raven_toolbox-0.2.0/src/raven_toolbox/comparison/compare.py +150 -0
  86. raven_toolbox-0.2.0/src/raven_toolbox/comparison/diff.py +285 -0
  87. raven_toolbox-0.2.0/src/raven_toolbox/conditions/__init__.py +25 -0
  88. raven_toolbox-0.2.0/src/raven_toolbox/conditions/apply.py +192 -0
  89. raven_toolbox-0.2.0/src/raven_toolbox/curation/__init__.py +54 -0
  90. raven_toolbox-0.2.0/src/raven_toolbox/curation/batch.py +460 -0
  91. raven_toolbox-0.2.0/src/raven_toolbox/data.py +215 -0
  92. raven_toolbox-0.2.0/src/raven_toolbox/gapfilling/__init__.py +9 -0
  93. raven_toolbox-0.2.0/src/raven_toolbox/gapfilling/fill.py +188 -0
  94. raven_toolbox-0.2.0/src/raven_toolbox/init/__init__.py +48 -0
  95. raven_toolbox-0.2.0/src/raven_toolbox/init/build.py +113 -0
  96. raven_toolbox-0.2.0/src/raven_toolbox/init/ftinit.py +330 -0
  97. raven_toolbox-0.2.0/src/raven_toolbox/init/genes.py +81 -0
  98. raven_toolbox-0.2.0/src/raven_toolbox/init/init.py +256 -0
  99. raven_toolbox-0.2.0/src/raven_toolbox/init/merge.py +226 -0
  100. raven_toolbox-0.2.0/src/raven_toolbox/init/prep.py +241 -0
  101. raven_toolbox-0.2.0/src/raven_toolbox/init/score.py +81 -0
  102. raven_toolbox-0.2.0/src/raven_toolbox/init/steps.py +62 -0
  103. raven_toolbox-0.2.0/src/raven_toolbox/init/taskfill.py +186 -0
  104. raven_toolbox-0.2.0/src/raven_toolbox/io/__init__.py +18 -0
  105. raven_toolbox-0.2.0/src/raven_toolbox/io/ec_data.py +392 -0
  106. raven_toolbox-0.2.0/src/raven_toolbox/io/excel.py +136 -0
  107. raven_toolbox-0.2.0/src/raven_toolbox/io/git.py +106 -0
  108. raven_toolbox-0.2.0/src/raven_toolbox/io/sif.py +96 -0
  109. raven_toolbox-0.2.0/src/raven_toolbox/io/yaml.py +494 -0
  110. raven_toolbox-0.2.0/src/raven_toolbox/localization/__init__.py +27 -0
  111. raven_toolbox-0.2.0/src/raven_toolbox/localization/predict.py +382 -0
  112. raven_toolbox-0.2.0/src/raven_toolbox/localization/scores.py +117 -0
  113. raven_toolbox-0.2.0/src/raven_toolbox/manifest.py +123 -0
  114. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/__init__.py +39 -0
  115. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/add.py +365 -0
  116. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/change.py +128 -0
  117. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/compartments.py +196 -0
  118. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/expand.py +126 -0
  119. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/irreversible.py +72 -0
  120. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/merge.py +147 -0
  121. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/parameters.py +78 -0
  122. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/remove.py +120 -0
  123. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/simplify.py +277 -0
  124. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/transfer.py +145 -0
  125. raven_toolbox-0.2.0/src/raven_toolbox/manipulation/transport.py +162 -0
  126. raven_toolbox-0.2.0/src/raven_toolbox/omics/__init__.py +23 -0
  127. raven_toolbox-0.2.0/src/raven_toolbox/omics/hpa.py +190 -0
  128. raven_toolbox-0.2.0/src/raven_toolbox/py.typed +0 -0
  129. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/__init__.py +1 -0
  130. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/homology/__init__.py +23 -0
  131. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/homology/blast.py +146 -0
  132. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/homology/hits.py +64 -0
  133. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/homology/homology.py +287 -0
  134. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/__init__.py +83 -0
  135. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/assemble.py +82 -0
  136. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/download.py +269 -0
  137. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/hmm.py +451 -0
  138. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/organism.py +168 -0
  139. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/parse.py +618 -0
  140. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/query.py +250 -0
  141. raven_toolbox-0.2.0/src/raven_toolbox/reconstruction/kegg/taxonomy.py +176 -0
  142. raven_toolbox-0.2.0/src/raven_toolbox/tasks/__init__.py +23 -0
  143. raven_toolbox-0.2.0/src/raven_toolbox/tasks/check.py +336 -0
  144. raven_toolbox-0.2.0/src/raven_toolbox/tasks/tasklist.py +141 -0
  145. raven_toolbox-0.2.0/src/raven_toolbox/utils/__init__.py +16 -0
  146. raven_toolbox-0.2.0/src/raven_toolbox/utils/balance.py +90 -0
  147. raven_toolbox-0.2.0/src/raven_toolbox/utils/gpr.py +148 -0
  148. raven_toolbox-0.2.0/src/raven_toolbox/utils/parse.py +59 -0
  149. raven_toolbox-0.2.0/src/raven_toolbox/utils/sort.py +21 -0
  150. raven_toolbox-0.2.0/src/raven_toolbox/utils/validate.py +86 -0
  151. raven_toolbox-0.2.0/tests/conftest.py +210 -0
  152. raven_toolbox-0.2.0/tests/test_analysis_fseof.py +112 -0
  153. raven_toolbox-0.2.0/tests/test_analysis_reporter.py +89 -0
  154. raven_toolbox-0.2.0/tests/test_analysis_sampling.py +133 -0
  155. raven_toolbox-0.2.0/tests/test_annotation.py +204 -0
  156. raven_toolbox-0.2.0/tests/test_binaries.py +155 -0
  157. raven_toolbox-0.2.0/tests/test_biomass.py +246 -0
  158. raven_toolbox-0.2.0/tests/test_change_grrules.py +49 -0
  159. raven_toolbox-0.2.0/tests/test_comparison.py +123 -0
  160. raven_toolbox-0.2.0/tests/test_comparison_diff.py +146 -0
  161. raven_toolbox-0.2.0/tests/test_conditions.py +211 -0
  162. raven_toolbox-0.2.0/tests/test_curation.py +270 -0
  163. raven_toolbox-0.2.0/tests/test_data.py +145 -0
  164. raven_toolbox-0.2.0/tests/test_gapfilling.py +125 -0
  165. raven_toolbox-0.2.0/tests/test_init.py +112 -0
  166. raven_toolbox-0.2.0/tests/test_init_build.py +119 -0
  167. raven_toolbox-0.2.0/tests/test_init_ftinit.py +139 -0
  168. raven_toolbox-0.2.0/tests/test_init_genes.py +71 -0
  169. raven_toolbox-0.2.0/tests/test_init_merge.py +109 -0
  170. raven_toolbox-0.2.0/tests/test_init_oracles.py +64 -0
  171. raven_toolbox-0.2.0/tests/test_init_pipeline.py +161 -0
  172. raven_toolbox-0.2.0/tests/test_init_solvers.py +133 -0
  173. raven_toolbox-0.2.0/tests/test_init_taskfill.py +83 -0
  174. raven_toolbox-0.2.0/tests/test_io_excel.py +111 -0
  175. raven_toolbox-0.2.0/tests/test_io_git.py +69 -0
  176. raven_toolbox-0.2.0/tests/test_io_sif.py +82 -0
  177. raven_toolbox-0.2.0/tests/test_io_yaml.py +260 -0
  178. raven_toolbox-0.2.0/tests/test_io_yaml_ec_data.py +434 -0
  179. raven_toolbox-0.2.0/tests/test_io_yaml_parity.py +364 -0
  180. raven_toolbox-0.2.0/tests/test_localization.py +227 -0
  181. raven_toolbox-0.2.0/tests/test_manifest.py +125 -0
  182. raven_toolbox-0.2.0/tests/test_manipulation_add.py +297 -0
  183. raven_toolbox-0.2.0/tests/test_manipulation_change.py +93 -0
  184. raven_toolbox-0.2.0/tests/test_manipulation_compartments.py +139 -0
  185. raven_toolbox-0.2.0/tests/test_manipulation_expand.py +288 -0
  186. raven_toolbox-0.2.0/tests/test_manipulation_find_duplicate.py +85 -0
  187. raven_toolbox-0.2.0/tests/test_manipulation_irreversible.py +144 -0
  188. raven_toolbox-0.2.0/tests/test_manipulation_merge.py +136 -0
  189. raven_toolbox-0.2.0/tests/test_manipulation_remove.py +97 -0
  190. raven_toolbox-0.2.0/tests/test_manipulation_simplify.py +184 -0
  191. raven_toolbox-0.2.0/tests/test_manipulation_transfer.py +137 -0
  192. raven_toolbox-0.2.0/tests/test_manipulation_transport.py +98 -0
  193. raven_toolbox-0.2.0/tests/test_omics_hpa.py +154 -0
  194. raven_toolbox-0.2.0/tests/test_parameters.py +60 -0
  195. raven_toolbox-0.2.0/tests/test_reconstruction_blast.py +78 -0
  196. raven_toolbox-0.2.0/tests/test_reconstruction_homology.py +138 -0
  197. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_download.py +133 -0
  198. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_hmm.py +328 -0
  199. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_organism.py +197 -0
  200. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_parse.py +230 -0
  201. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_phyl_dist.py +70 -0
  202. raven_toolbox-0.2.0/tests/test_reconstruction_kegg_query.py +132 -0
  203. raven_toolbox-0.2.0/tests/test_scripts_registry.py +58 -0
  204. raven_toolbox-0.2.0/tests/test_tasks.py +189 -0
  205. raven_toolbox-0.2.0/tests/test_tasks_essential.py +114 -0
  206. raven_toolbox-0.2.0/tests/test_utils_balance.py +76 -0
  207. raven_toolbox-0.2.0/tests/test_utils_gpr.py +84 -0
  208. raven_toolbox-0.2.0/tests/test_utils_parse.py +57 -0
  209. raven_toolbox-0.2.0/tests/test_utils_sort.py +42 -0
  210. raven_toolbox-0.2.0/tests/test_utils_validate.py +80 -0
  211. raven_toolbox-0.2.0/tests/tinit_oracles.py +161 -0
@@ -0,0 +1,83 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ # A push that obsoletes a previous run cancels it.
10
+ concurrency:
11
+ group: ci-${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ lint:
16
+ name: ruff
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v5
20
+ - uses: actions/setup-python@v6
21
+ with:
22
+ python-version: "3.12"
23
+ cache: pip
24
+ cache-dependency-path: pyproject.toml
25
+ - run: pip install --upgrade pip
26
+ # Pinned so the lint result is reproducible (unpinned ruff silently
27
+ # adds rules over time). Keep in sync with the ``dev`` extra in pyproject.
28
+ - run: pip install ruff==0.15.15
29
+ - run: ruff check .
30
+
31
+ typecheck:
32
+ name: mypy
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v5
36
+ - uses: actions/setup-python@v6
37
+ with:
38
+ python-version: "3.12"
39
+ cache: pip
40
+ cache-dependency-path: pyproject.toml
41
+ - run: pip install --upgrade pip
42
+ # Installs runtime deps + the dev extra (mypy). Third-party stubs are
43
+ # absent for cobra/optlang/scipy; ignore_missing_imports handles that.
44
+ - run: pip install -e ".[dev]"
45
+ - run: mypy
46
+
47
+ test:
48
+ name: pytest (py${{ matrix.python }})
49
+ runs-on: ubuntu-latest
50
+ strategy:
51
+ fail-fast: false
52
+ matrix:
53
+ python: ["3.11", "3.12", "3.13"]
54
+ steps:
55
+ - uses: actions/checkout@v5
56
+ - uses: actions/setup-python@v6
57
+ with:
58
+ python-version: ${{ matrix.python }}
59
+ cache: pip
60
+ cache-dependency-path: pyproject.toml
61
+ - run: pip install --upgrade pip
62
+ # ``-e .[dev,excel]`` so every optional extra is exercised.
63
+ # Gurobi is not installable on free runners; the relevant tests
64
+ # skip themselves when ``optlang.gurobi_interface`` cannot import.
65
+ - run: pip install -e ".[dev,excel]"
66
+ - run: pytest -q --maxfail=5 --durations=20
67
+
68
+ docs:
69
+ name: docs
70
+ runs-on: ubuntu-latest
71
+ steps:
72
+ - uses: actions/checkout@v5
73
+ - uses: actions/setup-python@v6
74
+ with:
75
+ python-version: "3.12"
76
+ cache: pip
77
+ cache-dependency-path: pyproject.toml
78
+ - run: pip install --upgrade pip
79
+ # The package (with autodoc's import-time extras) plus the docs toolchain.
80
+ - run: pip install -e ".[excel]" -r docs/requirements.txt
81
+ # ``-W --keep-going`` keeps the docs build warning-clean; mirrors the
82
+ # ReadTheDocs build (docs/conf.py + .readthedocs.yaml).
83
+ - run: sphinx-build -b html -W --keep-going docs docs/_build/html
@@ -0,0 +1,33 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ build/
8
+ dist/
9
+ .pytest_cache/
10
+ .ruff_cache/
11
+ .coverage
12
+ htmlcov/
13
+
14
+ # Virtual envs
15
+ .venv/
16
+ venv/
17
+ env/
18
+
19
+ # Editor / OS
20
+ .vscode/
21
+ .idea/
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # Docs build output
26
+ docs/_build/
27
+
28
+ # Tooling caches
29
+ .claude/
30
+
31
+ # Local data
32
+ *.pkl
33
+ *.cache
@@ -0,0 +1,28 @@
1
+ # ReadTheDocs build configuration
2
+ # https://docs.readthedocs.io/en/stable/config-file/v2.html
3
+ version: 2
4
+
5
+ build:
6
+ os: ubuntu-24.04
7
+ tools:
8
+ python: "3.12"
9
+
10
+ sphinx:
11
+ configuration: docs/conf.py
12
+ # Build fails on warnings would be too strict while the API docstrings are
13
+ # still being filled in; keep warnings visible but non-fatal.
14
+ fail_on_warning: false
15
+
16
+ python:
17
+ install:
18
+ # Install the package itself (with the optional extras autodoc needs to
19
+ # import every module) plus the docs-only toolchain.
20
+ - method: pip
21
+ path: .
22
+ extra_requirements:
23
+ - excel
24
+ - requirements: docs/requirements.txt
25
+
26
+ formats:
27
+ - pdf
28
+ - htmlzip
@@ -0,0 +1,281 @@
1
+ # Changelog
2
+
3
+ Milestones in the raven-toolbox port. For function-level status see
4
+ [docs/raven_migration.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/migration.md); for open work see
5
+ [docs/todo.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/todo.md).
6
+
7
+ ## 0.2.0 — 2026-06-14
8
+
9
+ Project rename plus KEGG-reconstruction and CI improvements.
10
+
11
+ * **Project renamed `raven-python` → `raven-toolbox`.** The import package is now
12
+ `raven_toolbox` (was `raven_python`) and the repository moved to
13
+ `SysBioChalmers/raven-toolbox`. Update imports and any `raven-python` git/URL
14
+ references accordingly. (#34)
15
+ * **De-novo KEGG query uses `hmmsearch` instead of `hmmscan`.**
16
+ `get_kegg_model_from_sequences` now runs one `hmmsearch` over the concatenated KO
17
+ library (`-Z` set to the profile count, so E-values and KO assignments are identical
18
+ to the previous `hmmscan` path) — the faster, more parallel search direction.
19
+ `ensure_kegg_hmm_library` no longer runs `hmmpress` (just gunzips); the published
20
+ `.hmm.gz` artefact is unchanged. (#32)
21
+ * **Domain-mode `get_kegg_model_for_organism_from_artefacts` auto-resolves the
22
+ taxonomy artefact** from the artefact directory, so `"prokaryotes"` /
23
+ `"eukaryotes"` no longer require an explicit `taxonomy=` path. (#31)
24
+ * **Test data no longer ships real KEGG records.** The on-disk
25
+ `tests/data/kegg_dump` is replaced by a session fixture that generates a fully
26
+ fictional KEGG-format dump at runtime, so no KEGG-derived data is redistributed. (#33)
27
+ * **Removed the visualization stub and the `[visualization]` extra** — an
28
+ unimplemented placeholder. (#30)
29
+ * **CI on Node 24** — `actions/checkout@v5`, `actions/setup-python@v6`. (#35)
30
+
31
+ ## 0.1.0 — 2026-06-10
32
+
33
+ First release with **published, downloadable KEGG artefacts**, plus a cobra-aligned
34
+ hardening pass (no behaviour change on well-formed inputs). Highlights:
35
+
36
+ * **KEGG artefacts published (`kegg116`):** `ensure_kegg_data` /
37
+ `ensure_kegg_hmm_library` fetch version-pinned, SHA256-verified files from the
38
+ GitHub release. Every artefact is **gzip + version-prefixed**
39
+ (`kegg116_<name>.gz`) so MATLAB and Windows read them with the built-in `gunzip`
40
+ (no external tool) — `organism_gene_ko` moved from xz to gzip for this. The core
41
+ model files (reference model + KO/reaction tables) ship as a single
42
+ `kegg116_core.tar.gz` that `ensure_kegg_data` extracts on first use; the HMM
43
+ libraries and `taxonomy` are separate assets. The **HMM
44
+ libraries ship as one gzip concatenated flatfile per domain**
45
+ (`kegg116_<domain>.hmm.gz`); the client decompresses and `hmmpress`-es once on
46
+ first use, cutting the download ~10× versus the pressed index and letting the
47
+ same artefact serve MATLAB RAVEN.
48
+ * **Taxonomy + phylogenetic distance:** publish `kegg116_taxonomy.gz` and add
49
+ `reconstruction.kegg.phyl_dist` (with `PhylDist`), a faithful port of RAVEN's
50
+ `getPhylDist` that regenerates the `keggPhylDist` distance matrix from the
51
+ taxonomy file — so GECKO's organism-distance kcat selection needs no MATLAB
52
+ `.mat`. `ensure_kegg_taxonomy` fetches the artefact.
53
+ * **Packaging:** `raven_toolbox.__version__` now derives from the installed package
54
+ metadata (`importlib.metadata`) instead of a hard-coded literal that had drifted
55
+ to `0.0.1`; the docs site reported the wrong version. Pinned `ruff==0.15.15` in
56
+ both the `dev` extra and CI so the lint result is reproducible, and fixed two
57
+ lint errors the unpinned ruff had started flagging.
58
+ * **Errors aligned to cobra:** solver/feasibility failures in `run_init`,
59
+ `run_ftinit`, `fill_tasks` and `random_sampling` now raise
60
+ `cobra.exceptions.OptimizationError` (already used elsewhere in the package)
61
+ instead of a bare `RuntimeError`.
62
+ * **Consistency:** a single `utils.parse.subsystem_to_str` coerces a reaction
63
+ `subsystem` to cobra's canonical `str` everywhere it is rendered/compared
64
+ (`io.excel`, `comparison.compare`, `curation.batch`, `manipulation.add`) — fixes
65
+ a crash on non-string subsystem items and the silent drop of multi-subsystem
66
+ reactions. GPR score-aggregation (`AGGREGATORS` / `resolve_aggregators`) is now
67
+ shared by `init.score` and `init.genes`. Maintainer-side KEGG-download progress
68
+ uses a module logger instead of `print`.
69
+ * **Robustness:** path-traversal guard on bundled-ZIP extraction (`binaries.py`,
70
+ matching the tarfile `filter="data"` precedent); `connect_blocked_reactions`
71
+ rejects a non-positive `penalty`; `random_sampling` refuses a NaN-contaminated
72
+ sample matrix; `ec_data` warns on an all-zero reaction↔enzyme coupling; optional
73
+ `verify=` SHA256 re-check on `ensure_data_file` cache hits; reporter p-value
74
+ guarded against non-finite z-scores. Regression tests added for each.
75
+
76
+ ## 0.1.0a1 — 2026-05-30
77
+
78
+ First alpha release. Covers the functional scope of RAVEN built on cobrapy:
79
+ de-novo reconstruction (KEGG / homology), context-specific modeling (tINIT / ftINIT),
80
+ metabolic-task validation, connectivity gap-filling, HPA omics ingestion, sub-cellular
81
+ localisation, N-model comparison, reporter metabolites, FSEOF, flux sampling, and the
82
+ RAVEN-style I/O formats (YAML / SIF / Excel). Validated against MATLAB RAVEN on Human-GEM
83
+ (Jaccard 0.975–0.980).
84
+
85
+ * **Licensing:** released under the **MIT** license (previously GPL-3.0-or-later).
86
+ * **Docs:** Sphinx + MyST documentation site (sources under `docs/`).
87
+ * Not yet implemented: visualization (`visualization/`), metabolomics-based (f)tINIT scoring,
88
+ and published binary / KEGG-artefact release bundles. See the README and
89
+ [docs/todo.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/todo.md).
90
+
91
+ The milestone sections below record the incremental development history leading to this release.
92
+
93
+ ## Infrastructure
94
+
95
+ * **GitHub Actions CI** ([.github/workflows/ci.yml](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/.github/workflows/ci.yml)) —
96
+ ruff + pytest matrix over Python 3.11/3.12/3.13. Tests that require Gurobi
97
+ auto-skip (no Gurobi on free runners); the known HiGHS upstream blocker
98
+ (`hybrid_interface.Configuration` rejects `lp_method='primal'`) is marked
99
+ `xfail(strict=True)` so CI flips red when optlang fixes it.
100
+
101
+ ## Quality sweep — known-issues section F (design-choice divergences)
102
+
103
+ Closed the five items in section F (the "design choices that differ from RAVEN"
104
+ backlog from the original review). Three docstring/comment fixes; two code
105
+ fixes with matching MATLAB back-port proposals in IMPROVEMENTS.md (FS4, B2).
106
+
107
+ * `run_init` docstring spells out the score-0 semantics divergence between
108
+ classic INIT and ftINIT.
109
+ * `get_init_model` inaccurate "same regime" comment replaced with an accurate
110
+ description of the conservative pre-filter.
111
+ * `fseof` classifier now uses the slope of `|flux|` (`linregress(enforced, |flux|)`)
112
+ instead of first-vs-last endpoints. A track whose endpoints straddle a
113
+ peak/trough no longer ends up mislabelled.
114
+ * `reporter_metabolites` docstring documents the one-sided p-value + z-score
115
+ ordering vs RAVEN's two-tailed sort, and points at the up/down split via
116
+ `gene_fold_changes`.
117
+ * `get_elemental_balance` now reports `unknown` for empty-stoichiometry
118
+ reactions (previously vacuously `balanced`). Original review attributed the
119
+ bug to `check_model`; the actual code is in `balance.py`.
120
+
121
+ Two new regression tests (F3 in `test_analysis_fseof.py`, F5 in
122
+ `test_utils_balance.py`). [docs/known_issues.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/known_issues.md) now
123
+ fully closed (all sections A–F).
124
+
125
+ ## Quality sweep — known-issues sections C / D / E
126
+
127
+ Closed all the robustness, efficiency, and dead-code items in one pass.
128
+
129
+ **Robustness (C):**
130
+ * `constrain_reversible_reactions` wraps FVA in try/except + NaN check; both
131
+ backend-raised `OptimizationError` and silent-NaN returns now surface as one
132
+ clear `RuntimeError` (the original `abs(NaN) < eps` silently no-op'd).
133
+ * `ensure_binary` downloads through `.part` + `os.replace`, matching `data.py` —
134
+ an interrupted download leaves a `.part`, never a half-complete `.zip`.
135
+ * `parse_task_list` (.xlsx) checks `wb.sheetnames` before lookup; missing
136
+ `TASKS` sheet now raises a clear `ValueError` instead of a bare `KeyError`.
137
+ * `parse_taxonomy` pads with explicit `""` when a depth level is skipped and
138
+ warns once.
139
+
140
+ **Efficiency (D):**
141
+ * `group_linear_reactions` rewritten with a metabolite worklist (re-enqueue
142
+ the mets touched by each merge); same observable result, O(n+m) work per
143
+ pass instead of restarting the full scan after every merge.
144
+ * `parse_kegg_reactions` now caches the parsed stoichiometry on each
145
+ `KeggReaction.stoichiometry`; `build_reference_model` reuses it instead of
146
+ re-parsing.
147
+
148
+ **Dead code (E):**
149
+ * Dropped `KeggReaction.modules` and `.rhea` (parsed but never consumed).
150
+ * Dropped the vestigial `only_genes_in_models` parameter from `_ortholog_map`.
151
+
152
+ Six new regression tests; the only one without a test is the `.part` atomic
153
+ download (defensive, needs urlopen mocking).
154
+
155
+ ## Quality sweep — known-issues section B
156
+
157
+ Closed all four "silent misbehaviour" items from [docs/known_issues.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/known_issues.md):
158
+ * `merge_models` warns on `formula` / `charge` conflicts when two source models
159
+ share a name[comp] but disagree (used to silently keep the first-seen).
160
+ * `add_reactions_from_equations` warns when creating a metabolite in an
161
+ unregistered compartment — both the `mets_by="id"` and `mets_by="name"` paths
162
+ (id-mode used to skip the check entirely, an asymmetry).
163
+ * `parse_task_list` warns when continuation data appears before any task ID
164
+ has been seen (used to silently drop the orphan row).
165
+ * `export_model_to_sif` warns up front when a custom label map sends two
166
+ distinct ids to the same label (used to silently collapse nodes).
167
+ Four new regression tests cover them.
168
+
169
+ ## Quality sweep — known-issues section A
170
+
171
+ Closed all six "latent edge-case bug" items from [docs/known_issues.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/reference/known_issues.md):
172
+ * `add_reactions_from_equations` no longer misparses `"2 oxoglutarate"` (or any
173
+ leading-number metabolite name) — the resolver tries the full token before
174
+ splitting off a coefficient.
175
+ * `add_reactions_from_equations` warns when an equation's terms cancel to a
176
+ zero-metabolite reaction.
177
+ * `add_reactions_from_model` tracks ids minted within the batch so two source
178
+ metabolites whose ids both collide with the draft don't collapse onto the
179
+ same generated id.
180
+ * `add_transport_reactions` warns on duplicate metabolite names in the source
181
+ or target compartment instead of silently dropping all but one.
182
+ * `connect_blocked_reactions` membership-guards the FVA result before
183
+ `.at[]` lookup.
184
+ * `assign_kos` rejects `cutoff >= 1` up front — would have crashed inside the
185
+ ratio filter at `log(best_evalue) == 0`.
186
+ Six new regression tests cover the user-reachable cases.
187
+
188
+ ## Phase 7 — Localization
189
+
190
+ * **Sub-cellular localisation by MILP.** [`localization.predict_localization`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/localization/predict.py)
191
+ + [`apply_localization`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/localization/predict.py). Deterministic (not simulated
192
+ annealing); caller-passed `reactions_to_relocate` set with everything else pinned;
193
+ incomplete-model tolerant (no silent reaction removal); `apply=False` returns a diff
194
+ preview; multi-compartment by default with primary-free, extras-penalised scoring.
195
+ * **Predictor loaders.** [`load_wolfpsort`, `load_deeploc`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/localization/scores.py),
196
+ with the `gene × compartment` DataFrame contract open for any predictor.
197
+ * **Compartment helpers** ([`manipulation/compartments.py`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/manipulation/compartments.py)):
198
+ `merge_compartments`, `copy_to_compartment` — useful standalone for model curation.
199
+ * **Real-data validation on yeast-GEM** ([docs/yeast_localization_benchmark.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/studies/yeast_localization_benchmark.md))
200
+ — accuracy 0.72 → 0.39 on 298 GPR'd reactions as confident predictor mis-scoring rises
201
+ from 0 % to 50 %; perfect on compartments with disjoint gene sets (c/g/lp/p/v/vm), and
202
+ surfaces a `transport_cost` calibration insight for soft-probability score tables.
203
+
204
+ ## Phase 5 — Data integration & analysis
205
+
206
+ * **Reporter metabolites, FSEOF, random sampling** ([`analysis/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/analysis/)).
207
+ * **HPA omics ingestion** ([`omics.parse_hpa`, `parse_hpa_rna`, `hpa_gene_scores`, `rna_gene_scores`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/omics/hpa.py))
208
+ — pandas-tidy DataFrames replace RAVEN's sparse-matrix layout; scoring adapters reuse the
209
+ existing GPR walk.
210
+ * **N-model comparison** ([`comparison.compare_models`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/comparison/compare.py)).
211
+ * **Dynamic FBA** is **not ported** — established Python packages cover it (`dfba`,
212
+ `reframed`, `mewpy`).
213
+
214
+ ## Phase 4d — ftINIT
215
+
216
+ * **ftINIT pipeline** ([`init.ftinit`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/init/ftinit.py)) — staged MILP, linear merge,
217
+ task-aware gap-filling, gene pruning.
218
+ * **Validated against MATLAB RAVEN on Human-GEM.** 5 Hart2015 cell-line models;
219
+ Jaccard 0.973–0.977 (no-task) and 0.978–0.980 (task-constrained). See
220
+ [docs/humangem_validation.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/studies/humangem_validation.md).
221
+ * **Parameter calibration & input-robustness study** ([docs/init_param_calibration.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/studies/init_param_calibration.md))
222
+ — `mip_gap=0.01` is the genome-scale full-pipeline sweet spot (~37% faster than 0.001 at
223
+ Jaccard 0.995); pipeline is robust to expression noise (Jaccard 0.92–0.95) but sensitive
224
+ to sparsity (50–70% dropout → Jaccard 0.59–0.71); the task + gap-fill layer keeps the
225
+ essential-task pass-rate at 67–69/69 across the gradient, whereas tINIT-without-it passes
226
+ only 35/69 even on clean data.
227
+ * **Cross-solver portability** ([docs/init_solver_benchmark.md](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/docs/studies/init_solver_benchmark.md))
228
+ + [`tests/test_init_solvers.py`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/tests/test_init_solvers.py): Gurobi and GLPK pass at toy
229
+ scale; only Gurobi is viable at genome scale today (HiGHS hits an upstream optlang
230
+ `clone()` bug; GLPK ignores `configuration.timeout` on MIP).
231
+ * **Engineering wins surfaced by the genome-scale work:** `check_tasks` and
232
+ `fill_tasks._feasible` rewritten in-place (~12× each); `optlang.symbolics.add` builds
233
+ in the MILP construction (the O(n²) sympy `sum()` blow-up was the original genome-scale
234
+ blocker); bounded gap-fill MILP; `rescaleModelForINIT` ported.
235
+
236
+ ## Phase 4c — tINIT
237
+
238
+ * **INIT MILP and the tINIT pipeline** ([`init.run_init`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/init/init.py),
239
+ [`init.get_init_model`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/init/build.py)). Clean optlang reformulation;
240
+ RNA-seq scoring via `5·ln(level/ref)`-clamped.
241
+
242
+ ## Phase 4b — Gap-filling
243
+
244
+ * **Connectivity gap-filling** ([`gapfilling.connect_blocked_reactions`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/gapfilling/fill.py))
245
+ — MILP. Targeted (toward objective) mode delegates to `cobra.gapfill`.
246
+
247
+ ## Phase 4a — Metabolic tasks
248
+
249
+ * **Task list parsing + `check_tasks`** ([`tasks/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/tasks/)).
250
+
251
+ ## Phase 3 — Reconstruction
252
+
253
+ * **Homology-based draft** from a template GEM + BLAST/DIAMOND wrappers
254
+ ([`reconstruction/homology/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/reconstruction/homology/)) — with structured
255
+ improvements over RAVEN's `getModelFromHomology` (see IMPROVEMENTS H1–H6).
256
+ * **KEGG five-step pipeline** ([`reconstruction/kegg/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/reconstruction/kegg/)):
257
+ dump → parser → HMM library builder → species model → HMM-query draft.
258
+ * **MetaCyc reconstruction** **not ported** (and flagged for removal from MATLAB RAVEN —
259
+ see IMPROVEMENTS R-MetaCyc).
260
+
261
+ ## Phase 2 — I/O
262
+
263
+ * **YAML** aligned to cobra's `!!omap` writer + RAVEN-only fields preserved into `.notes`,
264
+ plus geckopy `ec-*` for enzyme-constrained models
265
+ ([`io/yaml.py`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/io/yaml.py)).
266
+ * **SIF**, **Excel export**, and **Standard-GEM `model/<fmt>/…` git layout**
267
+ ([`io/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/io/)). Excel import intentionally excluded.
268
+
269
+ ## Phase 1 — Foundation
270
+
271
+ * **GPR / balance / validation / parsing helpers** ([`utils/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/utils/)) —
272
+ cobra-absent bits only; the rest are cheatsheeted.
273
+ * **Manipulation ergonomic layer** ([`manipulation/`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/manipulation/)) —
274
+ add/change/remove/transport/transfer/merge/simplify/variance + adopted transforms.
275
+ * **External-binary resolver** ([`binaries.py`](https://github.com/SysBioChalmers/raven-toolbox/blob/develop/src/raven_toolbox/binaries.py)) — version-pinned
276
+ release-ZIP registry, SHA256-verified cache.
277
+
278
+ ## Phase 0 — Scaffold
279
+
280
+ * Project structure, packaging, pytest skeleton, license alignment with MATLAB RAVEN
281
+ (GPL-3.0-or-later).