neorx 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 (174) hide show
  1. neorx-0.2.0/.gitignore +76 -0
  2. neorx-0.2.0/CHANGELOG.md +135 -0
  3. neorx-0.2.0/LICENSE +31 -0
  4. neorx-0.2.0/PKG-INFO +497 -0
  5. neorx-0.2.0/README.md +431 -0
  6. neorx-0.2.0/pyproject.toml +206 -0
  7. neorx-0.2.0/src/neorx/__init__.py +118 -0
  8. neorx-0.2.0/src/neorx/causalbiorl/__init__.py +23 -0
  9. neorx-0.2.0/src/neorx/causalbiorl/__main__.py +193 -0
  10. neorx-0.2.0/src/neorx/causalbiorl/agents/__init__.py +6 -0
  11. neorx-0.2.0/src/neorx/causalbiorl/agents/baseline_agent.py +161 -0
  12. neorx-0.2.0/src/neorx/causalbiorl/agents/causal_agent.py +434 -0
  13. neorx-0.2.0/src/neorx/causalbiorl/benchmark.py +276 -0
  14. neorx-0.2.0/src/neorx/causalbiorl/causal/__init__.py +40 -0
  15. neorx-0.2.0/src/neorx/causalbiorl/causal/discovery.py +237 -0
  16. neorx-0.2.0/src/neorx/causalbiorl/causal/graph_encoder.py +555 -0
  17. neorx-0.2.0/src/neorx/causalbiorl/causal/planner.py +333 -0
  18. neorx-0.2.0/src/neorx/causalbiorl/causal/reward_learner.py +384 -0
  19. neorx-0.2.0/src/neorx/causalbiorl/causal/scm.py +373 -0
  20. neorx-0.2.0/src/neorx/causalbiorl/causal/surrogate_docker.py +441 -0
  21. neorx-0.2.0/src/neorx/causalbiorl/envs/__init__.py +11 -0
  22. neorx-0.2.0/src/neorx/causalbiorl/envs/cell_growth.py +289 -0
  23. neorx-0.2.0/src/neorx/causalbiorl/envs/drug_discovery.py +884 -0
  24. neorx-0.2.0/src/neorx/causalbiorl/envs/metabolic_pathway.py +303 -0
  25. neorx-0.2.0/src/neorx/causalbiorl/envs/registration.py +41 -0
  26. neorx-0.2.0/src/neorx/causalbiorl/envs/toggle_switch.py +269 -0
  27. neorx-0.2.0/src/neorx/causalbiorl/models.py +94 -0
  28. neorx-0.2.0/src/neorx/causalbiorl/viz.py +207 -0
  29. neorx-0.2.0/src/neorx/cli/__init__.py +46 -0
  30. neorx-0.2.0/src/neorx/cli/__main__.py +6 -0
  31. neorx-0.2.0/src/neorx/core/__init__.py +116 -0
  32. neorx-0.2.0/src/neorx/core/__main__.py +275 -0
  33. neorx-0.2.0/src/neorx/core/api.py +214 -0
  34. neorx-0.2.0/src/neorx/core/bio/__init__.py +0 -0
  35. neorx-0.2.0/src/neorx/core/bio/classifier.py +462 -0
  36. neorx-0.2.0/src/neorx/core/bio/tissue_filter.py +572 -0
  37. neorx-0.2.0/src/neorx/core/cache.py +173 -0
  38. neorx-0.2.0/src/neorx/core/causal/__init__.py +0 -0
  39. neorx-0.2.0/src/neorx/core/causal/counterfactual.py +312 -0
  40. neorx-0.2.0/src/neorx/core/causal/identifier.py +1291 -0
  41. neorx-0.2.0/src/neorx/core/graph/__init__.py +0 -0
  42. neorx-0.2.0/src/neorx/core/graph/graph_builder.py +446 -0
  43. neorx-0.2.0/src/neorx/core/graph/models.py +359 -0
  44. neorx-0.2.0/src/neorx/core/graph/persistence.py +349 -0
  45. neorx-0.2.0/src/neorx/core/literature_validator.py +281 -0
  46. neorx-0.2.0/src/neorx/core/pipeline.py +920 -0
  47. neorx-0.2.0/src/neorx/core/py.typed +1 -0
  48. neorx-0.2.0/src/neorx/core/report.py +450 -0
  49. neorx-0.2.0/src/neorx/core/scoring/__init__.py +0 -0
  50. neorx-0.2.0/src/neorx/core/scoring/admet.py +273 -0
  51. neorx-0.2.0/src/neorx/core/scoring/scorer.py +260 -0
  52. neorx-0.2.0/src/neorx/core/sources/__init__.py +42 -0
  53. neorx-0.2.0/src/neorx/core/sources/chembl.py +643 -0
  54. neorx-0.2.0/src/neorx/core/sources/kegg.py +228 -0
  55. neorx-0.2.0/src/neorx/core/sources/monarch.py +355 -0
  56. neorx-0.2.0/src/neorx/core/sources/open_targets.py +301 -0
  57. neorx-0.2.0/src/neorx/core/sources/pdb.py +196 -0
  58. neorx-0.2.0/src/neorx/core/sources/reactome.py +180 -0
  59. neorx-0.2.0/src/neorx/core/sources/string_db.py +198 -0
  60. neorx-0.2.0/src/neorx/core/sources/uniprot.py +208 -0
  61. neorx-0.2.0/src/neorx/core/templates/report.html +440 -0
  62. neorx-0.2.0/src/neorx/core/validator.py +412 -0
  63. neorx-0.2.0/src/neorx/dockbot/__init__.py +79 -0
  64. neorx-0.2.0/src/neorx/dockbot/__main__.py +315 -0
  65. neorx-0.2.0/src/neorx/dockbot/api.py +292 -0
  66. neorx-0.2.0/src/neorx/dockbot/binding_site.py +350 -0
  67. neorx-0.2.0/src/neorx/dockbot/docker.py +335 -0
  68. neorx-0.2.0/src/neorx/dockbot/ligand_prep.py +306 -0
  69. neorx-0.2.0/src/neorx/dockbot/models.py +209 -0
  70. neorx-0.2.0/src/neorx/dockbot/parallel.py +248 -0
  71. neorx-0.2.0/src/neorx/dockbot/protein_prep.py +424 -0
  72. neorx-0.2.0/src/neorx/dockbot/report.py +361 -0
  73. neorx-0.2.0/src/neorx/dockbot/scorer.py +238 -0
  74. neorx-0.2.0/src/neorx/dockbot/viz.py +278 -0
  75. neorx-0.2.0/src/neorx/experiments/__init__.py +24 -0
  76. neorx-0.2.0/src/neorx/experiments/__main__.py +100 -0
  77. neorx-0.2.0/src/neorx/experiments/capture.py +85 -0
  78. neorx-0.2.0/src/neorx/experiments/chembl.py +74 -0
  79. neorx-0.2.0/src/neorx/experiments/gates.py +314 -0
  80. neorx-0.2.0/src/neorx/experiments/record.py +204 -0
  81. neorx-0.2.0/src/neorx/experiments/registry.py +105 -0
  82. neorx-0.2.0/src/neorx/experiments/replay.py +129 -0
  83. neorx-0.2.0/src/neorx/genmol/__init__.py +60 -0
  84. neorx-0.2.0/src/neorx/genmol/__main__.py +335 -0
  85. neorx-0.2.0/src/neorx/genmol/api.py +235 -0
  86. neorx-0.2.0/src/neorx/genmol/assets/__init__.py +0 -0
  87. neorx-0.2.0/src/neorx/genmol/assets/molvae_chembl36.pt +0 -0
  88. neorx-0.2.0/src/neorx/genmol/assets/tokenizer.json +39 -0
  89. neorx-0.2.0/src/neorx/genmol/configs/default.yaml +58 -0
  90. neorx-0.2.0/src/neorx/genmol/data/__init__.py +23 -0
  91. neorx-0.2.0/src/neorx/genmol/data/dataset.py +204 -0
  92. neorx-0.2.0/src/neorx/genmol/data/download.py +239 -0
  93. neorx-0.2.0/src/neorx/genmol/data/preprocess.py +262 -0
  94. neorx-0.2.0/src/neorx/genmol/data/tokenizer.py +318 -0
  95. neorx-0.2.0/src/neorx/genmol/evaluation/__init__.py +44 -0
  96. neorx-0.2.0/src/neorx/genmol/evaluation/distribution.py +188 -0
  97. neorx-0.2.0/src/neorx/genmol/evaluation/metrics.py +238 -0
  98. neorx-0.2.0/src/neorx/genmol/evaluation/visualise.py +392 -0
  99. neorx-0.2.0/src/neorx/genmol/generate.py +371 -0
  100. neorx-0.2.0/src/neorx/genmol/models/__init__.py +17 -0
  101. neorx-0.2.0/src/neorx/genmol/models/cvae.py +493 -0
  102. neorx-0.2.0/src/neorx/genmol/models/vae.py +538 -0
  103. neorx-0.2.0/src/neorx/genmol/pretrained.py +61 -0
  104. neorx-0.2.0/src/neorx/genmol/train.py +387 -0
  105. neorx-0.2.0/src/neorx/mirrorfold/__init__.py +121 -0
  106. neorx-0.2.0/src/neorx/mirrorfold/__main__.py +306 -0
  107. neorx-0.2.0/src/neorx/mirrorfold/analysis.py +405 -0
  108. neorx-0.2.0/src/neorx/mirrorfold/api.py +225 -0
  109. neorx-0.2.0/src/neorx/mirrorfold/compare.py +520 -0
  110. neorx-0.2.0/src/neorx/mirrorfold/mirror.py +370 -0
  111. neorx-0.2.0/src/neorx/mirrorfold/models.py +219 -0
  112. neorx-0.2.0/src/neorx/mirrorfold/predictor.py +503 -0
  113. neorx-0.2.0/src/neorx/mirrorfold/therapeutic.py +381 -0
  114. neorx-0.2.0/src/neorx/mirrorfold/viz.py +559 -0
  115. neorx-0.2.0/src/neorx/molscreen/__init__.py +64 -0
  116. neorx-0.2.0/src/neorx/molscreen/__main__.py +87 -0
  117. neorx-0.2.0/src/neorx/molscreen/accessibility.py +131 -0
  118. neorx-0.2.0/src/neorx/molscreen/data/.gitignore +2 -0
  119. neorx-0.2.0/src/neorx/molscreen/filters.py +350 -0
  120. neorx-0.2.0/src/neorx/molscreen/models.py +285 -0
  121. neorx-0.2.0/src/neorx/molscreen/parser.py +204 -0
  122. neorx-0.2.0/src/neorx/molscreen/properties.py +211 -0
  123. neorx-0.2.0/src/neorx/molscreen/similarity.py +384 -0
  124. neorx-0.2.0/src/neorx/py.typed +0 -0
  125. neorx-0.2.0/tests/__init__.py +0 -0
  126. neorx-0.2.0/tests/causalbiorl/__init__.py +0 -0
  127. neorx-0.2.0/tests/causalbiorl/scaffold_fixture.py +20 -0
  128. neorx-0.2.0/tests/causalbiorl/test_benchmark.py +56 -0
  129. neorx-0.2.0/tests/causalbiorl/test_causal_agent.py +190 -0
  130. neorx-0.2.0/tests/causalbiorl/test_env_generation.py +81 -0
  131. neorx-0.2.0/tests/causalbiorl/test_envs.py +234 -0
  132. neorx-0.2.0/tests/causalbiorl/test_integration.py +611 -0
  133. neorx-0.2.0/tests/core/__init__.py +0 -0
  134. neorx-0.2.0/tests/core/conftest.py +38 -0
  135. neorx-0.2.0/tests/core/test_data_sources.py +162 -0
  136. neorx-0.2.0/tests/core/test_graph_builder.py +155 -0
  137. neorx-0.2.0/tests/core/test_identifier.py +187 -0
  138. neorx-0.2.0/tests/core/test_new_modules.py +267 -0
  139. neorx-0.2.0/tests/core/test_pipeline.py +139 -0
  140. neorx-0.2.0/tests/core/test_scorer.py +199 -0
  141. neorx-0.2.0/tests/dockbot/__init__.py +125 -0
  142. neorx-0.2.0/tests/dockbot/test_binding_site.py +63 -0
  143. neorx-0.2.0/tests/dockbot/test_ligand_prep.py +125 -0
  144. neorx-0.2.0/tests/dockbot/test_scorer.py +106 -0
  145. neorx-0.2.0/tests/experiments/__init__.py +0 -0
  146. neorx-0.2.0/tests/experiments/test_capture.py +50 -0
  147. neorx-0.2.0/tests/experiments/test_causalbiorl_bench.py +68 -0
  148. neorx-0.2.0/tests/experiments/test_chembl_provenance.py +67 -0
  149. neorx-0.2.0/tests/experiments/test_exp_cli.py +57 -0
  150. neorx-0.2.0/tests/experiments/test_figures.py +50 -0
  151. neorx-0.2.0/tests/experiments/test_gates.py +198 -0
  152. neorx-0.2.0/tests/experiments/test_genmol_eval.py +167 -0
  153. neorx-0.2.0/tests/experiments/test_neorx_7disease.py +196 -0
  154. neorx-0.2.0/tests/experiments/test_record.py +209 -0
  155. neorx-0.2.0/tests/experiments/test_registry.py +114 -0
  156. neorx-0.2.0/tests/experiments/test_replay.py +149 -0
  157. neorx-0.2.0/tests/genmol/__init__.py +0 -0
  158. neorx-0.2.0/tests/genmol/test_generation.py +127 -0
  159. neorx-0.2.0/tests/genmol/test_metrics.py +109 -0
  160. neorx-0.2.0/tests/genmol/test_pretrained.py +45 -0
  161. neorx-0.2.0/tests/genmol/test_tokenizer.py +129 -0
  162. neorx-0.2.0/tests/genmol/test_vae.py +172 -0
  163. neorx-0.2.0/tests/mirrorfold/__init__.py +0 -0
  164. neorx-0.2.0/tests/mirrorfold/test_analysis.py +180 -0
  165. neorx-0.2.0/tests/mirrorfold/test_compare.py +227 -0
  166. neorx-0.2.0/tests/mirrorfold/test_mirror.py +193 -0
  167. neorx-0.2.0/tests/mirrorfold/test_predictor.py +168 -0
  168. neorx-0.2.0/tests/mirrorfold/test_therapeutic.py +155 -0
  169. neorx-0.2.0/tests/test_cli.py +28 -0
  170. neorx-0.2.0/tests/test_experiment_gates.py +40 -0
  171. neorx-0.2.0/tests/test_public_api.py +59 -0
  172. neorx-0.2.0/tests/test_version.py +16 -0
  173. neorx-0.2.0/tests/test_wheel_contents.py +51 -0
  174. neorx-0.2.0/tests/test_workflows.py +63 -0
neorx-0.2.0/.gitignore ADDED
@@ -0,0 +1,76 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Environment files (not .env.example)
13
+ .env
14
+ .env.local
15
+ .env.production
16
+
17
+ # IDE
18
+ .idea/
19
+ .vscode/
20
+ *.swp
21
+ *.swo
22
+ *~
23
+
24
+ # OS
25
+ .DS_Store
26
+ Thumbs.db
27
+
28
+ # Test / coverage
29
+ .pytest_cache/
30
+ htmlcov/
31
+ .coverage
32
+ .coverage.*
33
+ coverage.xml
34
+
35
+ # Generated outputs
36
+ reports/
37
+ results/
38
+
39
+ # Molecular data caches
40
+ modules/dockbot/cache/
41
+ *.pdb
42
+ *.pdbqt
43
+ *.sdf
44
+ *.mol2
45
+
46
+ # Jupyter
47
+ .ipynb_checkpoints/
48
+
49
+ # Model weights (too large for git)
50
+ *.pt
51
+ *.pth
52
+ *.h5
53
+ *.pkl
54
+ *.ckpt
55
+
56
+ # Shipped model asset — must be committed and packaged (see pyproject artifacts)
57
+ !src/neorx/genmol/assets/*.pt
58
+
59
+ # ChEMBL SQLite database (28 GB — too large for git)
60
+ chembl_*.db
61
+
62
+ # Local backups and trained-model checkpoints -- large and machine-specific,
63
+ # never meant to be committed (a `git add -A` would otherwise pull in tens
64
+ # of MB of these).
65
+ .backup-scripts/
66
+ checkpoints/
67
+
68
+ # Experiment run records are deliverables, not scratch -- they are the
69
+ # evidence behind every reported number, IF they are cited. See
70
+ # docs/run-manifest.toml. Default to NOT tracking a run directory (so a
71
+ # routine `git add -A` cannot sweep in an ad-hoc or smoke run); a record
72
+ # that actually backs a claim is added deliberately with
73
+ # `git add -f runs/<run-id>`.
74
+ !runs/
75
+ runs/*
76
+ !runs/.gitkeep
@@ -0,0 +1,135 @@
1
+ # Changelog
2
+
3
+ All notable changes to NeoRx will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.0] — 2026-09-02
11
+
12
+ ### Changed
13
+ - **Breaking:** `modules.*` imports become `neorx.*`; `modules.neorx` becomes
14
+ `neorx.core`. The `modules/` compatibility shim was removed outright rather
15
+ than deprecated -- there is no shim in 0.2.x, and old `modules.*` imports
16
+ simply no longer exist. (The plan that shipped with this release assumed a
17
+ shim deprecated through 0.2.x and removed in 0.3.0; that step was dropped
18
+ during implementation.)
19
+ - Package moves to a `src/` layout, so tests exercise the installed artifact.
20
+ - Python floor lowered from 3.13 to 3.12; dependency floors correspondingly
21
+ reassessed (see Fixed).
22
+ - `pandas` is replaced with `polars` throughout (was not part of the original
23
+ plan for this release; `benchmark.py`'s reporting is the only affected
24
+ call site).
25
+ - Five console scripts unified under `neorx <module> <command>`. The old
26
+ script names remain as deprecated aliases through 0.2.x.
27
+
28
+ ### Added
29
+ - All six modules exposed through the public API. `molscreen` previously
30
+ exported nothing.
31
+ - Trained GenMol weights ship as package data; `load_pretrained()` raises
32
+ `GenMolAssetError` rather than returning an untrained model.
33
+ - **CausalBioRL integration** — RL agent now drives the full drug
34
+ discovery pipeline through `DrugDiscoveryEnv` (Gymnasium).
35
+ - **`run_rl_pipeline()`** — RL-driven alternative to the linear
36
+ `run_pipeline()`. Agent iteratively selects targets and generates
37
+ molecules via latent-space navigation.
38
+ - **R-GCN graph encoder** — `DiseaseGraphEncoder` maps disease knowledge
39
+ graphs to fixed 128-D embeddings using relational graph convolution.
40
+ - **Surrogate docking model** — `SurrogateDockingModel` (MLP) provides
41
+ ~1ms binding affinity predictions, trained on DockBot observations.
42
+ - **Adaptive reward learner** — `AdaptiveRewardLearner` with 6 per-objective
43
+ critics and difficulty-adaptive weighting (hindsight shaping).
44
+ - **Hierarchical planner** — `HierarchicalPlanner` with UCB1 target
45
+ selection (Level 1) and CEM molecule generation (Level 2).
46
+ - **Typed edges in SCM** — Edges tagged with provenance (`api` vs
47
+ `learned`), `augment_graph()` for merging discovered edges,
48
+ `from_disease_graph()` classmethod.
49
+ - **CounterfactualValidator bridge** — `validate_with_biorl_scm()` method
50
+ delegates to the shared SCM when CausalBioRL is available.
51
+ - **DrugDiscovery-v0** environment registered in Gymnasium.
52
+ - **GitHub Actions CI** — lint (Ruff), test (pytest on Ubuntu + macOS),
53
+ type check (mypy), coverage upload (Codecov).
54
+ - **CONTRIBUTING.md** — contributor guide with style, testing, and PR
55
+ conventions.
56
+ - **CODE_OF_CONDUCT.md** — Contributor Covenant v2.1.
57
+ - **SECURITY.md** — vulnerability reporting policy.
58
+ - **Ruff configuration** — formatter + linter in `pyproject.toml`.
59
+ - **pytest-cov integration** — coverage config with source filtering.
60
+ - **Expanded .gitignore** — reports/, results/, *.pdb, *.pdbqt, model
61
+ weights, IDE files, OS files.
62
+
63
+ ### Fixed
64
+ - `DrugDiscovery-v0` now generates through the trained VAE. It previously
65
+ built an unvocabularised tokenizer and a randomly initialised model, called
66
+ a `decode_from_latent` method that does not exist, swallowed the resulting
67
+ `AttributeError`, and returned one of twelve hardcoded scaffolds.
68
+ - `DrugDiscoveryEnv` now rejects a `latent_dim` that does not match the
69
+ shipped VAE's, instead of silently constructing a mismatched network (not
70
+ part of the original plan; found while wiring the previous fix).
71
+ - Four dependency floors (`numpy`, `rdkit`, `pyyaml`, `psycopg2-binary`) had
72
+ been raised past their true minimum on the reasoning that no cp313 wheel
73
+ existed for the lower version on macOS arm64 -- but a floor is a lower
74
+ bound, not a pin, so a wheel gap on a newer interpreter never justifies
75
+ raising it. Re-derived from declared dependency constraints and actual
76
+ binary/API compatibility, verified on Python 3.12.
77
+ - **SCM self-loop bug** — autoregressive dependencies (`s0→s0`) were
78
+ being stripped, preventing linear mechanisms from seeing state input.
79
+ - **Matplotlib `tostring_rgb` deprecation** — all 3 toy env renderers
80
+ now use `buffer_rgba()` (works on macOS and headless Linux).
81
+ - **Pydantic v2 deprecation** — `class Config` replaced with
82
+ `model_config = ConfigDict(...)` in `EpisodeResult` and
83
+ `BenchmarkResult`.
84
+ - **Docstring escape sequence** — invalid `\s` in planner docstring.
85
+ - **SCM test flakiness** — increased learning rate for reliable
86
+ convergence in unit tests.
87
+
88
+ ## [0.1.0] — 2026-03-29
89
+
90
+ ### Added
91
+
92
+ - **Causal inference engine** — multi-source evidence triangulation via
93
+ path strength × d-separation quality × centrality × source corroboration.
94
+ - **Backdoor criterion** — proper d-separation analysis using
95
+ `networkx.d_separated()` for identifiability testing.
96
+ - **Bootstrap confidence intervals** — 95% CIs on causal confidence
97
+ (200 resamples).
98
+ - **Leave-one-source-out sensitivity analysis** — robustness validation
99
+ by systematically removing each data source.
100
+ - **7 biomedical data source clients** — DisGeNET, Open Targets (GraphQL),
101
+ KEGG, Reactome, STRING, UniProt, RCSB PDB — all with curated mock
102
+ fallbacks for offline use.
103
+ - **Parallel API queries** — `ThreadPoolExecutor` for concurrent database
104
+ queries (~2× speedup on graph building).
105
+ - **File/Redis caching layer** — 24h TTL for API responses, 7d for graphs.
106
+ Configurable via `NEORX_CACHE_BACKEND` env var.
107
+ - **Multi-rule ADMET predictor** — 8 rule systems: Lipinski RO5, Veber,
108
+ Ghose, Egan egg, PAINS (RDKit FilterCatalog), BBB permeability, hERG
109
+ liability, reactive group alerts. Weighted composite score.
110
+ - **Graph persistence & export** — JSON, GraphML, GEXF, Cytoscape formats.
111
+ PostgreSQL persistence for Docker deployments.
112
+ - **Disease ontology resolution** — `resolve_disease_id()` maps free-text
113
+ disease names to EFO/MONDO identifiers via Open Targets search.
114
+ - **Configurable scorer weights** — override via Python parameter, env var
115
+ (`NEORX_WEIGHTS`), or defaults. Auto-normalised to sum=1.0.
116
+ - **SMILES canonicalization** — duplicate elimination via RDKit canonical
117
+ SMILES before screening.
118
+ - **Interactive HTML reports** — vis.js causal knowledge graph, 95% CI
119
+ column, UTC timestamps, updated methodology section.
120
+ - **Non-blocking FastAPI endpoints** — `asyncio.to_thread()` on all
121
+ CPU/IO-bound handlers.
122
+ - **Rich CLI** — progress bar, `--seed` for reproducibility, `--export`
123
+ for graph formats, `--log-file`, `--no-cache`.
124
+ - **Docker Compose infrastructure** — Redis 7 (AOF + LRU), PostgreSQL 16
125
+ (5-table schema with indexes), API container with healthchecks.
126
+ - **PEP 561 `py.typed` marker** — full static typing support.
127
+ - **Clean public API** — `from neorx import run_pipeline` works
128
+ after `pip install neorx`.
129
+ - **108 tests** covering data sources, graph builder, identifier, pipeline,
130
+ scorer, cache, persistence, ADMET, configurable weights, SMILES
131
+ canonicalization, confidence intervals, and disease ID resolution.
132
+
133
+ [Unreleased]: https://github.com/NeoForge/NeoRx/compare/v0.2.0...HEAD
134
+ [0.2.0]: https://github.com/NeoForge/NeoRx/compare/v0.1.0...v0.2.0
135
+ [0.1.0]: https://github.com/NeoForge/NeoRx/releases/tag/v0.1.0
neorx-0.2.0/LICENSE ADDED
@@ -0,0 +1,31 @@
1
+ NeoRx Source Available License
2
+
3
+ Copyright (c) 2026 Kelyn Paul Njeri, NeoForge Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to use,
7
+ copy, modify, and distribute the Software for NON-COMMERCIAL PURPOSES ONLY,
8
+ subject to the following conditions:
9
+
10
+ 1. NON-COMMERCIAL USE PERMITTED. You may use, copy, modify, merge, and
11
+ distribute the Software and derivative works thereof for personal,
12
+ academic, educational, and research purposes at no charge.
13
+
14
+ 2. COMMERCIAL USE PROHIBITED WITHOUT LICENCE. You may NOT use the Software,
15
+ or any derivative works thereof, for commercial purposes — including but
16
+ not limited to: selling the Software or services built on it, incorporating
17
+ it into commercial products, or using it to generate revenue — without
18
+ obtaining a separate commercial licence from the copyright holder.
19
+
20
+ To obtain a commercial licence, contact: kelyn@neoforgelabs.tech
21
+
22
+ 3. ATTRIBUTION. The above copyright notice and this permission notice shall
23
+ be included in all copies or substantial portions of the Software.
24
+
25
+ 4. NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
26
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
28
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
29
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
30
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
31
+ USE OR OTHER DEALINGS IN THE SOFTWARE.