Skip to content

MD-tools v0.5.1

Released 2026-09-10, tagged openmm-v0.5.1 on dev, merged to main. Not on PyPI.

One fix, and it is the one a scheduler-killed campaign needs first: an interrupted CV-enabled REST2 ladder can be resumed. It could not be, on any ladder whose tau is not exactly representable at six decimal places.

Suite at the tagged commit: 2061 passed, 3 skipped.

What was wrong

Three implementations of one linear tau ladder:

where rounds? role
remd/generated.py::tau_ladder yes, six places what a generated _protocol.py executes, what a state trajectory records as its tau attribute, what every cv_stateN.json sidecar stores
rest2/scaler.py::linear_tau_ladder no REST2Scaler.ladder()
run/continuation.py, inline no the resume check

They agree to six decimals and no further. The continuation check compares a recorded tau against a recomputed one with a 1e-12 tolerance, so it refused:

cv_state1.json records tau 0.166667 for state 1 and this ladder resolves 0.16666666666666666

Nothing was wrong with the data. The spelling that never ran was the one asked to judge the one that did.

Who was affected

Only ladders whose rung spacing is a repeating decimal, and only with CV reporting on.

rungs tau ladder resume in 0.5.0
2, 3, 5, 6 exactly representable worked
4, 8, 12 1/6, 1/7, 1/11 refused

A ladder with collective_variables.file: null was never affected: the check that refused reads the CV sidecars, and there are none.

The fix

One implementation. run/continuation.py's inline copy is gone, and rest2.linear_tau_ladder delegates rather than rounding to match — two implementations that agree are the arrangement that produced this, and rounding both would have preserved it. linear_tau_ladder keeps its name and signature because it is public API, and refuses a non-zero minimum rather than reimplementing the ladder for a caller that does not exist.

tests/test_rest2_api.py asserted pytest.approx([0, 1/6, 1/3, 0.5]) at the default 1e-6 relative tolerance, which the rounded ladder just exceeds — so the test encoded the mathematical ideal while every run used the rounded values. It now asserts the ladder that runs, and asserts identity between the two names rather than approximate agreement.

How it was found

By running the integration experiment 20260907-readiness.md deferred: "one REST2 ladder end to end from MD-project's own orchestration … and deliberately interrupt and resume it once mid-campaign."

A four-rung implicit ladder with CV reporting, SIGINT at step 2,610,250 of 5,000,000 — an arbitrary point mid-production, not an instrumented boundary. The interrupt behaved exactly as designed:

# interrupted at step 2610250 of 5000000; a checkpoint was committed and --resume will continue it

and then the resume was refused. After the fix, the same run resumed and completed: 20001 of 20001 rows on every state, zero duplicates, zero missing, strictly increasing on the exact grid 0, 250, …, 5000000.

This is the argument for the experiment. A difference in the seventh decimal is invisible in a fixture, survives every unit test in the suite, and stops a campaign the first time a scheduler kills a job.

Unchanged

Everything in v0.5.0.md, including its Known limitations — a build is still not reproducible from its inputs on the ligand and peptide-like routes. Open entries remain in ../backlog.md.