src/bridge: Campaign-1 → Campaign-2 rate-law emitter (API surface only) #3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: smoke | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - "src/chem/**" | |
| - "src/md/**" | |
| - "src/dock/**" | |
| - "src/fep/**" | |
| - "src/quantum/**" | |
| - "src/uq/**" | |
| - "src/cache/**" | |
| - "tests/chem/**" | |
| - "tests/cache/**" | |
| - "tests/md/**" | |
| - "tests/dock/**" | |
| - "tests/fep/**" | |
| - "tests/quantum/**" | |
| - "tests/uq/**" | |
| - "benchmarks/chembl/**" | |
| - "benchmarks/md/**" | |
| - "benchmarks/dock/**" | |
| - "benchmarks/fep/**" | |
| - "benchmarks/quantum/**" | |
| - "environment.yml" | |
| - ".github/workflows/smoke.yml" | |
| pull_request: | |
| paths: | |
| - "src/chem/**" | |
| - "src/md/**" | |
| - "src/dock/**" | |
| - "src/fep/**" | |
| - "src/quantum/**" | |
| - "src/uq/**" | |
| - "src/cache/**" | |
| - "tests/chem/**" | |
| - "tests/cache/**" | |
| - "tests/md/**" | |
| - "tests/dock/**" | |
| - "tests/fep/**" | |
| - "tests/quantum/**" | |
| - "tests/uq/**" | |
| - "benchmarks/chembl/**" | |
| - "benchmarks/md/**" | |
| - "benchmarks/dock/**" | |
| - "benchmarks/fep/**" | |
| - "benchmarks/quantum/**" | |
| - "environment.yml" | |
| - ".github/workflows/smoke.yml" | |
| workflow_dispatch: | |
| inputs: | |
| scale_n: | |
| description: "Run the ChEMBL scale test with N compounds (0 = skip)" | |
| required: false | |
| default: "0" | |
| run_sampled_binding_smoke: | |
| description: "Run the opt-in sampled binding smoke (~10 min CPU)" | |
| required: false | |
| default: "false" | |
| type: boolean | |
| jobs: | |
| # One mega-job that runs chem + md-ligand + md-protein smoke gates | |
| # back-to-back under a single conda env. Environment setup (~5 min) | |
| # dominates wall time, so sharing the env across gates is much | |
| # cheaper than splitting them into separate jobs. | |
| smoke: | |
| name: chem + md smoke (full tier, conda) | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| shell: bash -el {0} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up miniforge + cellsim env | |
| uses: conda-incubator/setup-miniconda@v3 | |
| with: | |
| environment-file: environment.yml | |
| activate-environment: cellsim | |
| miniforge-version: latest | |
| use-mamba: true | |
| - name: Env report | |
| run: | | |
| python -c "import rdkit, openff.toolkit, openmm, pdbfixer, \ | |
| vina, meeko, posebusters; \ | |
| print('rdkit', rdkit.__version__); \ | |
| print('openff-toolkit', openff.toolkit.__version__); \ | |
| print('openmm', openmm.__version__); \ | |
| print('pdbfixer', getattr(pdbfixer, '__version__', '?')); \ | |
| print('vina', vina.__version__); \ | |
| print('meeko', meeko.__version__); \ | |
| print('posebusters', posebusters.__version__)" | |
| which vina | |
| which xtb && xtb --version 2>&1 | head -2 || true | |
| echo "AMBERHOME=$AMBERHOME" | |
| - name: chem smoke_10 (Layer 1.1, full tier ≥ 8/10) | |
| run: python -u tests/chem/test_parametrize_smoke.py | |
| - name: chem ADMET smoke (non-AI descriptors, 10/10) | |
| run: python -u tests/chem/test_admet_smoke.py | |
| - name: chem cache smoke (parametrize AM1-BCC cache speed-up) | |
| run: python -u tests/chem/test_parametrize_cache.py | |
| - name: md ligand smoke (Layer 1.2, 3 drugs × 10 ps, 3/3) | |
| run: python -u tests/md/test_ligand_vacuum.py --max 3 --gate 3 | |
| - name: md protein smoke (Layer 1.2, 1UBQ solvate + 1 ps MD) | |
| run: python -u tests/md/test_protein_load.py | |
| - name: dock prep smoke (Layer 1.3, Meeko receptor + ligand) | |
| run: python -u tests/dock/test_prep_smoke.py | |
| - name: dock re-docking gate (Layer 1.3, 1STP biotin) | |
| run: python -u tests/dock/test_redocking.py | |
| - name: dock pocket-detect smoke (Layer 1.3, fpocket on 1STP) | |
| run: python -u tests/dock/test_pocket_detect_smoke.py | |
| - name: dock mini-bench (Layer 1.3, 3-cocrystal re-dock ≥ 2/3) | |
| run: python -u tests/dock/test_mini_bench.py | |
| - name: dock refine smoke (Layer 1.3, post-dock MM minimise) | |
| run: python -u tests/dock/test_refine_smoke.py | |
| - name: dock strain smoke (Layer 1.3, UFF ensemble ratio via PoseBusters) | |
| run: python -u tests/dock/test_strain_smoke.py | |
| - name: dock triage rules smoke (Layer 1.3, batch triage verdicts) | |
| run: python -u tests/dock/test_triage_smoke.py | |
| - name: dock triage-viewer smoke (Layer 1.3, PNG dashboard) | |
| run: python -u tests/dock/test_triage_viewer_smoke.py | |
| - name: dock strain-gate smoke (Layer 1.3, pose promotion logic) | |
| run: python -u tests/dock/test_strain_gate_smoke.py | |
| - name: dock shortlist smoke (Layer 1.3, CSV filter) | |
| run: python -u tests/dock/test_shortlist_smoke.py | |
| - name: dock to-md smoke (Layer 1.3, markdown table) | |
| run: python -u tests/dock/test_to_md_smoke.py | |
| - name: dock kinase-warning smoke (Layer 1.3, receptor heads-up) | |
| run: python -u tests/dock/test_kinase_warning_smoke.py | |
| - name: dock cyp-inhibit strain-downgrade smoke (Layer 1.3, DDI risk rules) | |
| run: python -u tests/dock/test_cyp_strain_downgrade_smoke.py | |
| - name: fep scaffold smoke (Layer 1.3, openmmtools alchemy primitives) | |
| run: python -u tests/fep/test_fep_scaffold_smoke.py | |
| - name: fep hydration scaffold (Layer 1.3, SMILES → alchemical System) | |
| run: python -u tests/fep/test_hydration_scaffold_smoke.py | |
| - name: fep sampling smoke (Layer 1.3, methane vacuum Langevin+MBAR) | |
| run: python -u tests/fep/test_sampling_smoke.py | |
| - name: fep end-to-end smoke (Layer 1.3, methane hydration ΔG pipeline) | |
| run: python -u tests/fep/test_hydration_dg_smoke.py | |
| - name: fep binding scaffold smoke (Layer 1.3 Milestone B, 1ubq + restraint) | |
| run: python -u tests/fep/test_binding_scaffold_smoke.py | |
| - name: fep-report analyser smoke (tarball → PASS/FAIL verdict) | |
| run: python -u tests/fep/test_report_smoke.py | |
| - name: fep-binding validate dry-run (YAML hygiene, <1s) | |
| run: python -u tests/fep/test_validate_smoke.py | |
| - name: cellsim doctor (step 13 = all benchmarks/fep/*.yaml dry-run) | |
| run: ./scripts/cellsim doctor | |
| - name: cellsim bench-all (biologist dashboard regression) | |
| run: python -u tests/fep/test_bench_all_smoke.py | |
| - name: fep-binding bench --resume regression | |
| run: python -u tests/fep/test_bench_resume_smoke.py | |
| - name: bridge — Campaign-1 → Campaign-2 rate-law emitter | |
| run: python -u tests/bridge/test_binding_to_hill_smoke.py | |
| - name: fep sampled binding smoke (opt-in, ~10 min, manual) | |
| if: > | |
| github.event_name == 'workflow_dispatch' && | |
| github.event.inputs.run_sampled_binding_smoke == 'true' | |
| env: | |
| CELLSIM_RUN_SAMPLED_SMOKE: "1" | |
| run: python -u tests/fep/test_sampled_binding_smoke.py | |
| - name: halogen-parse smoke (Layer 1.3, regress PDBQT Cl/Br parsing) | |
| run: python -u tests/dock/test_halogen_parse_smoke.py | |
| - name: load_smi SDF+smi dispatch smoke (Layer 1.3, wet-lab input) | |
| run: python -u tests/dock/test_load_smi_sdf_smoke.py | |
| - name: receptor PDB-ID resolver smoke (Layer 1.3, wet-lab input) | |
| run: python -u tests/dock/test_receptor_resolve_smoke.py | |
| - name: dock vina cache smoke (cache hit speed-up) | |
| run: python -u tests/dock/test_vina_cache.py | |
| - name: dock pose export smoke (SDF + PDB for PyMOL/ChimeraX) | |
| run: python -u tests/dock/test_export_smoke.py | |
| - name: dock off-target smoke (biotin vs 3 receptors) | |
| run: python -u tests/dock/test_off_target_smoke.py | |
| - name: quantum smoke (Layer 1.4, xTB GFN2 on 10 drugs, 8/10) | |
| run: python -u tests/quantum/test_xtb_smoke.py --gate 8 | |
| - name: SoM smoke (Layer 1.4, CYP3A4 BDE on 3 drugs) | |
| run: python -u tests/quantum/test_som_smoke.py | |
| - name: SoM heme-access smoke (Layer 1.4, dock + Fe-distance filter) | |
| run: python -u tests/quantum/test_som_heme_access_smoke.py | |
| - name: DFT smoke (Layer 1.4, PySCF B3LYP/def2-SVP) | |
| run: python -u tests/quantum/test_dft_smoke.py | |
| - name: UQ MC-dock smoke (Layer 1.6, 4 seeds on 1STP biotin) | |
| run: python -u tests/uq/test_mc_dock_smoke.py | |
| - name: UQ conformal smoke (Layer 1.6, synthetic calibration) | |
| run: python -u tests/uq/test_conformal_smoke.py | |
| - name: UQ calibration (Layer 1.7, streptavidin vs K_d) | |
| run: python -u tests/uq/test_calibration_smoke.py | |
| - name: UQ EGFR kinase calibration (Layer 1.7, honest Vina failure) | |
| run: python -u tests/uq/test_egfr_calibration_smoke.py | |
| - name: cache smoke (content-addressed SQLite store) | |
| run: python -u tests/cache/test_cache_smoke.py | |
| scale: | |
| name: scale (workflow_dispatch only) | |
| if: > | |
| github.event_name == 'workflow_dispatch' && | |
| github.event.inputs.scale_n != '0' | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| shell: bash -el {0} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up miniforge + cellsim env | |
| uses: conda-incubator/setup-miniconda@v3 | |
| with: | |
| environment-file: environment.yml | |
| activate-environment: cellsim | |
| miniforge-version: latest | |
| use-mamba: true | |
| - name: Fetch ChEMBL subset | |
| run: python scripts/fetch_chembl_sample.py --n ${{ github.event.inputs.scale_n }} | |
| - name: Scale parametrise (gate 99 %) | |
| run: | | |
| python -u tests/chem/test_parametrize_scale.py \ | |
| --smi data/chembl/chembl_${{ github.event.inputs.scale_n }}.smi \ | |
| --workers $(nproc) --charge am1bcc --gate 99.0 |