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.
- neorx-0.2.0/.gitignore +76 -0
- neorx-0.2.0/CHANGELOG.md +135 -0
- neorx-0.2.0/LICENSE +31 -0
- neorx-0.2.0/PKG-INFO +497 -0
- neorx-0.2.0/README.md +431 -0
- neorx-0.2.0/pyproject.toml +206 -0
- neorx-0.2.0/src/neorx/__init__.py +118 -0
- neorx-0.2.0/src/neorx/causalbiorl/__init__.py +23 -0
- neorx-0.2.0/src/neorx/causalbiorl/__main__.py +193 -0
- neorx-0.2.0/src/neorx/causalbiorl/agents/__init__.py +6 -0
- neorx-0.2.0/src/neorx/causalbiorl/agents/baseline_agent.py +161 -0
- neorx-0.2.0/src/neorx/causalbiorl/agents/causal_agent.py +434 -0
- neorx-0.2.0/src/neorx/causalbiorl/benchmark.py +276 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/__init__.py +40 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/discovery.py +237 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/graph_encoder.py +555 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/planner.py +333 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/reward_learner.py +384 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/scm.py +373 -0
- neorx-0.2.0/src/neorx/causalbiorl/causal/surrogate_docker.py +441 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/__init__.py +11 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/cell_growth.py +289 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/drug_discovery.py +884 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/metabolic_pathway.py +303 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/registration.py +41 -0
- neorx-0.2.0/src/neorx/causalbiorl/envs/toggle_switch.py +269 -0
- neorx-0.2.0/src/neorx/causalbiorl/models.py +94 -0
- neorx-0.2.0/src/neorx/causalbiorl/viz.py +207 -0
- neorx-0.2.0/src/neorx/cli/__init__.py +46 -0
- neorx-0.2.0/src/neorx/cli/__main__.py +6 -0
- neorx-0.2.0/src/neorx/core/__init__.py +116 -0
- neorx-0.2.0/src/neorx/core/__main__.py +275 -0
- neorx-0.2.0/src/neorx/core/api.py +214 -0
- neorx-0.2.0/src/neorx/core/bio/__init__.py +0 -0
- neorx-0.2.0/src/neorx/core/bio/classifier.py +462 -0
- neorx-0.2.0/src/neorx/core/bio/tissue_filter.py +572 -0
- neorx-0.2.0/src/neorx/core/cache.py +173 -0
- neorx-0.2.0/src/neorx/core/causal/__init__.py +0 -0
- neorx-0.2.0/src/neorx/core/causal/counterfactual.py +312 -0
- neorx-0.2.0/src/neorx/core/causal/identifier.py +1291 -0
- neorx-0.2.0/src/neorx/core/graph/__init__.py +0 -0
- neorx-0.2.0/src/neorx/core/graph/graph_builder.py +446 -0
- neorx-0.2.0/src/neorx/core/graph/models.py +359 -0
- neorx-0.2.0/src/neorx/core/graph/persistence.py +349 -0
- neorx-0.2.0/src/neorx/core/literature_validator.py +281 -0
- neorx-0.2.0/src/neorx/core/pipeline.py +920 -0
- neorx-0.2.0/src/neorx/core/py.typed +1 -0
- neorx-0.2.0/src/neorx/core/report.py +450 -0
- neorx-0.2.0/src/neorx/core/scoring/__init__.py +0 -0
- neorx-0.2.0/src/neorx/core/scoring/admet.py +273 -0
- neorx-0.2.0/src/neorx/core/scoring/scorer.py +260 -0
- neorx-0.2.0/src/neorx/core/sources/__init__.py +42 -0
- neorx-0.2.0/src/neorx/core/sources/chembl.py +643 -0
- neorx-0.2.0/src/neorx/core/sources/kegg.py +228 -0
- neorx-0.2.0/src/neorx/core/sources/monarch.py +355 -0
- neorx-0.2.0/src/neorx/core/sources/open_targets.py +301 -0
- neorx-0.2.0/src/neorx/core/sources/pdb.py +196 -0
- neorx-0.2.0/src/neorx/core/sources/reactome.py +180 -0
- neorx-0.2.0/src/neorx/core/sources/string_db.py +198 -0
- neorx-0.2.0/src/neorx/core/sources/uniprot.py +208 -0
- neorx-0.2.0/src/neorx/core/templates/report.html +440 -0
- neorx-0.2.0/src/neorx/core/validator.py +412 -0
- neorx-0.2.0/src/neorx/dockbot/__init__.py +79 -0
- neorx-0.2.0/src/neorx/dockbot/__main__.py +315 -0
- neorx-0.2.0/src/neorx/dockbot/api.py +292 -0
- neorx-0.2.0/src/neorx/dockbot/binding_site.py +350 -0
- neorx-0.2.0/src/neorx/dockbot/docker.py +335 -0
- neorx-0.2.0/src/neorx/dockbot/ligand_prep.py +306 -0
- neorx-0.2.0/src/neorx/dockbot/models.py +209 -0
- neorx-0.2.0/src/neorx/dockbot/parallel.py +248 -0
- neorx-0.2.0/src/neorx/dockbot/protein_prep.py +424 -0
- neorx-0.2.0/src/neorx/dockbot/report.py +361 -0
- neorx-0.2.0/src/neorx/dockbot/scorer.py +238 -0
- neorx-0.2.0/src/neorx/dockbot/viz.py +278 -0
- neorx-0.2.0/src/neorx/experiments/__init__.py +24 -0
- neorx-0.2.0/src/neorx/experiments/__main__.py +100 -0
- neorx-0.2.0/src/neorx/experiments/capture.py +85 -0
- neorx-0.2.0/src/neorx/experiments/chembl.py +74 -0
- neorx-0.2.0/src/neorx/experiments/gates.py +314 -0
- neorx-0.2.0/src/neorx/experiments/record.py +204 -0
- neorx-0.2.0/src/neorx/experiments/registry.py +105 -0
- neorx-0.2.0/src/neorx/experiments/replay.py +129 -0
- neorx-0.2.0/src/neorx/genmol/__init__.py +60 -0
- neorx-0.2.0/src/neorx/genmol/__main__.py +335 -0
- neorx-0.2.0/src/neorx/genmol/api.py +235 -0
- neorx-0.2.0/src/neorx/genmol/assets/__init__.py +0 -0
- neorx-0.2.0/src/neorx/genmol/assets/molvae_chembl36.pt +0 -0
- neorx-0.2.0/src/neorx/genmol/assets/tokenizer.json +39 -0
- neorx-0.2.0/src/neorx/genmol/configs/default.yaml +58 -0
- neorx-0.2.0/src/neorx/genmol/data/__init__.py +23 -0
- neorx-0.2.0/src/neorx/genmol/data/dataset.py +204 -0
- neorx-0.2.0/src/neorx/genmol/data/download.py +239 -0
- neorx-0.2.0/src/neorx/genmol/data/preprocess.py +262 -0
- neorx-0.2.0/src/neorx/genmol/data/tokenizer.py +318 -0
- neorx-0.2.0/src/neorx/genmol/evaluation/__init__.py +44 -0
- neorx-0.2.0/src/neorx/genmol/evaluation/distribution.py +188 -0
- neorx-0.2.0/src/neorx/genmol/evaluation/metrics.py +238 -0
- neorx-0.2.0/src/neorx/genmol/evaluation/visualise.py +392 -0
- neorx-0.2.0/src/neorx/genmol/generate.py +371 -0
- neorx-0.2.0/src/neorx/genmol/models/__init__.py +17 -0
- neorx-0.2.0/src/neorx/genmol/models/cvae.py +493 -0
- neorx-0.2.0/src/neorx/genmol/models/vae.py +538 -0
- neorx-0.2.0/src/neorx/genmol/pretrained.py +61 -0
- neorx-0.2.0/src/neorx/genmol/train.py +387 -0
- neorx-0.2.0/src/neorx/mirrorfold/__init__.py +121 -0
- neorx-0.2.0/src/neorx/mirrorfold/__main__.py +306 -0
- neorx-0.2.0/src/neorx/mirrorfold/analysis.py +405 -0
- neorx-0.2.0/src/neorx/mirrorfold/api.py +225 -0
- neorx-0.2.0/src/neorx/mirrorfold/compare.py +520 -0
- neorx-0.2.0/src/neorx/mirrorfold/mirror.py +370 -0
- neorx-0.2.0/src/neorx/mirrorfold/models.py +219 -0
- neorx-0.2.0/src/neorx/mirrorfold/predictor.py +503 -0
- neorx-0.2.0/src/neorx/mirrorfold/therapeutic.py +381 -0
- neorx-0.2.0/src/neorx/mirrorfold/viz.py +559 -0
- neorx-0.2.0/src/neorx/molscreen/__init__.py +64 -0
- neorx-0.2.0/src/neorx/molscreen/__main__.py +87 -0
- neorx-0.2.0/src/neorx/molscreen/accessibility.py +131 -0
- neorx-0.2.0/src/neorx/molscreen/data/.gitignore +2 -0
- neorx-0.2.0/src/neorx/molscreen/filters.py +350 -0
- neorx-0.2.0/src/neorx/molscreen/models.py +285 -0
- neorx-0.2.0/src/neorx/molscreen/parser.py +204 -0
- neorx-0.2.0/src/neorx/molscreen/properties.py +211 -0
- neorx-0.2.0/src/neorx/molscreen/similarity.py +384 -0
- neorx-0.2.0/src/neorx/py.typed +0 -0
- neorx-0.2.0/tests/__init__.py +0 -0
- neorx-0.2.0/tests/causalbiorl/__init__.py +0 -0
- neorx-0.2.0/tests/causalbiorl/scaffold_fixture.py +20 -0
- neorx-0.2.0/tests/causalbiorl/test_benchmark.py +56 -0
- neorx-0.2.0/tests/causalbiorl/test_causal_agent.py +190 -0
- neorx-0.2.0/tests/causalbiorl/test_env_generation.py +81 -0
- neorx-0.2.0/tests/causalbiorl/test_envs.py +234 -0
- neorx-0.2.0/tests/causalbiorl/test_integration.py +611 -0
- neorx-0.2.0/tests/core/__init__.py +0 -0
- neorx-0.2.0/tests/core/conftest.py +38 -0
- neorx-0.2.0/tests/core/test_data_sources.py +162 -0
- neorx-0.2.0/tests/core/test_graph_builder.py +155 -0
- neorx-0.2.0/tests/core/test_identifier.py +187 -0
- neorx-0.2.0/tests/core/test_new_modules.py +267 -0
- neorx-0.2.0/tests/core/test_pipeline.py +139 -0
- neorx-0.2.0/tests/core/test_scorer.py +199 -0
- neorx-0.2.0/tests/dockbot/__init__.py +125 -0
- neorx-0.2.0/tests/dockbot/test_binding_site.py +63 -0
- neorx-0.2.0/tests/dockbot/test_ligand_prep.py +125 -0
- neorx-0.2.0/tests/dockbot/test_scorer.py +106 -0
- neorx-0.2.0/tests/experiments/__init__.py +0 -0
- neorx-0.2.0/tests/experiments/test_capture.py +50 -0
- neorx-0.2.0/tests/experiments/test_causalbiorl_bench.py +68 -0
- neorx-0.2.0/tests/experiments/test_chembl_provenance.py +67 -0
- neorx-0.2.0/tests/experiments/test_exp_cli.py +57 -0
- neorx-0.2.0/tests/experiments/test_figures.py +50 -0
- neorx-0.2.0/tests/experiments/test_gates.py +198 -0
- neorx-0.2.0/tests/experiments/test_genmol_eval.py +167 -0
- neorx-0.2.0/tests/experiments/test_neorx_7disease.py +196 -0
- neorx-0.2.0/tests/experiments/test_record.py +209 -0
- neorx-0.2.0/tests/experiments/test_registry.py +114 -0
- neorx-0.2.0/tests/experiments/test_replay.py +149 -0
- neorx-0.2.0/tests/genmol/__init__.py +0 -0
- neorx-0.2.0/tests/genmol/test_generation.py +127 -0
- neorx-0.2.0/tests/genmol/test_metrics.py +109 -0
- neorx-0.2.0/tests/genmol/test_pretrained.py +45 -0
- neorx-0.2.0/tests/genmol/test_tokenizer.py +129 -0
- neorx-0.2.0/tests/genmol/test_vae.py +172 -0
- neorx-0.2.0/tests/mirrorfold/__init__.py +0 -0
- neorx-0.2.0/tests/mirrorfold/test_analysis.py +180 -0
- neorx-0.2.0/tests/mirrorfold/test_compare.py +227 -0
- neorx-0.2.0/tests/mirrorfold/test_mirror.py +193 -0
- neorx-0.2.0/tests/mirrorfold/test_predictor.py +168 -0
- neorx-0.2.0/tests/mirrorfold/test_therapeutic.py +155 -0
- neorx-0.2.0/tests/test_cli.py +28 -0
- neorx-0.2.0/tests/test_experiment_gates.py +40 -0
- neorx-0.2.0/tests/test_public_api.py +59 -0
- neorx-0.2.0/tests/test_version.py +16 -0
- neorx-0.2.0/tests/test_wheel_contents.py +51 -0
- 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
|
neorx-0.2.0/CHANGELOG.md
ADDED
|
@@ -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.
|