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:
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:
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.