From 13abc2408199df81589b262685fd0a2eecee6c6f Mon Sep 17 00:00:00 2001 From: "Josef M. Gallmetzer" <64498081+galjos@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:52:10 +0200 Subject: [PATCH] fix: reject mm-opt with MD ensembles mm-opt is an optimization job type. Pairing it with NVT/NVE/NPT used to validate and export fake MD input. --- pqsetup/input_writer.py | 10 ++++++++++ tests/test_presets_and_input.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/pqsetup/input_writer.py b/pqsetup/input_writer.py index 7f7406d..99b10b9 100644 --- a/pqsetup/input_writer.py +++ b/pqsetup/input_writer.py @@ -256,6 +256,16 @@ def validate_setup( ), ) ) + if setup.job_type == "mm-opt" and setup.ensemble != "OPT": + diagnostics.append( + _error( + "workflow.mm_opt_ensemble", + ( + "mm-opt is an optimization job type and cannot use an " + "MD ensemble." + ), + ) + ) if not setup.start_file: diagnostics.append(_error("input.start_file", "Start file is required.")) if not setup.file_prefix: diff --git a/tests/test_presets_and_input.py b/tests/test_presets_and_input.py index 9863a69..20b8532 100644 --- a/tests/test_presets_and_input.py +++ b/tests/test_presets_and_input.py @@ -73,6 +73,20 @@ def test_incomplete_mm_optimization_package_is_rejected() -> None: assert {item.code for item in result.diagnostics} == {"workflow.unsupported"} +def test_mm_opt_with_md_ensemble_is_rejected() -> None: + result = render_input( + SimulationSetup( + job_type="mm-opt", + ensemble="NVT", + thermostat="berendsen", + runner=None, + ) + ) + + assert not result.valid + assert "workflow.mm_opt_ensemble" in {item.code for item in result.diagnostics} + + def test_unreleased_and_unknown_runners_fail_without_probing( monkeypatch, ) -> None: