Skip to content

feat: JaxLoss bugfix, per-molecule JIT, optimizer routing, MM3 fixes #622

feat: JaxLoss bugfix, per-molecule JIT, optimizer routing, MM3 fixes

feat: JaxLoss bugfix, per-molecule JIT, optimizer routing, MM3 fixes #622

Workflow file for this run

name: CI
on:
push:
branches: [master]
pull_request:
branches: [master]
schedule:
# Nightly run — every day at 04:00 UTC
- cron: "0 4 * * *"
jobs:
# ================================================================
# Tier 1 — Fast feedback on every push and PR (~30s)
# ================================================================
lint:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: python -m pip install -e ".[dev]"
- run: python -m ruff check q2mm/ test/ scripts/
- run: python -m ruff format --check q2mm test scripts examples
- run: python scripts/check_env_dep_parity.py
test-core:
runs-on: ubuntu-latest
permissions:
contents: read
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: python -m pip install -e ".[dev]"
- run: python -m pytest -m "not (openmm or tinker or jax or jax_md or psi4)" -q
# ================================================================
# Tier 2 — Backend integration on every push (~2-5 min)
# Gated behind Tier 1 so lint/core failures are caught first.
# Images: ghcr.io/ericchansen/q2mm/ci-<backend>:latest
# ================================================================
test-openmm:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-openmm:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest -m openmm --run-integration -q
test-tinker:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-tinker:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest -m tinker --run-integration -q
test-jax:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-jax:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest -m jax --run-integration -q
test-jax-md:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-jax-md:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest -m jax_md --run-integration -q
test-psi4:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-psi4:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest -m psi4 --run-integration -q
test-cross-backend:
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-full:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest --run-integration -q
# ================================================================
# Tier 3 — Validation on merge to master (~3-5 min)
# Fast correctness checks: Seminario parity, published FF, ethane TS.
# No optimizer loops — just FF loading, projection, frequency eval.
# ================================================================
test-validation:
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
needs: [test-openmm, test-tinker, test-jax, test-jax-md, test-psi4, test-cross-backend]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-full:latest
options: --user root
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest --run-validation -q
# ================================================================
# Tier 4 — Nightly: heavy tests with optimizer loops (~20-30 min)
# SN2 e2e (L-BFGS-B 200 iter), Rh-enamide full loops, benchmarks.
# ================================================================
test-nightly:
if: github.event_name == 'schedule'
needs: [lint, test-core]
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
container:
image: ghcr.io/ericchansen/q2mm/ci-full:latest
options: --user root
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- run: python -m pip install -e . --no-deps && python -m pytest --run-nightly -q