0.5.4 — one shape of generated run, and the whole chain checked before it is written¶
Breaking. md-openmm build-md --all-in-one is gone, md_tools.md.run_generated_workflow is
gone, and build-md now requires a built System for every protocol rather than only for a ladder.
Each is described below with what to do instead.
--all-in-one is retired¶
The flag emitted a single md.py running every stage in one process, instead of one script per
stage. It ran the same stages, under the same resolved settings, seeds, logs, checkpoints and
restart semantics — the only difference was the number of processes.
It was not, as the name suggested, a bundle that runs without MD-tools installed: the generated
md.py imported md_tools.md exactly as every other generated script does. The command that
produces something runnable without this package is md-openmm export-reference, and it is
unaffected.
So the feature cost two implementations of every generated-run behaviour, and the split form was
the one that got tested. Its per-stage filing was also wrong in a way nobody had reason to notice
— every stage's artefacts landed flat in the run root instead of in <run>/eq/ and the shared
<system>/min/, so a split run and an all-in-one run of one configuration produced the same
filenames in different places, and only the split one was where the layout says to look.
What to do instead: generate as usual and run ./run.sh, which drives the same stages through
md-openmm md-run in order. Nothing about the resulting run differs.
The whole-chain preflight moved to generation, where it is worth more¶
What --all-in-one did carry alone was a preflight over the entire chain. A split chain
preflights one stage as that stage starts, so a configuration whose LAST stage asks 4 fs of
unrepartitioned masses, or NPT of an implicit System, ran every earlier stage to completion and
only then refused — the queue time spent, and a run directory left holding a chain that cannot be
finished.
That check now lives in build-md, which is the surface that sees the whole chain, and it arrives
earlier than it ever did: the refusal comes before a script exists at all, so an invalid chain
is never written rather than written and then declined at run time.
$ md-openmm build-md -odir ./cMD-run2 --config explicit.config
build-md: this chain: stage eq_npt_posres asks for NPT, but the System has no periodic box:
implicit solvent has no volume to control. Implicit stages are NVT and are named for it; an NPT
stage with the pressure quietly ignored reports an ensemble it did not sample.
A refused generation creates nothing — no run directory, no shared input/ file — which is the
same rule --check follows.
Both rules the retired chain carried are kept, and both are asserted:
- A stage's parent is stated, not inferred from its absence. At generation time every stage
after the first is missing its parent by construction, which is exactly what
PendingParentnames. The validator walks the chain through the same continuation check a run uses rather than skipping it, because a chain that simply did not look is the silent leniency that rule replaced. - Nothing is written until the whole chain passes, including the cross-stage check that two stages do not write one path — which no single stage's own inventory can see.
Device-free, deliberately. The generation-time validator resolves no platform, places no device, opens no CUDA Context and does not consult the MPI world. Generation routinely happens on a login node, in CI, or simply on a different machine from the run, so a device answered there would be an answer about the wrong computer. Those checks stay in the run-time preflight, where the machine actually is. What is checked at generation is what a machine cannot change: the masses behind a timestep, the box behind an ensemble, the forces the scaling convention has to place, and the paths the chain writes.
build-md needs the built System for every protocol¶
A ladder already required build/built.{xml,pdb}, because its rungs are scaled and serialised at
build time. Every protocol requires them now, because every protocol's chain is validated against
that System.
$ md-openmm build-md -odir ./cMD-run1 --config cMD.config
build-md: build-md validates the whole chain when it generates it, so it needs the built system
that every run on this dataset shares:
missing: build/built.xml
missing: build/built.pdb
Run `md-openmm build-top` into build/ first.
build-md for cMD used to generate in a bare directory and leave all of those questions to the
first stage that opened the System. What to do instead: run build-top into the dataset's
build/ before generating any run on it, which is the documented order already.
A consequence worth stating: a dataset root has ONE built System, and it must match the projects generated in it. An explicit-solvent project on a boxless GBn2 System is now refused rather than generated and discovered later.
The retired-command guard is retired¶
sys-config, sys-gen, md-gen, setup and show-default were removed long enough ago that a
test and a CI loop asserting they still fail had become upkeep with nothing behind it. Both are
gone, along with the RETIRED_COMMANDS list. The guarantee that no SECOND EXECUTABLE is installed
is a different and still-live rule, and CI still checks it.