From 37566a86da4ea1a17b0b187f1949a8f1c16bbce4 Mon Sep 17 00:00:00 2001 From: finlayclark Date: Sat, 4 Jan 2025 22:19:59 +0000 Subject: [PATCH] Replace run_somd.sh with Pydantic config This includes updates to the docs and a purge of run_somd.sh from all the example directories. Note that a3fe/tests/test_sys_prep_configuration.py::test_config_dump_and_load seems to be flaky - failing when run with all the tests, but fine when run individually. --- README.md | 7 +- a3fe/__init__.py | 2 +- a3fe/analyse/mbar.py | 74 ++++----- a3fe/analyse/process_grads.py | 2 +- a3fe/configuration/__init__.py | 1 + a3fe/configuration/slurm_config.py | 149 ++++++++++++++++++ .../alternative_input/alternative_run_somd.sh | 16 -- .../bound/restrain/input/run_somd.sh | 15 -- .../output/lambda_0.000/run_01/run_somd.sh | 13 -- .../output/lambda_0.000/run_02/run_somd.sh | 13 -- .../output/lambda_0.000/run_03/run_somd.sh | 13 -- .../output/lambda_0.000/run_04/run_somd.sh | 13 -- .../output/lambda_0.000/run_05/run_somd.sh | 13 -- .../output/lambda_0.125/run_01/run_somd.sh | 13 -- .../output/lambda_0.125/run_02/run_somd.sh | 13 -- .../output/lambda_0.125/run_03/run_somd.sh | 13 -- .../output/lambda_0.125/run_04/run_somd.sh | 13 -- .../output/lambda_0.125/run_05/run_somd.sh | 13 -- .../output/lambda_0.250/run_01/run_somd.sh | 13 -- .../output/lambda_0.250/run_02/run_somd.sh | 13 -- .../output/lambda_0.250/run_03/run_somd.sh | 13 -- .../output/lambda_0.250/run_04/run_somd.sh | 13 -- .../output/lambda_0.250/run_05/run_somd.sh | 13 -- .../output/lambda_0.375/run_01/run_somd.sh | 13 -- .../output/lambda_0.375/run_02/run_somd.sh | 13 -- .../output/lambda_0.375/run_03/run_somd.sh | 13 -- .../output/lambda_0.375/run_04/run_somd.sh | 13 -- .../output/lambda_0.375/run_05/run_somd.sh | 13 -- .../output/lambda_0.500/run_01/run_somd.sh | 13 -- .../output/lambda_0.500/run_02/run_somd.sh | 13 -- .../output/lambda_0.500/run_03/run_somd.sh | 13 -- .../output/lambda_0.500/run_04/run_somd.sh | 13 -- .../output/lambda_0.500/run_05/run_somd.sh | 13 -- .../output/lambda_1.000/run_01/run_somd.sh | 13 -- .../output/lambda_1.000/run_02/run_somd.sh | 13 -- .../output/lambda_1.000/run_03/run_somd.sh | 13 -- .../output/lambda_1.000/run_04/run_somd.sh | 13 -- .../output/lambda_1.000/run_05/run_somd.sh | 13 -- .../mdm2_pip2_short/input/run_somd.sh | 14 -- .../t4l/bound/restrain/input/run_somd.sh | 14 -- .../output/lambda_0.000/run_01/run_somd.sh | 14 -- .../output/lambda_0.000/run_02/run_somd.sh | 14 -- .../output/lambda_0.000/run_03/run_somd.sh | 14 -- .../output/lambda_0.000/run_04/run_somd.sh | 14 -- .../output/lambda_0.000/run_05/run_somd.sh | 14 -- .../output/lambda_0.125/run_01/run_somd.sh | 14 -- .../output/lambda_0.125/run_02/run_somd.sh | 14 -- .../output/lambda_0.125/run_03/run_somd.sh | 14 -- .../output/lambda_0.125/run_04/run_somd.sh | 14 -- .../output/lambda_0.125/run_05/run_somd.sh | 14 -- .../output/lambda_0.250/run_01/run_somd.sh | 14 -- .../output/lambda_0.250/run_02/run_somd.sh | 14 -- .../output/lambda_0.250/run_03/run_somd.sh | 14 -- .../output/lambda_0.250/run_04/run_somd.sh | 14 -- .../output/lambda_0.250/run_05/run_somd.sh | 14 -- .../output/lambda_0.375/run_01/run_somd.sh | 14 -- .../output/lambda_0.375/run_02/run_somd.sh | 14 -- .../output/lambda_0.375/run_03/run_somd.sh | 14 -- .../output/lambda_0.375/run_04/run_somd.sh | 14 -- .../output/lambda_0.375/run_05/run_somd.sh | 14 -- .../output/lambda_0.500/run_01/run_somd.sh | 14 -- .../output/lambda_0.500/run_02/run_somd.sh | 14 -- .../output/lambda_0.500/run_03/run_somd.sh | 14 -- .../output/lambda_0.500/run_04/run_somd.sh | 14 -- .../output/lambda_0.500/run_05/run_somd.sh | 14 -- .../output/lambda_1.000/run_01/run_somd.sh | 14 -- .../output/lambda_1.000/run_02/run_somd.sh | 14 -- .../output/lambda_1.000/run_03/run_somd.sh | 14 -- .../output/lambda_1.000/run_04/run_somd.sh | 14 -- .../output/lambda_1.000/run_05/run_somd.sh | 14 -- .../example_calc_set/t4l/input/run_somd.sh | 14 -- a3fe/data/example_restraint_stage/Stage.pkl | Bin 38056 -> 41660 bytes .../example_restraint_stage/input/run_somd.sh | 14 -- .../output/lambda_0.000/LamWindow.pkl | Bin 6908 -> 7566 bytes .../output/lambda_0.000/run_01/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.000/run_02/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.000/run_03/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.000/run_04/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.000/run_05/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.125/LamWindow.pkl | Bin 6928 -> 7586 bytes .../output/lambda_0.125/run_01/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.125/run_02/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.125/run_03/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.125/run_04/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.125/run_05/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.250/LamWindow.pkl | Bin 6918 -> 7577 bytes .../output/lambda_0.250/run_01/Simulation.pkl | Bin 1788 -> 2121 bytes .../output/lambda_0.250/run_02/Simulation.pkl | Bin 1788 -> 2121 bytes .../output/lambda_0.250/run_03/Simulation.pkl | Bin 1788 -> 2121 bytes .../output/lambda_0.250/run_04/Simulation.pkl | Bin 1788 -> 2121 bytes .../output/lambda_0.250/run_05/Simulation.pkl | Bin 1788 -> 2121 bytes .../output/lambda_0.375/LamWindow.pkl | Bin 6928 -> 7587 bytes .../output/lambda_0.375/run_01/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.375/run_02/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.375/run_03/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.375/run_04/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.375/run_05/Simulation.pkl | Bin 1790 -> 2123 bytes .../output/lambda_0.500/LamWindow.pkl | Bin 6908 -> 7567 bytes .../output/lambda_0.500/run_01/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.500/run_02/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.500/run_03/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.500/run_04/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_0.500/run_05/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_1.000/LamWindow.pkl | Bin 6908 -> 7567 bytes .../output/lambda_1.000/run_01/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_1.000/run_02/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_1.000/run_03/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_1.000/run_04/Simulation.pkl | Bin 1786 -> 2119 bytes .../output/lambda_1.000/run_05/Simulation.pkl | Bin 1786 -> 2119 bytes .../bound/discharge/input/run_somd.sh | 12 -- .../output/lambda_0.000/run_01/run_somd.sh | 12 -- .../free/discharge/input/run_somd.sh | 12 -- .../output/lambda_0.000/run_01/run_somd.sh | 12 -- a3fe/data/example_run_dir/input/run_somd.sh | 12 -- a3fe/read/_process_slurm_files.py | 37 ----- a3fe/run/_simulation_runner.py | 29 ++++ a3fe/run/_virtual_queue.py | 12 +- a3fe/run/calc_set.py | 22 ++- a3fe/run/calculation.py | 37 ++--- a3fe/run/enums.py | 1 + a3fe/run/lambda_window.py | 14 ++ a3fe/run/leg.py | 55 +++---- a3fe/run/simulation.py | 34 ++-- a3fe/run/stage.py | 30 +++- a3fe/tests/conftest.py | 2 +- a3fe/tests/test_read.py | 16 -- a3fe/tests/test_run.py | 3 - a3fe/tests/test_slurm_configuration.py | 118 ++++++++++++++ ...tion.py => test_sys_prep_configuration.py} | 4 +- docs/a3fe_design.rst | 10 +- docs/getting_started.rst | 7 +- docs/guides.rst | 44 +++++- environment.yaml | 2 +- 133 files changed, 521 insertions(+), 1148 deletions(-) create mode 100644 a3fe/configuration/slurm_config.py delete mode 100644 a3fe/data/alternative_input/alternative_run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/input/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/mdm2_pip2_short/input/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/input/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_02/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_03/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_04/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_05/run_somd.sh delete mode 100644 a3fe/data/example_calc_set/t4l/input/run_somd.sh delete mode 100644 a3fe/data/example_restraint_stage/input/run_somd.sh delete mode 100644 a3fe/data/example_run_dir/bound/discharge/input/run_somd.sh delete mode 100644 a3fe/data/example_run_dir/bound/discharge/output/lambda_0.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_run_dir/free/discharge/input/run_somd.sh delete mode 100644 a3fe/data/example_run_dir/free/discharge/output/lambda_0.000/run_01/run_somd.sh delete mode 100644 a3fe/data/example_run_dir/input/run_somd.sh delete mode 100644 a3fe/read/_process_slurm_files.py create mode 100644 a3fe/tests/test_slurm_configuration.py rename a3fe/tests/{test_configuration.py => test_sys_prep_configuration.py} (92%) diff --git a/README.md b/README.md index b8cca70..6d7b923 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,15 @@ python -m pip install --no-deps . - Activate your a3fe conda environment - Create a base directory for the calculation and create an directory called `input` within this - Move your input files into the the input directory. For example, if you have parameterised AMBER-format input files, name these bound_param.rst7, bound_param.prm7, free_param.rst7, and free_param.prm7. For more details see the documentation. Alternatively, copy the example input files from a3fe/a3fe/data/example_run_dir to your input directory. -- Copy run somd.sh and template_config.sh from a3fe/a3fe/data/example_run_dir to your `input` directory, making sure to the SLURM options in run_somd.sh so that the jobs will run on your cluster +- Copy run template_config.cfg from a3fe/a3fe/data/example_run_dir to your `input` directory. - In the calculation base directory, run the following python code, either through ipython or as a python script (you will likely want to run the script with `nohup`or use ipython through tmux to ensure that the calculation is not killed when you lose connection) ```python import a3fe as a3 -calc = a3.Calculation(ensemble_size=5) +calc = a3.Calculation( + ensemble_size=5, # Use 5 (independently equilibrated) replicate runs + slurm_config=a3.SlurmConfig(partition=""), # Set your desired partition! +) calc.setup() calc.get_optimal_lam_vals() calc.run(adaptive=False, runtime = 5) # Run non-adaptively for 5 ns per replicate diff --git a/a3fe/__init__.py b/a3fe/__init__.py index 0b3d19a..570eea0 100644 --- a/a3fe/__init__.py +++ b/a3fe/__init__.py @@ -27,7 +27,7 @@ enums, ) -from .configuration import SystemPreparationConfig +from .configuration import SystemPreparationConfig, SlurmConfig _sys.modules["EnsEquil"] = _sys.modules["a3fe"] diff --git a/a3fe/analyse/mbar.py b/a3fe/analyse/mbar.py index 20965da..ee35953 100644 --- a/a3fe/analyse/mbar.py +++ b/a3fe/analyse/mbar.py @@ -15,7 +15,6 @@ import numpy as _np -from ..read._process_slurm_files import get_slurm_file_base as _get_slurm_file_base from ..read._process_somd_files import read_mbar_gradients as _read_mbar_gradients from ..read._process_somd_files import read_mbar_result as _read_mbar_result from ..read._process_somd_files import ( @@ -24,6 +23,8 @@ from ..run._virtual_queue import Job as _Job from ..run._virtual_queue import VirtualQueue as _VirtualQueue +from ..configuration import SlurmConfig as _SlurmConfig + def run_mbar( output_dir: str, @@ -127,8 +128,8 @@ def run_mbar( def submit_mbar_slurm( output_dir: str, virtual_queue: _VirtualQueue, + slurm_config: _SlurmConfig, run_nos: _List[int], - run_somd_dir: str, percentage_end: float = 100, percentage_start: float = 0, subsampling: bool = False, @@ -144,11 +145,10 @@ def submit_mbar_slurm( The path to the output directory virtual_queue : VirtualQueue The virtual queue to submit the MBAR jobs to. + slurm_config: SlurmConfig + The SLURM configuration to use for the jobs. run_nos : List[int] The run numbers to use for MBAR. - run_somd_dir : str - The directory in which to find the `run_somd.sh` script, from - which the slurm header will be copied. percentage_end : float, Optional, default: 100 The percentage of data after which to truncate the datafiles. For example, if 100, the full datafile will be used. If 50, only @@ -175,11 +175,11 @@ def submit_mbar_slurm( The paths to the MBAR output files, which will be created once the jobs complete. - tmp_simfiles : List[str] - The paths to the temporary truncated simfiles, so that they can be - cleaned up later. + tmp_files : List[str] + The paths to temporary files (truncated simfiles and submission scripts), + so that they can be cleaned up later. """ - tmp_simfiles = _prepare_simfiles( + tmp_files = _prepare_simfiles( output_dir=output_dir, run_nos=run_nos, percentage_end=percentage_end, @@ -187,23 +187,17 @@ def submit_mbar_slurm( equilibrated=equilibrated, ) - # Read the slurm header - # Get the header from run_somd.sh - header_lines = [] - with open(f"{run_somd_dir}/run_somd.sh", "r") as file: - for line in file.readlines(): - if line.startswith("#SBATCH") or line.startswith("#!/bin/bash"): - header_lines.append(line) - else: - break - # Add MBAR command and run for each run. mbar_out_files = [] jobs = [] + for run_no in run_nos: - # Get the name of the output file + # Get the name of the output files - the first for the MBAR output, and the second for the SLURM output outfile = f"{output_dir}/freenrg-MBAR-run_{str(run_no).zfill(2)}_{round(percentage_end, 3)}_end_{round(percentage_start, 3)}_start.dat" mbar_out_files.append(outfile) + slurm_outfile = f"slurm_freenrg-MBAR-run_{str(run_no).zfill(2)}_{round(percentage_end, 3)}_end_{round(percentage_start, 3)}_start.out" + slurm_config.output = slurm_outfile + # Create the command. cmd_list = [ "analyse_freenrg", @@ -219,21 +213,19 @@ def submit_mbar_slurm( if subsampling: cmd_list.append("--subsampling") slurm_cmd = " ".join(cmd_list) - slurm_lines = header_lines + [slurm_cmd] - # Write the slurm file - slurm_file = f"{output_dir}/freenrg-MBAR-run_{str(run_no).zfill(2)}_{round(percentage_end, 3)}_end_{round(percentage_start, 3)}_start.sh" - with open(slurm_file, "w") as file: - file.writelines(slurm_lines) - # Submit to the virtual queue - cmd_list = [ - "--chdir", - f"{output_dir}", - f"{slurm_file}", - ] # The virtual queue adds sbatch - slurm_file_base = _get_slurm_file_base(slurm_file) - job = virtual_queue.submit(cmd_list, slurm_file_base=slurm_file_base) - # Update the virtual queue to submit the job + # Create and submit the job + script_name = f"{output_dir}/freenrg-MBAR-run_{str(run_no).zfill(2)}_{round(percentage_end, 3)}_end_{round(percentage_start, 3)}_start" + submission_args = slurm_config.get_submission_cmds( + slurm_cmd, output_dir, script_name + ) + job = virtual_queue.submit( + submission_args, + slurm_file_base=slurm_config.get_slurm_output_file_base(output_dir), + ) + tmp_files += [script_name + ".sh", _os.path.join(output_dir, slurm_outfile)] + + # Update the virtual queue to submit the job to the real queue virtual_queue.update() jobs.append(job) @@ -244,7 +236,7 @@ def submit_mbar_slurm( _sleep(30) virtual_queue.update() - return jobs, mbar_out_files, tmp_simfiles + return jobs, mbar_out_files, tmp_files def collect_mbar_slurm( @@ -254,7 +246,7 @@ def collect_mbar_slurm( mbar_out_files: _List[str], virtual_queue: _VirtualQueue, delete_outfiles: bool = False, - tmp_simfiles: _List[str] = [], + tmp_files: _List[str] = [], ) -> _Tuple[_np.ndarray, _np.ndarray, _List[str], _Dict[str, _Dict[str, _np.ndarray]]]: """ Collect the results from MBAR slurm jobs. @@ -274,9 +266,9 @@ def collect_mbar_slurm( delete_outfiles : bool, Optional, default: False Whether to delete the MBAR analysis output files after the free energy change and errors have been extracted. - tmp_simfiles : List[str], Optional, default: [] - The paths to the temporary truncated simfiles, so that they can be - cleaned up later. + tmp_files : List[str], Optional, default: [] + The paths to temporary files (truncated simfiles and submission scripts), + so that they can be cleaned up later. Returns ------- @@ -324,8 +316,8 @@ def collect_mbar_slurm( mbar_out_files = [] # Clean up temporary simfiles - for tmp_simfile in tmp_simfiles: - _subprocess.run(["rm", tmp_simfile]) + for tmp_file in tmp_files: + _subprocess.run(["rm", tmp_file]) return free_energies, errors, mbar_out_files, mbar_grads diff --git a/a3fe/analyse/process_grads.py b/a3fe/analyse/process_grads.py index c00e75a..54b7e89 100644 --- a/a3fe/analyse/process_grads.py +++ b/a3fe/analyse/process_grads.py @@ -750,8 +750,8 @@ def get_time_series_multiwindow_mbar( _submit_mbar_slurm( output_dir=output_dir, virtual_queue=lambda_windows[0].virtual_queue, + slurm_config=lambda_windows[0].analysis_slurm_config, run_nos=run_nos, - run_somd_dir=lambda_windows[0].input_dir, percentage_end=end_frac * 100, percentage_start=start_frac * 100, subsampling=False, diff --git a/a3fe/configuration/__init__.py b/a3fe/configuration/__init__.py index b8030db..9ea7e32 100644 --- a/a3fe/configuration/__init__.py +++ b/a3fe/configuration/__init__.py @@ -1,3 +1,4 @@ """Pydantic configuration classes for the a3fe package.""" from .system_prep_config import SystemPreparationConfig +from .slurm_config import SlurmConfig diff --git a/a3fe/configuration/slurm_config.py b/a3fe/configuration/slurm_config.py new file mode 100644 index 0000000..c2dfdd1 --- /dev/null +++ b/a3fe/configuration/slurm_config.py @@ -0,0 +1,149 @@ +"""Configuration classes for SLURM configuration.""" + +__all__ = [ + "SlurmConfig", +] + +import yaml as _yaml +import subprocess as _subprocess +import re as _re + +from pydantic import BaseModel as _BaseModel +from pydantic import Field as _Field +from pydantic import ConfigDict as _ConfigDict + +import os as _os + +from typing import List as _List, Dict as _Dict + + +class SlurmConfig(_BaseModel): + """ + Pydantic model for holding a SLURM configuration. + """ + + partition: str = _Field("default", description="SLURM partition to submit to.") + time: str = _Field("24:00:00", description="Time limit for the SLURM job.") + gres: str = _Field("gpu:1", description="Resources to request - normally one GPU.") + nodes: int = _Field(1, ge=1) + ntasks_per_node: int = _Field(1, ge=1) + output: str = _Field( + "slurm-%A.%a.out", description="Output file for the SLURM job." + ) + extra_options: _Dict[str, str] = _Field( + {}, description="Extra options to pass to SLURM. For example, {'account': 'qt'}" + ) + + model_config = _ConfigDict(validate_assignment=True) + + def get_submission_cmds( + self, cmd: str, run_dir: str, script_name: str = "a3fe" + ) -> _List[str]: + """ + Generates the SLURM submission commands list based on the configuration. + + Parameters + ---------- + cmd : str + Command to run during the SLURM job. + + run_dir : str + Directory to submit the SLURM job from. + + script_name : str, optional, default="a3fe" + Name of the script file to write. Note that when running many jobs from the + same directory, this should be unique to avoid overwriting the script file. + + Returns + ------- + List[str] + The list of SLURM arguments. + """ + # First, write the script to a file + script_path = _os.path.join(run_dir, f"{script_name}.sh") + + script = ( + "#!/bin/bash\n" + f"#SBATCH --partition={self.partition}\n" + f"#SBATCH --time={self.time}\n" + f"#SBATCH --gres={self.gres}\n" + f"#SBATCH --nodes={self.nodes}\n" + f"#SBATCH --ntasks-per-node={self.ntasks_per_node}\n" + f"#SBATCH --output={self.output}\n" + ) + + for key, value in self.extra_options.items(): + script += f"#SBATCH --{key}={value}\n" + + script += f"\n{cmd}\n" + + with open(script_path, "w") as f: + f.write(script) + + return ["rbatch", f"--chdir={run_dir}", script_path] + + def get_slurm_output_file_base(self, run_dir: str) -> str: + """ + Get the base name of the SLURM output file. + + Parameters + ---------- + run_dir : str + Directory the job was submitted from. + + Returns + ------- + str + The base name of the SLURM output file. + """ + return run_dir + "/" + self.output.split("%")[0] + + @classmethod + def get_default_partition(cls) -> "str": + """Get the default SLURM partition.""" + sinfo = _subprocess.run( + ["sinfo", "-o", "%P", "-h"], stdout=_subprocess.PIPE, text=True + ) + # Search for the default queue (marked with "*", then throw away the "*") + return _re.search(r"([^\s]+)(?=\*)", sinfo.stdout).group(1) + + def dump(self, save_dir: str) -> None: + """ + Dumps the configuration to a YAML file. + + Parameters + ---------- + save_dir : str + Directory to save the YAML file to. + """ + model_dict = self.model_dump() + + save_path = save_dir + "/" + self.get_file_name() + with open(save_path, "w") as f: + _yaml.dump(model_dict, f, default_flow_style=False) + + @classmethod + def load(cls, load_dir: str) -> "SlurmConfig": + """ + Loads the configuration from a YAML file. + + Parameters + ---------- + load_dir : str + Directory to load the YAML file from. + + Returns + ------- + SlurmConfig + The loaded configuration. + """ + with open(load_dir + "/" + cls.get_file_name(), "r") as f: + model_dict = _yaml.safe_load(f) + return cls(**model_dict) + + @staticmethod + def get_file_name() -> str: + """ + Get the name of the SLURM configuration file. + """ + return "slurm_config.yaml" diff --git a/a3fe/data/alternative_input/alternative_run_somd.sh b/a3fe/data/alternative_input/alternative_run_somd.sh deleted file mode 100644 index 4fb148b..0000000 --- a/a3fe/data/alternative_input/alternative_run_somd.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -#SBATCH --account=qt -#SBATCH --nodes=1 -#SBATCH --time=24:00:00 -#SBATCH --gres=gpu:1 -#SBATCH --ntasks-per-node=1 -#SBATCH --cpus-per-task=2 -#SBATCH --exclude=node018 -#SBATCH --mem=50G -#SBATCH --output=somd-array-gpu-%A.%a.out - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/input/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/input/run_somd.sh deleted file mode 100644 index 8883ac9..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/input/run_somd.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH --exclude node01,node02,node04,node06 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.000/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.125/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.250/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.375/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_0.500/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_01/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_01/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_01/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_02/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_02/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_02/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_03/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_03/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_03/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_04/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_04/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_04/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_05/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_05/run_somd.sh deleted file mode 100644 index 528512c..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/bound/restrain/output/lambda_1.000/run_05/run_somd.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/mdm2_pip2_short/input/run_somd.sh b/a3fe/data/example_calc_set/mdm2_pip2_short/input/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/mdm2_pip2_short/input/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/input/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/input/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/input/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.000/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.125/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.250/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.375/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_0.500/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_01/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_01/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_01/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_02/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_02/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_02/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_03/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_03/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_03/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_04/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_04/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_04/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_05/run_somd.sh b/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_05/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/bound/restrain/output/lambda_1.000/run_05/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_calc_set/t4l/input/run_somd.sh b/a3fe/data/example_calc_set/t4l/input/run_somd.sh deleted file mode 100644 index 8f254e3..0000000 --- a/a3fe/data/example_calc_set/t4l/input/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p GTX980,RTX3080 -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_restraint_stage/Stage.pkl b/a3fe/data/example_restraint_stage/Stage.pkl index b23e76456c9d0ff057bd31b6075f6b3617edbbf2..8804038907e16da34a140f69f4919de78798f84b 100644 GIT binary patch literal 41660 zcmds=-ESOM6~LWuCytXeb(-|s1)AES-d)?fX;U>Ah=LKD7_|W^K3$#dyvnR-$-! zcK6(S&g}0@?$6iz{lh=~%`Yc{uXp`9al-Xzn-OoP!+ddyF1J|8=~^Xbbxqe7$8X7_ z-;f9I`t<`p^k4VIWP`elXu9KzH_O~MS-GWK2Hj~I)Y&MzcFWtQ4l8SHiy3A4f(sqy zxVA-&1ygTwW*D>)++WtHN6YLsH9H0)4s$(+>Xt{s5!r_3ixWh*I$bY}rtNREauCWF zQ^f9iQBbzeLBm+SIBVEcV;X5Wwn;jAbHiZ%`{E37yA9&%CV`?@kVbzUYW7%ECWD#{ zjgoEM((G+0*9~gE5q^KypMTGn1wI6i@mIrwPfYM*!pUVu<=)ULrAnpZ^W)-;U4$LmsqY<5`};QHji`9Km!Pkt+W^lQO` z`)7qXNnE4rn7!A4@thzXhs8G^BXo=EKvWoxd`0q>-5|Q=*Pjv7L0lM*MGW2aZ~pnX zI3@=eko&b=y<^6CH~RbqnDjB3gEk~8h}G7uHc+X}yc^-YcYQH9QQ1+t4RHvD?elqY z=xgwAH2G8g9Q7wPA&xa|)1(%(hJPZMV_(BGNfypTFK?JKvBqCcq;Ug zar5X!aTHpm*M&ZPcHrFVH*ZKL^l$k9Xx;~d=6yPRjg}7Qi|pgRcqhmF!PSAOEl|gy zI}7bjcR`kZGH7k`M7aYq)XiXM9qMsk{9son>Hin&VWES8mYOX%dnY~Jgi90F@mIfa z|K5Lo@!`LIBqlAV4V{{8`m0~m!`3QJ$;T16)FDl{6k`7B${&9wzkbedh wQ8O;i zzzl<-Hf;+|AIpQ0Ub_5`e?E0>fnVlV#B*_Tnw^6teihEW7iVQ!Ec@!>JXx;z!I{)M z8{t)2I;82@;F=`7)pdeKR|?Oy{v)PtNs?U)A0NHPCkX(l=@AlKtQ_x9$J4_udDw)j zL0=q}gM~6IRbQ!8;1Ar>hPSFOj=&l8$|C%0*&5siGM~0Q>Tb9}5#*inzN7sMtnkcV zc>YVJ=V=M<1hli;aK%Y%Kmw!!;&;VaLOMGdBt>tM@F?-u#Chf3md*^#B`%Xg{;@yD z=}*Lra=hc{ThwE4a1BoGa}+LncU&Ew5MaEQ3%=fM@TbEIG^O$L+4@1uj=zN3@gX{5 z$A{=)$LG((W!J^}5!uf89Dk8tg-zo(5)2ZX%9E0*pK>5Xh^8DL;oo^1u)geq= zEu-QJq9fu8qVED%2XSz;^Qivy0LJz47gg_6|N3r;;M>@ zD~OJWD~P@eTphx}RW(OkRkLvQC<3mk#luxNq~hZ$ow~7bRRvrv?+RB(FmY8w#T7(H z#1%x}1+EU`;Hs7*u4-Ahx`2SITJdld4ypLKN~dltT-5+q)da3sa*;%wXc%^Lqh~}8 zh$-;AaFa>><%_4I)#-3KjFmLzFZKk)mTpri*-=+F9d>LFLuZn$gj9@8Vh2?W~S@sBY;!kq(fpJduzZ1u? z5}gehOn$vs8A@8?;VjH1hE&*IoEWF-p28urG*G|5EPfBWJgl8_{d79ZcJoJn{;_s z$ilEmQ9V#>k{TTmS;K77AhM3(AS(x(6qg|zS)W5dR$7XnBdg#(NvUG;0(DGeNu%`A zu8@Ucl%jc}7$r42BC>`Vr9os(;vg#rqZF4R8(A+PAS*3K(2-Ser=(PIkI0f%DYaag z`5!|Js}#*MSh>u5Q-K;C5n02m(jc;q;~*;ss}z?Z8(H%R$V$r*bYvCWD=AgnBeJAf zx{|ocN}8p6`~z6?{}ul&|J@q@y_7us!}v)#ThqGdWAO zhi+>eOlg$K>E{~9x|l>6H^Pr>qPTJ@j7aBL~0H5Iw@*BibJg&yiQz+Y-+uZK&`Z$K&Mv0cj+iq z+#|K5*-7r6N$k>jD|mbC+3diW!R(}d!cZ|gAEB9@+QauDRxqVeW~ZNP9J3<_hi7)w z==paeHF|N)&J1+G{62#z&dL6poj6va0|s8_JNflLWgtn2WA(qpkP7Q{65|}@buvEi zXu#^g9!>dyN7?&yVoG9IooJRQR!5DFNXcPV=PyaCa}I}CIar;z5?RFhE&{QN<8+kV zNQf4nSn1Ryoz6&Nfzhd@uA!A*1QHVq!{|iSKruRMbVOneGdd|^J%&T99E?s}i7aBR zBM_@NK1a#TgF&ox>c%1#*qqv^JvuS5Fl}PU^I#Awow~7z1tzC9YKKltEDVzqRRhK3sL>ILHO%Csh;;#nSUH%SxDr{! zY9bJ;I37pI&4WR#bn3<;7MPXVr|r)P-WtO!&R-{juVm2l{v60GSe(@LoMLf4?!8pr zpPaK;syu8KCz#SGi__0FhQ$d7hh=dFqvzd;2BR0(;yj*X_fvDS-xf!WHPHRwfZUz4 zkyrN{7>H~&s*1p|IH@5ObWJohPBnGOMwD6;g=edKb84gZ=ERiD-{L5i7aAS2*gUO2y|i)F3wSl8auA;lH`#|1D?D^4cA}y=T^hyOiV-{ zF0|VJU7M>bz0H}cD<6fAT3zY22PRIl&8}|1*ge+tbldX9RFI-=-O}uBUz`C2;^`)n zBXT_o*;!rj-v0aQ2Q%-83l1}=r*FwQ!IR)y+k(fro=oi|foEE})rNGQkRHY3Fk1~$ zF}0x^M*rp=akBR~0wLv8#PpW#cwK6c%`WRQU!14QEmnd@mB`=`e(A11|DOM@KgUb! zKCi&vCHQ=$<(v19@v3;U%x#mETe@Y?ou)yZjk0UEylv{RvL@4Aman_eVUBATY`h=z ze#lWjfc8+p0;VT#fu?BM{0Y7E&|42h&p!0fV~}f5G&%L!H@n=O;qHc5LgAaWE(t@5 z@68+X_n6-sYJau=cOQpS(a$f#%WTH;^&Zju?LGR6<TJGxox>b_nhAL>@$B$`V+-_;G<*P>)XHlrDKKk(xK?|tn7YSFWY?1<(B zej4ZfuRl)w^iWsR(YvIpZMu%7^^ML$lY~#$3C#=InrB!VRNE%57e0UuIXAQirf#*n zy7t(xyUt_Si(9(&Ui|M*!}(u_dXP^vbfr) zE!_EvEqrNc3t@u;Q}+$WhDzNRH<~|IVjw=m*WZI8MR9tD-2(>oh<_{ouTMj^ z{^p1pEXoy_bJ`z}jz6dSbM+6eZq`?>U9T@S8mslULf%t?Hrod)4e0{g_cr`9t=F-n ztVtcF*rASNS-RZ~*?$)nIuw>a2hF7KxPC400Hj0Rs7>q+wV*FS_BGqFHNC6%ePfH% zEMrq!x>nbg>-D}@YdeA6ttGu^@Wvk^T`hjAV8)6=u-(KkTg9X0N z(^13YFQy$>j$uWq^>v?yEWn|9ypd6Ei=9n)QBV7Z1)oAlKWx4A?4SSpvOykwsT`?UR$|3cpuV>@h1zZG0{sKdyzZR zGImFTfVdqA0>&MQ&O^VyvT=ZZd*d{Ho!04h>H1&`z6bZTR8Vdik#fs9%F!R(KJprU zo8E!96(X&c3ur~}?$CRvT#B=ZxJ2JcaYTQVQi#5*3Oo4%(f7xo%ra2s+DOXmL#E6M zHf10nE@dEK3CiqMLzxvs%B&Po=C}gNtW<(BaTb-NOuj&4QDy}wbA2Rb_9IiKflV0* zh)Wp=Sb{S9)KI2@NSQ_vWnNG~nMNfj6K7FL%H#_)7G)aqTBAOaG6#?;)5N9>1jMBb z1S~6j9^yDcqQ1$3QM=TVTl_6Qf7DhWblv&$25&dn=h{r9!G+ zhYxS7306;~B5LjLgQqyd5T;s7%MnW_HhILsCafYEUk$K%SyFpxMK56un|MC4ctvVd zazK>tlB~7_u!n7LFAPf^k<%>!4Ed`{>+j148 zsopq2+N)iXh7S}{^HunNPe=oWbV-o}LpX&j2gD^!xq-rAHKaipD2U1zlV)B4Y4XNg z1!<}`Qjqp)m!#oCh2*ejZm2+i4?g%K`bYZl9r`Ek_vxQErsyZF)Z%0geB~uRBnknR zlMhXj#D9h<@t2!*?wOx+i4Ut7CGnGrqDg$7530nM1EMqsIbaEiKLgF-3p9x@lAFB5 z7qK$UA$IsRyxt&Xl0_e4Z^&d(C5N9$ZIr|RM&99P6n??kxi!HVB!!=@2utD10dYA~ zPT?O>!x;pHFDhTinYsebC^h&}Jvi+u$(ekCvIc)NXF%Y?$Ful*fAXOO!5JihpB5WS z;L8DVIa5yHA63H{1c5IqU&xuJ0?sJ)_fkD7%b9$E#^Vg=`(|=}u9!1O`aUf-mcEw* z;&P^(zMoaY83cVVDqqN%>k2rd)ZR<=s4Qpl1sabtAn%*0@si}d_&kFo@6%#q$$L2< zE@#Tg`(tW2gCOrkCb?m1Q-J=<1=KBgrlh@NKNK?J@_tIYNk~Cc4Cuh}UfiFmdB=FNEVF`RWATDXj z3H(!PNP{5oMdgc0b6Wvv@`73gX{vYrUfQc&l7=h%)O<+_Uyue#;ipT&QuuN}T+)d?BNWUH}N&HVSC4Lhw z4e|V+zlT+flK4qQ(Ih_42UX(B0a2QR9I%AMKMl5i8RiB8C5Byw)Hk zk|iHvYsh3#C54|!ZIr?<_$&NF0)MsWw3?s{lE6JxYSCFWK^Y`@pVk^n-pc`TDN|0~pHV{@1bHti zUqqP)3Mivg-Am=DEM@Wq8jCU@?pKqOYO=T<B{rX|1uuy&MpiGUdemOKK>CAnrxw zizxF`1(Z>$?WJ;5mNNMQjYS!d_N%GslBB($43e}@YmFuC<$$=9DJSjEs-X;mv=@~x zqD)5tWt1v=sT`H1Ouj&4Q3ibaYI3l$ys-b*RP>XLl>dV{P(cWgejQp8_FoL10^zUT zFGbgKe%^(Bw2D!}KB*{@u#fXW6!yab5gNmAz!Jj#WyHoHCpT$fFUJ~c3~&cObN>*l zF$^Wbku3XYG-031qB<%qmzrFlEUt4Z4Sribalcx0I!#apMc7LV!V&hv0dXl)PS~GQ zLz#&Sd%5yOl(7|1ChwzFP^N0U6QaDltB^p(t>b={cu2B%9IoK z7t~N@;=*38d=X`~6;LMcqg7C*YG>?+c4}9Y0bzeNIY?Pv*gq>L?4vZ{!&34EXu@W@ zJEn#s)_c69JK?Xh9=%-QUg;ranw^7m0d0us_XI{^>j z7X;Qij_vt6TvNEUc4hUm&(E(f&^PD}_VRsS?~%F7{&t_t-I#+b4EwHb*z?+8+ZO*1 DrUjX) diff --git a/a3fe/data/example_restraint_stage/input/run_somd.sh b/a3fe/data/example_restraint_stage/input/run_somd.sh deleted file mode 100644 index a226587..0000000 --- a/a3fe/data/example_restraint_stage/input/run_somd.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --gres=gpu:1 - -module load cuda -echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES" - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.000/LamWindow.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.000/LamWindow.pkl index 839c1917e97a8348b90c4f64ebd8a9bd65673dfd..35196d07af37f33d51124ea33b44f934796a2516 100644 GIT binary patch literal 7566 zcmd6s%WoS+9LMu;5+|vf5Zb0d3*peHLD;+TqpAu`DNz)Gn@S-PJyoOG-SN(l-Pz4P zoCbu%Lr94<2&4=LIPoWN;lLen=5Oc~A&y-6?T+m{93)$+ytXV^^YHwB^PAs%zN48h zazA{1b0qzIE^mu*2fK1pl}AQI-oPP277L^ZH0rrTYcTHM1Jl95t`>TYXdeeevq+OT z8m=@*(I-LZaqJXbW>Vrf*huR&3rAQZ&#>z|1O+6F0?c@X!U)?0d5)!dapcF52KEgL zBfX^Sx)d{rai~=uJn6{;)Q4d$9bJl9q^v7D2R+$&p)+mGUWx_B!xphnBk)}0GjrD= z@=(m9Fg8%gTolBdLxkm1SgXYi9&YT#%qc-_30h+ZN6h08ww;s0v0V95!qU>wlVzQR zKOpYO`Y0U}Sxh&vudhm)%hdX0rq=UEbo!|j1J_!hRk>lCONj96TUlD~S3!)f1XfGx)k>a&8`GC%~Uiw(|-cCEWvqD@#p%Vvg zYYgyb2KfOwDPBXki5YBTa3>iNec~C2S+f4RD5Q45AC4U6%B|n0#Z=;8ii_=@Hc>yD zRnkS6^i&c98v>QuvKhCfn6^puNYx%oadx8L$d6=fh;eXR(pSXzhw$5({N;9x+LIa) zQ>N#-m|If(Q!JVk=CTCX^1UF^;t+P;82}oDo74pqf*Tt5IKme8Bi1CE%Nl6)u8zvO z?uVM;#oW@`)Vm0En%WVAw3V6+J=ZFQbP0G1kyEMA3dYvtvX}%uM{x*TI+I(3$1YS( zLojz#hhteEOF}K?)EEs0`I3l-6rT++ejrJ%Rm4Gn4~n)Q7n7yWr_f9iq4OM11?siP&c0oj|6mZ$` z9?v5Hk{KbCh@hDEaS$=3k~tTSAX4NKXJHx2)qA=QU#PKRt4c8e8FX(Iez|8s8OS`x zBOLCA=^`YRN!_G6IlrFOSXYWqufnnGT74psGkTrgphc>+R;mmwl`Mp(JV4a8(&TTq&1^A6MO>>kC&Ez*V^? zT;;OFRW(ywf%Ob=1=f4O)p$0zstyoW)r)ZTat64n4j-e4d%#sL8(h@}h^yK~xVoMJu4==FE9KJgDR6*+%N zB4!N7Gk04rBBNp!9v7iVlIJfeZgy^`)pZytStKHG>DOw1^;B=92C@TeF#?y9@M5sg zE})3Q%^!v5NVt?MsDCp9E*ps@59!(=JQSuQqV&qJJ|Zr|{UvI`6U;tgHcf6ie^Ix! a=OeKA2)j=hx4iw%ou{s^pu1=1UHT94zVi|Q delta 730 zcmeCP{$tA8z%uot)I?Sl#?;A;OsbRXSac>QGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$P>>Rg-On^pUIwiL4S70y;rg z-B>f;*b=WZSWuj?Q5e~`8--D02FTxhN(9CC8-=AOzZKI%vK}N7B_;^A-b6Fr!~n1L ztSHtuN=vh%1_DF`IShazo699vBZonwv?r1S8l@E`^GWl79KdA?bbuiwny1KIR*>*X d%ni@XOUW-+(8x*5wKdQ)FfafHkr~8|dH{^w-RR zj-~hwl8^9LY;CQaO`2F37`U8s&%JZz%un`n-oCS5_fi9U6Z8ikrF4a2#seRDmFUgh zuwdZ1Q3zIYX-Ir31#}71YML@Cg51BWh9O|U>gMW&=sU5N&72b^B=SxrmUwtEvzh=8 z|C?Bj-jjCpWuJhj>7r&>)sOm2s|@!f>%msww@F8u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo2LL?8H=_Um diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.000/run_02/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.000/run_02/Simulation.pkl index 48277d70385d4376c9703dfcfefc73f1fe5784a4..2d8df9617a01a95512481ae5008dca2004a66afe 100644 GIT binary patch delta 546 zcmaJ;yGjE=6lLOWh%pb5h=phh2}C4oqE^91v`_;94T#+^W+%zuzL&TsU#DlBu1&dbO%gsHrZ+Oi8mFh@>D%PE3>5MRi&0U?(l4Ei?mIBCOi z7pkUQnP5*k1Uoi^49BKlRJnKjDhm^WfRY=;v2HfSm0U*pzx#~nfyumjN5c98@7T;9 delta 163 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo2LL?GH>3an diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.000/run_03/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.000/run_03/Simulation.pkl index 23a82f8b610e391cfe7e67fe4a39e99d74c44998..93f203d6ca4f1629fc9dcbcf101fb8630564d80b 100644 GIT binary patch delta 546 zcmaJ;yGjE=6lLOWh%pb5h=phh2}C4oj8?%$v`_;94T#+^W+%zuzL&TsU#DlBwEWy;{{L)Kr&Zrli>oM14nB&$l&h z0GanVV%H4noMBAHT+$a@hpS|MWT#R(uu90%q>@>D%PE3>5MRi&0U?(l4Ei?mIBCOi z7pkUQnP5*k1Uoi^49BKlRJnKjDhm^WfRY=;v2HfSm0U*pzx#~nfyumjN5c98@gd9~ delta 163 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo2LL?OH>Cgo diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.000/run_04/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.000/run_04/Simulation.pkl index 379d10ca2e5969c01e9992e0786cb27a44240f3c..e0e45bf14bf017fa3ff4c38d662ef0d4450b4dfd 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9ilvhV1(P2ouo_DAryoRqT7$j9d&5kUFJ{ZA*`T7Fi^77 zG5QSQhv=(x?b@kXJy?f4{dn*9-prdf-lR4VF0HI+;=SI{1`e6LM9N)}M1jjah16mjBv)?dZKX=FH@ z=tH%6r*2e9CPBZu#R0}>K0uU{$gE_%he$Ly>0u?4yL(mJuG#}zQyq$#l4d6m)g3)O z-_f{k$ehO!yJVn?hKP)~gfF;mSIOKsPPuqs6_KS$B{TS%Qv`kxUC49*A(sGxzJokY zS}@syYRHu-TZ1;iuET)gDD;ymb&sEAeky=~k}JfqUN*#qTt@oC`;2JA@4mW6!ukPy CGR#u| delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHogO$?^AP6?V)ss{jal{e4; diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.000/run_05/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.000/run_05/Simulation.pkl index 568866775053f4adc191a9d885f478f9e4ebc357..1301fa9925110afdd429666c933fe93828cf0adb 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9ilvhV1%2cC+QM(2n8X7==NiBM;%&sm-!QU2rK9i43zA2 zj6Os7A^Iv^yLM_;57t3XKi>PjH}mGrPwI2oyoQ)tG9Q3Ykpi zXKP$HWX9!)T`|x_Lr8{P%oALu@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHogO$?{BP6?V)ss{jaoj1_{ diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.125/LamWindow.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.125/LamWindow.pkl index b77ea595fbcf9f375f6fdb724a15d2efc71b9cfa..36de2609627eabb3c0d01899d43bfd954b42d1fb 100644 GIT binary patch literal 7586 zcmd6s%WoS+9LJltoy2K~+J;A4f}o{A*z5QaN}(wwiXw1RDMX^DYBak$_6*sb-R#3@ zKuCault_a>${++M{s|7;dO)1{8@M74oVfDa9Xn4W*;3`PWyzX{=l7f6{O0o=&3rNX z{SVhJq@T~_EivL?SFYcCs%k{W#34a83#14P>bbz^DeKD4URQRW=}cR*mtxNGuuW`K4?Gw7%-VK{ z+!wPbj7=0W7X>lr5MlWk)@pu@hif}Aa|%#ffY#W-5%V~NZR@yjC>Ot!u(WjOcv;8c z4~ToRHbjSoj_D@$i%XJ@YPCMD)q3WDW*{B9Z zW8yj3Cjr4Oa=Zp|lFcS-mqf0~f+)rg+KEX_qK&`hpnw5Ppv)Khus;ds1U! z!tz`fb6bjk@_CEGTowRZz86GB9Ky~!1wfN*=3o}ezwLA{#!z1wYjpaZ8y1JUDH|e5y^;n)3 zZh_$6O|$RKg(NWCySucA%2k=>QY#-}oH~O*y__5|3aS(bsn``%wzYdqZ6!2YRsE0l zc?JQLtO%h*2u0S%LBy0&j=FFRkzzD)7Z##axl=5{7it=?U8NX<9J;dvzudE-40OK8 zBOGpr=`tjhN!_?QKD2W`f8&1P1};FQ1eia8qYm-_3lI#jAB#DJ{5>1O!Yrg(k$foT zPt?{KaqJLFEb_ zgW~^3)`(7Im9-)ZtZPITSnmQ^6MB$U?jy3wosspL24s~74_V5k!AI8l(DjI{G9c@% zu8=jV6Im6l$O7vckp*#l)ru^zt`S*ay$fVz^&qR-M`TqyBWqCuvZ{lJEalSRBkO$VdPG(gkoEQ%WRbI% zCSuZbJZro4N-`v-;K31!BzY2(;@Z)DwYnZ71)D?!E&*HZFP`X))If~@+l;_QGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$*(HN& z1e-C2Js=^}K#|(4Ab?@fdm*;TzCxO4mc17OT4oBfOoEjK!(%3x76OIPExas(Vc{<^ zbf2Y*2~GCn)8{hLj5jeu*vX1vrzxhLKp}KH+axjUTq})kr<63rPE(+r<`6qq$Xr&C f@JY-K&&*57FIUjWNzAo1&@(gwDKP>oDb)i2zFpTK diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.125/run_01/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.125/run_01/Simulation.pkl index b76da13e93ff166ca2ddb41bc8230adc1890a18e..8155238a20d064f3dd272d1b01415a09ba1ecc30 100644 GIT binary patch delta 547 zcmaJ;y-EW?802Cu#F!tIh=oW52`G~DG}@$6Vxa~U6~yji&25s!%iXa*VhV{07Q%vt zTWg;|^B6vd58w-kd!~pMvHF<#W_D+1zcTNW=1u&0E7>zwjZW{im?{OBGT%dPDSRnV`JXZ@7}=3W^}7Z&;;n2gAAZIbGwD-8xj^obzykNr#uj46 z-RKZ=;fHx>Jp3ovGpEA0M73MqRQKvw$ux5XZA0Dn8lRZN^j zhU!2cs^wdCt(IgG^tYzCsT zrl;pS8rKY&^EhG`40O>Dkr9{h1=sB=nfr-TDsEdvWNA{#48GzNfgeN{G95t3X@H>P zAdize47Q*Sl;{H%qRc= delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WROx(mEw*N~sbQ{Ag$CDY6mv<-FNYmlar1ypWeYk&krocNygS21xC z8L9()sFrWlwOW!%(C@BufFCp-Aj(N(Rx;j3BpRHwv69L4jf!no?5?e;CdEuivl)oW znx3BTXk0U7&f|z(FwjLqL`Gb~7hJciWbP+Uskm(wk)=r`Gx&;A1bz@*$aDZ9rvZYF zgFH^^FxY}Rkh4Q}9~uO^4g-dx(2r`VwfiLVLjeSoTq2J3@<5!+8KghF!-zKg?yI#U FtZ!MR%qai> delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WROs(mEw*N~s1FiU*MjQc$GpY6YPur5@CRqJnt)h~2aeZg-dbh&@PE@E`=V zY&`o6+Q;xYd;niS%-TcsP){E--%K)@d}ZDz&71i1RURxl#9P@~KKzU=X40pGa)I06 z4Ap@?RLi&OS}n;W=y%sSzz-S^5alE?D;aMi5)Dq;Sjpu2M#Z)(cGuQalVYZ%*$hNw zO;68vG_Dyk=W)a?80exQA|o#03$EK$GWQdwRNS_T$kL>e8GOYl0zZf@WIBM5(*Qxo zK^`Y{7;Hfu$k`#g4-JA{hXKP;=ts5G+I^Dwp#TC(E)mCic_7Z^4ALLoVMH5#_tn}F F);C)2%qjo? delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WROw(mEw*N~sbQ{Ag$CDY6mv<-FNYmlar1ypWeYk&krocNygS21xC z8L9()sFrWlwOW!%(C@BufFCp-Aj(N(Rx;j3BpRHwv69L4jf!no?5?e;CdEuivl)oW znx3BTXk0U7&f|z(FwjLqL`Gb~7hJciWbP+Uskm(wk)=r`Gx&;A1bz@*$aDZ9rvZYF zgFH^^FxY}Rkh4Q}9~uO^4g-dx(2r`VwfiLVLjeSoTq2J3@<5!+8KghF!-zKg?yI#U FtZ!U5%qsu@ delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WROu(mEw*N~szwjZW{im?{OBGT%dPDSRnV`JXZ@7}=3W^}7Z&;;n2gAAZIbGwD-8xj^obzykNr#uj46 z-RKZ=;fHx>Jp3ovGpEA0M73MqRQKvw$ux5XZA0Dn8lRZN^j zhU!2cs^wdCt(IgG^tYzCsT zrl;pS8rKY&^EhG`40O>Dkr9{h1=sB=nfr-TDsEdvWNA{#48GzNfgeN{G95t3X@H>P zAdize47Q*Slt@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WROy(mEw*N~srSPl+$jnJz{`#2zmO`60p zaJf!$J_$mPV<+b_ixS7dX4-GqIKl>bhF#wwC?H`JV8$a9Mz}$c=h%i9M}8a`VBfSc zD&$Mmf)q1|ap+YZJn6{;)Q4dson4Aqq^v7D2R+$&p(|~zUW!G>!#1%|J@8!QGi%o& z@=z?GFg8)hTolBdLxkm1*sG-t9&YT#%*jJ<9-hVyj+nfRxlN>f#yCSkp7DO?2&|XYpBE_p`@&TQDI`^>}y`2tjXN8zUp%Vvg zYYy;d2KfOwX-cLyFG^7(mb@*UsS}zz4a8ALo+2&!p5$GUW(X$lTO5 zA4gP*uX@VT7mIqe)2X9*s}AX#iI@w5NPM}u_WX~3fBxm~Z$yR%4G;mcCpX_?Eis-? z#vu?`WPtz^km+B4Og=x+d*Vp%LQY3qEWip=S1pf2`tS%mee=$rf8AKm(G|KX-Z)XG z<=de5_mkv%YdMJv_wE;0QKcZ$RBELoOjBnNr`MAgjJ#^aK`M25m2B-1vpWgP*46mV zDbFB4k`*D8$e@_^aS$=3ljAPDgh(--cnkYbs@yFU;17Bla9E|7fE2o0gm3QI&;~YN z<`E8e!*myt&ZKWry*#v2KX>b4{ua(dC%~ONgBKm-0Tdt>U_Ta%2>Ay#M1@&MJw@`d zSUS~PXT-5X6q3Z{??Ab?zZX|dJ@*6F#1Vmqk0HCSVtCs+2pRk!1$iqLbSpM#woCfy zLTyy1=9jc;K3LbN`CwgXKD`PrUe{_9iJ;Nz^ajmQqqS3|+AJ;Wke<>2rKi*_J+!)2 zSfO|5yTGym>P6`Sy`XDH^npHQP%fp)Kp%Dlfxh3-0lGdE;O`C{-ROt&CE$E9 zZc+UIz#7vDtg=>Mfpv|*0_!~hYfcZa$^!&e`9fe-H2|wTe85sJ4L`8DL)Ra$$^fiV zPrw@239O1%V1adwzyj+%04u8pSd{?+t8yW*-q8T8%J2b8xitL1>JD9hz^VYS$~^&V zLMO1QT7d=DH3AE)_W-PUJ;16C5LndWzi|FP28sRy delta 659 zcmbPf-Dbwxz%uo>)I?Sl#?;A;OsbRXSac>QGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$02+zHrYc6*;hX6%3pA%VwY-^*q!sMS~$Tl{L$FiFm!K{%%(#|M_ uZUsaH*<(PF&GnKfRse-2FO}9q3QLfPuZ$DBsWHTwc`~m!O)S9dQau2q@6Bug diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.250/run_01/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.250/run_01/Simulation.pkl index 774e346cc3aa9a47957ccc6e3412bf975db009e8..19551400d87cb7a8e89efc9414cfae118af9db77 100644 GIT binary patch delta 546 zcmaJ;yGjE=6lLOWh%pb5h=oWB2}C4od{ij}(LxObd?0qin4Khpo1JAIVhULmEQA3K zJGSC4NWQ{Pv9z~vHfds!z`*64d+wbxXMVF^^Y*>bi zx&^7{Mj=?qr6KVHDWFT3R@0PG5#%PW8iarWtCOo2qMyWSHgiFkkjOicSmMFuOfdl- zC!1J~K9Y9yZ6AZ@>7w(ns-N_!RvGR|)`d;#w@6#7BHC_YXM`j}f>7W2ub4ZF2lhw$ zNUuHUJ6%>OXrA2^5Dw97fS4fhuvS(Vk+=xb#agAdc52nCIiaE240EmQb|7n;rux)1 zxDHg_7l>bTXmW-z8FNW0g$Y-y{LoINwC9wNV@R#C_*O6kX%Jt?jRC0^APjmg@&#$a zQ5WilS{h@IS_FG8haAVIUv#;1_^JwHf`E}5B(P~Vp@Q0VRfo1APwu!9zj5!ncsZM^)q%&EOReIt&eiZ&>b4CFafz1aQ!x<;bFe@`T z+f24(l2+FX%PcA>P0R@_O)X7T$WO{jO)gPLEKxA1Fi$fuwy-oXG%+zVu-ojzEYHMP fim*yy@+(#^#u|ix&gA`U&K#CgTBig}Db)i2FDEs6 diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.250/run_02/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.250/run_02/Simulation.pkl index f96d932696820d955ccc1486f3da2c784b2f0f22..674de800a1ad0cf6bc25e14a3c94afcf6ef4f5b7 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9U?r0V1%2NCl5i?AryoXqT7$j9d&5kUFJ{ZA+~}J!9dAQ z*XS#RpQ4Y_v3rMR^c;jRS)k@qV_M55HoYne-W{x50=wW@khr%I-oBj^A+p4%loB@1Y;i>)aV6mjCY)?dX^J2D(j z^`Y9jQ#Yz4lc3+-;Q$k~=p)KWWL7dhKqMNR46u^P-CDg;saJxErg{`JCC#2M>Qy~m z&(^qU$eha&yJVn?hKP)~geSOeSIOKYPPuqs6_KS$B{TS%Qv{wLUC49*Ay)wWp^aQl zIxyXWYRR=3+kh^?j?IAKDD;ym^^c!rekK5)k}JfqUbe)ATt)iBhm2^$@4os+!ukQ2 CEX-m6 delta 164 zcmX>p@Q0VRfo1APwu!9zj5!ncsZM^)q%&EOReIt&eiZ&>b4CFafz1aQ!x<;bFe@`T z+f24(l2+FX%PcA>P0R@_O)X7T$WO{jO)gPLEKxA1Fi$fuwy-oXG%+zVu-ojzEYHMP gim*yy@+(#^#u|ix&gA`UPMoF&Q(C74O)1p_0Aj{9rT_o{ diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.250/run_03/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.250/run_03/Simulation.pkl index ef386509550f30a22806d6d3611af9ea07aeb2ff..3210ea6d323141b8713c500cf22a5043b6212e82 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9U?r0V1%2QCl5i?AryoXqT7$j9d&5kUFJ{ZA+~}J!9dAQ z*XS#RpQ4Y_v3rMR^c;jRS)k@qV_M55HoYne-W{x50=wW@khr%I-oBj^A+p4%loB@1Y;i>)aV6mjCY)?dX^J2D(j z^`Y9jQ#Yz4lc3+-;Q$k~=p)KWWL7dhKqMNR46u^PYOP+W)GI+nQ$32Al4j2r^<6z( z&(^qU$eha&yJVn?hKP)~geSOeSIOKYPPuqs6_KS$B{TS%Qv{wLUC49*Ay)wWp^aQl zIxyXWYRR=3+kh^?j?IAKDD;ym^^c!rekK5)k}JfqUbe)ATt)iBhm2^$@4os+!ukQ3 Cbp@Q0VRfo1APwu!9zj5!ncsZM^)q%&EOReIt&eiZ&>b4CFafz1aQ!x<;bFe@`T z+f24(l2+FX%PcA>P0R@_O)X7T$WO{jO)gPLEKxA1Fi$fuwy-oXG%+zVu-ojzEYHMP gim*yy@+(#^#u|ix&gA`UPMoHOQ(C74O)1p_0AkKHrvLx| diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.250/run_04/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.250/run_04/Simulation.pkl index 2e04c90d3207279de472134e4eedfd68ff3592eb..2d90f5c00aa02e6f167baa39f77ad92d3800fab0 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9U?r0V1%2cCl5i?AryoXqT7$j9d&5kUFJ{ZA+~}J!9dAQ z*XS#RpQ4Y_v3rMR^c;jRS)k@qV_M55HoYne-W{x50=wW@khr%I-oBj^A+p4%loB@3w9#nu!Fia7CH>#t&|9T^U% z`cQ4%sT)<2Nzm`^aDWL~^bzGGGAkJ$AQBBu23X1DUaelK)GI+nQ$32Al4j2r^<6z( z&(^qU$eha&yJVn?hKP)~geSOeSIOKYPPuqs6_KS$B{TS%Qv{wLUC49*Ay)wWp^aQl zIxyXWYRR=3+kh^?j?IAKDD;ym^^c!rekK5)k}JfqUbe)ATt)iBhm2^$@4os+!ukQ4 CzRY9* delta 164 zcmX>p@Q0VRfo1APwu!9zj5!ncsZM^)q%&EOReIt&eiZ&>b4CFafz1aQ!x<;bFe@`T z+f24(l2+FX%PcA>P0R@_O)X7T$WO{jO)gPLEKxA1Fi$fuwy-oXG%+zVu-ojzEYHMP gim*yy@+(#^#u|ix&gA`UPMoGjQ(C74O)1p_0AkiPr~m)} diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.250/run_05/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.250/run_05/Simulation.pkl index d2f10701547ce4f4d43bf9d8e686bd4500614d88..07676baccb05a3be9ee4ec906d11a35b93688b2f 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A#}+%={B!bcpZ}f)Q?3o;(Cmhfokoh;Bb7chsSEcbPwthp>VU!9dAQ z*XS#RpQ4Y_v3rMR^mZtvmDeAThLdjQ;SWkSqn5GT%dPDSWfG zP4HbO92gs!BoHqU92`QGoTm))MrP(wqk%yUvzw{s!tdB-I(1Gc7sx#oSm4pcLOy0Z z%nq?0zQ?Wb%c>bq^F_@;rJ^3ynUX2y3fhB~@3l!s$voO`V|#)GMV$Da{a>-vj0{H; zeWv9#%53SE-iE)$*XMsSd?VNvjix>aL!i z?`T{%WY*(|T`|x_LqtYg+!tK8t7LW@r&Kt!3&_@_l4*RyDFQ!;E@V1@kShQ|-$5QH zEtqUUHRRfqtwEb$*I~eL6#7{eyC*L)Hx)oY$u;6wFB{@gt|I;6eMYq5Z(rSGVgCZ0 C2h3#v delta 164 zcmX>p@Q0VRfo1APwu!9zj5!ncsZM^)q%&EOReIt&eiZ&>b4CFafz1aQ!x<;bFe@`T z+f24(l2+FX%PcA>P0R@_O)X7T$WO{jO)gPLEKxA1Fi$fuwy-oXG%+zVu-ojzEYHMP gim*yy@+(#^#u|ix&gA`UPMoI3Q(C74O)1p_0Ak)XsQ>@~ diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.375/LamWindow.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.375/LamWindow.pkl index 052082e47ab0da4e8a8c6f9c23cc4634a7b53175..efeb129eb22891da2c86dbbcada64a88decf567b 100644 GIT binary patch literal 7587 zcmd6s&u<$=6vvz2&JQp;-BEajRWG$kuz7sffHBW?%4ThBwMPywk%mQJD&IE&7046_2#qD zZ@;^7A^ChNZ;25bJ96XxAF4-WbQ}<5GG7W`qpm}=2IDr~Gi>Z{Yk}Jccd<`2lQfB~ z;c|oIJmLo~$9B$P1|_zQ^`u`jafmhY3_G4pkWYfp$Bc(42(d+wYnz%Ig~&@5xvsRedMV~@7n{UH4c~Q;$Bb>8 z$bB(~f=EXJbC4f#4iT15VXqd}d9c0{F*^^vd3YMxIAkt|ux%YT4(0Oa61J8O9dGM6 z`~h)S)`sY?NMpIN{X$XF(NwLEr)oWOKqsF{ku@y@I~Ov~X2gdr5m~|m;^=Tr0`@VH zwJ~uC&WTU3gKXDAc6``m?Xt)=nIA^jMmrISh!iiM$_I4j>CA^}^ky=+ofTpR1$N{+ ztvSG-DdhR&xOo-fCT4Jq!JT+U^pUG0X3E+tBAeI+e>k$4BkR9Tiiz041Q(lK9imWif6^F=>(Tq3S)9;`Bnll#gYkixF^J(ig?Z2k?8e_>1irwHGxj zCJfhcFgK<6CzmrQtYs0f<+*;SMFE_=QvlQnH>d+B1UEG9a)eFng{(<5hc!^~P63q) z1uxKaH{zz&rd}u1Y3fAu(^g_Ka2+!r(8U&SXH+t@!ckva65~MVFbaT7r?QLi$brsD z2a42iTaj?a#nxnxWV`BM`;*&l`5Jbr_bJ+LsUe5BOT)g?21eLbfc(vb%mGCtp4?dd{kMOA{ORwnM27nor~uiK8}G1|8efdZ zAy8OkfC3ZH>7T!kKR?j7#X-6YIT>*=2P;fmHCztq!$a`&^_4&Wy1tg9OLSShb}Ube zw?OdkCE54JVjLLm-YYJnN>wJg)XGPgr@gksXee#n$kjymufBE@LzE^I`pa<@=`FZ5V&T%{O;9J*VCU+$XF20G93 z5C_{qvJG)(+&8XXAKJN}yZIo06X&5*0?ePms}6Dj3lI#jABlN{ygd`b!VILIBKb%x zoak*ZVw(X9NbK_0pxv9_h|4FQdp>L8kif%7klt4?yl?FV4E~UyycG*tk93+nC;oJ< zHk_vFmr_-Iu%4pogLS3)^a{LsU9FA9l18u5>oiBT)=rgbbF`d>_>}r6KBW%gL#y@m zCAvc20-E(vF-jd2gRUOX`{`+eaw*XU`rt?s=(|TsK-UHW{pUkR*Lxy;2}r+^kelFV#vPRNGRykE+2?-PdThCuQF&e3fEFYVUK)Dib z5$4+s6jG=JQn;doB3)Mfo9R$|B&OV_tNUdLHxvSQ delta 674 zcmZ2%J;98%fn_SI^h8z_#?;A;OsbRXSac>QGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$zwjZW{im?{OBGT%dPDSRnV`JXZ@7}=3W^}7Z&;;n2gAAZIbGwD-8xj^obzykNr#uj46 z-RKZ=;fHx>Jp3ovGpEA0M73MqRQKvw$ux5XZA0Dn8l6 z4Ap@?RLi&OS}n;W=y%sSzz-S^5alE?D;aMi5)Dq;SjpsixnkQDyK8HzNikE>YzCsT zrl;pS8rKY&^EhG`40O>Dkr9{h1=sB=nfr-TDsEdvWNA{#48GzNfgeN{G95t3X@H>P zAdize47Q*Sl<07%qai> delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WRa!(mEw*N~sbQ{Ag$CDY6mv<-FNYmlar1+>w?)&L2LIPpE}uVUgP zGE@ipP%Yo8Yqcbkpx<5R06%CvK$MfntYo~6NHjQUVt@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WRay(mEw*N~s diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.375/run_03/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.375/run_03/Simulation.pkl index 115c239a20203c3c30085abaed086eea4d83ca15..205d29b5c7ed086bece1fc601226f304a639eed6 100644 GIT binary patch delta 547 zcmaJ;%}N6?7-Va=)Y>1FiU*MjQc$Gpss*7Zr5@CRqJnt)h~2aeZg-dbh&@PE@E`=V zY&`o6+Q;xYd;niS%-TcsP){E--%K)@d}ZDz&71i1RURxl#9P@~KKzU=X40pGa)I0ceQcGuQalVYZ%*$hNw zO;68vG_Dyk=W)a?80exQA|o#03$EK$GWQdwRNS_T$kL>e8GOYl0zZf@WIBM5(*Qxo zK^`Y{7;Hfu$k`#g4-JA{hXKP;=ts5G+I^Dwp#TC(E)mCic_7Z^4ALLoVMH5#_tn}F F);C-@%qsu@ delta 168 zcmX>t@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WRa$(mEw*N~sbQ{Ag$CDY6mv<-FNYmlar1+>w?)&L2LIPpE}uVUgP zGE@ipP%Yo8Yqcbkpx<5R06%CvK$MfntYo~6NHjQUVt@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WV|F(mEw*N~szwjZW{im?{OBGT%dPDSRnV`JXZ@7}=3W^}7Z&;;n2gAAZIbGwD-8xj^obzykNr#uj46 z-RKZ=;fHx>Jp3ovGpEA0M73MqRQKvw$ux5XZA0Dn8l6 z4Ap@?RLi&OS}n;W=y%sSzz-S^5alE?D;aMi5)Dq;SjpsixnkQDyK8HzNikE>YzCsT zrl;pS8rKY&^EhG`40O>Dkr9{h1=sB=nfr-TDsEdvWNA{#48GzNfgeN{G95t3X@H>P zAdize47Q*Slt@Q;_Zfo1Avwu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHo)BW*zh?DftU(nF;WV|J(mEw*N~s&w6f$1um0!XO@5Sq0_yNRQ5ih;E*QJfD-EwG5E%tFfGwen#an-PC?*Uh~0RtqN)I_kWr7gev7#2X4CbHYJ5Y4aY9}4C}9cH>cs>3Kn}e<|Gw$Hnsx4Eg*s0n zHwnG=81UyD2|~8_c!|&rDzJ^=PC6p_*l!Tw==w`)JhKabByokOSAHE;XHy3=T&#Ar ziB7UvHJ`zx&!#bGAyApEmXIy2Mq4btXIgi(Iylj<^?N#Lr~$aG`SWVvUHtA&exehj z&ZIED?Ry@Tj#mE^3O2`FW`V814`VBdu=5T8u)(CwJ)jV7Skjk-Iy8vI2D3cTB=fJA zNV!xBBCFvi(y=C%s6&`c9$8#5GM z=2}2wuGN=aCF!#zy;BEuFmfIZU7Z;7@R zPo(__^p)7qUj~)_<%jh1BY#tE=R1-85m%F#VdkpsOQesC;pwY4|NQI9Vu4@hbLy2n zahkmWxxbCvdu=uii}Y{L&yiY5XPMN_MvT%F2-C~y@uFy+k}wmxqRF*RkFf_S$rerj z-90`+033Ce@C-6v zkTH$cqihk<#}zcb<~k9HSnBe((CyXl)Wv=8gHUYHnBnDpB=RnP(47cZHQ=gx2v_WI zkwl$qxW2vKz7aXC#&EfaN0wfHX?1nCI&I2ftmv?qq3G9s|H8iB#0=C5sUsMQlejUM z>O7E`qw>db9f_jcxcRqepxDS9y~P){a8a0zNV1Y){gj$O{gQ0p3g$5rEuL07e>c_I b!x6ZAk9rSQGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$+4%m{2jX;KESX5*CF zDH<7!?)DEDz#v1wn>m9C$(}?eDK_IN8OT;cg-`=WYO{pE8f5!{swUeC=_A<>5?LiE z1ayP0y0K=wnK52xu%I|&qcE~}HwvT14UoV2ln9FVHwsHnek-PjWIaeEN=y)Jy$R5I z6TH^5qFCQ3EzOD=2oMqEFaU~dE|*-590rZjo=6U8lvbF`C(Q$L0GBDy0j7|6o+9&# K)64+k7(D=hdE9;g diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.500/run_01/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.500/run_01/Simulation.pkl index 4c21b0fb1b7d3827ba08c7169317534015ff0ff8..af1c89b53228fbd23e01b9290c32282f558bb09e 100644 GIT binary patch delta 547 zcmaJ;yGjE=6lG&J#F&Rj#6mQM1R|1keKo;Gw2%Y>Mi9Hpn4Khpo84s|VhV{07Q%pr z9ZT^WBp>0g*xFh-n-tN)RF`w^IWuR@d}lu9&D;3PesW-L8oj}LF;xyQWxj{pa`tqKKzQUWzuJaa)I0vfdw9(&#cCb z`~O2Mhi?fp{4}e^<8)D@zh|ol)lf3cTtU0g^t~2oD_KB0Eo_aEpokOSv;HdPP9wwN zSRbnOJ9VQ?C49kkyGrIpamvL5tB5R3Dw)C8oFedp=t8Cg2)O_d^c>`I z(uDCAR9!Aj*ebLLb{z%`N1>losdM}+^AiCClw2W>^|CH5&#LB delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%?zisP6?V)ss{jauQ$^G diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.500/run_02/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.500/run_02/Simulation.pkl index 9b1ba57d350cc871003e92092aa96b4842bed0e2..a5a94637b2c4b2e7953673fb666398d4f21d90ac 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv3myxJZ|%LnsItM7Nj89d&5kUFIY55LVD37%184 z82yIuNAy>^cJ0)x9;}0&UY_TDo|$K!`AK~)ns?FHgZRMQHhP1Pe4^-M$~+f2#o*1{ zih}3ZLEl(QCxE!V;9wJ~7GtyI!8ukrpL_6tPHu#Qgq>|@^a)F#vfdw93%&kX^ zhv^|!gZG#je3@0_X||}*-!H32)lf3Y96`I#^xPI{E15&PEo_aEpokOCwf-v>&O*b{ zSRbg(dv&V{G7kFPO%5_-`T5_N|jQ-q^UN=Oi8oti%MBf z*RwUQ88YK?#I6|Vq9G(hF6IfY+f_0%ic`!VT6tt?Qpps);S_=AhZiy(K*%Kkzh@(t zlO~L}pz3mE!d9V0uwye|I1K%)3Z0V|nVks0r{o%Ote16hDVLG{@E#-D@VBqdv9Nvt DeKgEd delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog&5WkBP6?V)ss{jaw>Q)P diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.500/run_03/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.500/run_03/Simulation.pkl index 7f40d33efb4f6d9a09bba3b5029ccf5861a4aedf..9ce34b6364fa45593e14b1cbc57743be57e4ee01 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9ilvhV1%1lU8GCYAryoRqT7$j9d&5kUFJ{ZA*`T7Fi^77 zG5QSQhv=(x?b@kXJy-`l{dn*9-prdfKdH|}^Dg>&5FeP^MsM(uPZWJjndc&>7`&NV zQScl)=o@S41Q6F39Be|BoTUtMMtbT|!@fa{XeV9E2H%m5RPvlqE|7C7u)xEMx%G(g zFg?U-@E$XRFSBYq%@#HK`(^d08cHUaBWM?zp4%dAC39%Eg{?6X6mjCY)_=vqS!g&K z>jSlUuWnUA#zDWk$pJ=a-ba*^(5z&%i%2*)>0%}0<-JO&R4MgKnrc(blr-DEsO;$J zdbY+jLuOo#*cAg^G=yZx#XP}vyGmw8afy&gvl9XMlw2c@^|CH557S=C* Ceaut< delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog&5WnCP6?V)ss{jazc&5FeP^MsM(uPZWJjndc&>7`&NV zQScl)=o@S41Q6F39Be|BoTUtMMtbT|!@fa{XeV9E2H%m5RPvlqE|7C7u)xEMx%G(g zFg?U-@E$XRFSBYq%@#HK`(^d08cHUaBWM?zp4%dAC3C3U!qylGia7CH>%U^*EHoUA z^?};FSGTGly&gvl9XMlw2c@^|CH557S=C+ C#>`a! delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%}l1WP6?V)ss{ja$2Zmh diff --git a/a3fe/data/example_restraint_stage/output/lambda_0.500/run_05/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_0.500/run_05/Simulation.pkl index a566e996f27b46fa21bbf8f0b6254ece4fac1a50..fd56f90ca66a94574db2633c13d7c70fec15b13d 100644 GIT binary patch delta 547 zcmaJ;PfG$p9A(WFGyg;w9ilvhV1%2MU8GCYAryoRqT7$j9d&5kUFJ{ZA*`T7Fi^77 zG5QSQhv=(x?b@kXJy-`l{dn*9-prdfKdH|}^Dg>&5FeP^MsM(uPZWJjndc&>7`&NV zQScl)=o@S41Q6F39Be|BoTUtMMtbT|!@fa{XeV9E2H%m5RPvlqE|7C7u)xEMx%G(g zFg?U-@E$XRFSBYq%@#HK`(^d08cHUaBWM?zp4%dAC39%6g{?6X6mjCY)_=vqS!g&K z>jSlUuWnUA#zDWk$pJ=a-ba*^(5z&%i%2*)>0%}0yX8u$R4MgKnrc(blr-DEsO;$J zdbY+jLuOo#*cAg^G=yZx#XP}vyGmw8afy&gvl9XMlw2c@^|CH557S=C; C56o5o delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%}l4XP6?V)ss{ja&o|cq diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/LamWindow.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/LamWindow.pkl index 037cf2ab8162bac105840ca090807ea24b9d43ca..63eaf237fd9ba3b60614cee7179b5d7401851fc6 100644 GIT binary patch literal 7567 zcmd6s&u<$=6vvz2PEw~KYMcH@ARHPs2z&iAltNQV6h+{sQiw!P)o6Biyfb8XcC$a6 z8iWK0q(mA7QicPZ_$N4UN1XdNa774iTzR`=J3oh^^sr zo#Z^?2QJ5U&S3^6wvF|qUo&xtHS!!go=uQXg3!l|hbRcKMUZQonj3{)6l!2!H!&*a z3x$FdQ;2csRUSO;$^+DcVJ(?mifN>*D?81u?7Y;KwpK62ob6(hn5gc%4)U0>YZG}O zW>FC7C}0lqBhDeh@)_*a{00v;_9ABIp*IgtBO8az1#XAbG)GbysBg<$7G=Glz+uq7f(ct9K-&Pl*NC9*aq zUV(Gs6YL<{wU8YjHd(tWvJK{k5w_7@L?R-^?Nj-H&OE*Ru^PRd3~pzIxQqfj@}1Tk z;LjBDd~)2pj&K7rIL6>kJR|zV)e$pg?NyOY?1DcW+02n!zfFpX*uexB+g%-^UJk3I z^RVcNI0hC3DzRlTZb>m|k?^tVJ(A+|Lcft8$w(I?;I^bU#mI;7+gbcfJ4WqA-4qjs z>o}O3Qv99E85GvC1laOiKh&ZCPTna1>VzBA0ThB88h1IuCiX(sAezJKsCch{N`-MD){EVlr?YGat|;;4MT>r9vwhTf56*9QYhY0dVP5ZV?_i&^Zag z+))FLWNkPOwYZ|@s58iySUjZotdH>nNpj2__I=#USzeTjw?30VGftF4SRr!~*E}3j zDZc6|NnbAM)kY_d=8ZaJZzg08=ppgs=Gu$j|NZ%wzrGb2?pvS%WKV9s$68uE6OTin zugC!XC7{y3{uqCLqVI~sbQf|m;$jw7n7C@V9MXq};OQHyfBdqTC*B0mwjyvnuqi0Pe}Wb0~t=Zt3% z0LcguibYUNde{${Qpr&VUO}W7jh%&UC{^wk3h;#<3y!K3V~|1ji}1@`6WT!LD?G%( zZjfw3+!^2sdkH&(-59gABCrMPIzc_i!akv z`VNq+k7`l6KrQInA$^#hE-050U7(LTazNkjr~q9b2<)E^9o^`G@+F}BYC?JX0o|hb z|8X^vCa%h<;tH&%h%2z(1+H$VgR62MaaFzuS9>YosyukOQZ5ZXuFi+9CtQ^QS8sKN ztI;%ZRY?_BU_C`#f%PtMwU7?3Dt*LNz8P5hzZ=jlo>I zfkFzEKML28P?XE6e={A5jl`4(bnO5x3X>U8QZlSv5;IW0L=Cut*(c1Rai#Nxs@9&3 Zz>UY)dCIuy?ssaQg~AFdmQOD{{~!48{X75w delta 709 zcmeCT{$tA8z%uot)I?Sl#?;A;OsbRXSac>QGKox_Q_h%!Bp^Duol%CdbMg|#I23Vt z6rL+09kVhK!TfvnVq;+e|*gEUm5=mRVF%nwS$+4%mQpdX;KESX5*CF zDH<7!?)D!Tz#v1wn>m9C$(}?eDK_IN8OT;cg-`=WYO{pE8f5!{swUeC=_A<>5?LiE z1ayP0y0K=wnI&Flu%I|&qcE~}HwvT14UoV2ln9FVHwsHnek-PjWIaeEN=y)Jy@_VL zxdC45Sy8NSl$K^i4Fre?au@(bHkV7TMh=5UX-^~vG)gN>=9A_DIe^O)=m0}VJWr8% L#c5^+af}`S%QD=+ diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/run_01/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/run_01/Simulation.pkl index ea17269687662484e1654ede42e6533269407a45..58f3d460cd07acfbd66a3d81389a01ffd09b2682 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv86~yhxX*LnsItM7Nj89d&5kUFIY55LVD37%184 z82yIuNAy>^cJ0)x9;}0&UY_TDo|$K!`AK~)ns?FHgZRMQHhP1Pe4^-M$~+f2#o*1{ zih}3ZLEl(QCxE!V;9wJ~7GtyI!8ukrpL_6tPHu#Qgq>|@^a)F#vfdw93%&kX^ zhv^|!gZG#je3@0_X||}*FPGJ$YABgxj-Xv=dTxufmCT{N7PiJnP{fJnTK^RbXQAO} ztPj-Yy}DHe83+CDCI=Xyc^^?uLbH<5E+XOJq>Gh|@9tMhrAnz^(o~ybrli^SMP)}% z*RwUQ88YK?#I6|Vq9G(hF6IfY+f_0%ic`!VT6tt?Qpps);S_=AhZiy(K*%Kkzh@(t zlO~L}pz3mE!d9V0uwye|I1K%)3Z0V|nVks0r{o%Ote16hDVLG{@E#-D@VBqdv9Nvt Df>_K~ delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog&CI8?P6?V)ss{ja-#6I+ diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/run_02/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/run_02/Simulation.pkl index bf295df5e3228bcdec7f5fca7778bd889dc02f7a..2fb3f3b6278af0020e105733633f936912cc0092 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv86~57H&-5DG#D(d}h&M;%&sm-&c1gcWoM21<51 zM!zBa5&e~}T{|_a2kW4xm*;t(XXcq_eo~+F=3VslAl^4Ojc)%VpD6m6GS5X$F?cgK zqTo4p&@)!j2_UX7IM{?LIZYYljP%5#20eos(RR9;4Zb65spL7KTp;IEV1Wl0GpiBf zVRDG&;5}vrUuMO4nl7sM_V(4IswCbmXMP{fJnTK^SuXQAO} zqz}~ky}DHe83+CD1_v0TSszhOLbH<54kF>;q=S`=Z|{~%rE;lP(o~CLrli^OMR`k4 z*RwUQ8ZzT@#I6|Vq9G(hF6IfY+f_0%j8n`XT6tt?Qpps);S_=AhZiy(K*$9EziT6x zlLm~oplWhy%vPXDuwye|I1K%)3hk2@nH>wjr{o%Otd})$DHoCc@Gc|T@VBq_v9Nvt DgQ3h= delta 164 zcmX>u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%`B$0P6?V)ss{ja=Qr8_ diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/run_03/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/run_03/Simulation.pkl index 300ea39ea98ed7e4d777503728730ca734cc00d0..3f1d239f4060be425e8b077a2d2bb474708aee0b 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv88g2&7BYAryoRqT9>ljykmNF7pw22rK9i43zA2 zjDAD-Bl;^{yLM_;57t3XFVFKn&&)H={G>kT&AaI9LA-Bn8r}X!K2h{BWuA+iV(?~e zM8R|Hpl7V46F^*FaIgtga+)&88R>~f4SEJOqV04w8+=FBQps~dxj@dTzyc30W>zD{ z!{iXl!F$XMzRZg8G+k8h?d_{aRaY{}96>wK@Z2V8DVak%O>B*jpokOCwf-yS&O*b{ zNFS*6dv&V{G7kFP4Gu6wvp%Angk~k99Yn&xNe3$#-`*{kO65|oq^TCgOi8oli}IG9 zu4ijpHDt!+h+Q$zMMFr2T+9<(x2t4k7^j#&wDQQ(q>?Fo!zlvK4=-dofRGCSe%D4W zCk+^FLDl5an5{sQV8>>_a2Wbo71}2+GCLN4PsugnSTAehQZ6F>;ax_w;cs8u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%`B(1P6?V)ss{ja?>E~3 diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/run_04/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/run_04/Simulation.pkl index 18762324fed4c6e9ca2b6aeac975e58be8cce528..2b7dd44a3e0ea42b9650cebad518da388d258a9c 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv88gAf!vwAryoRqT9>ljykmNF7pw22rK9i43zA2 zjDAD-Bl;^{yLM_;57t3XFVFKn&&)H={G>kT&AaI9LA-Bn8r}X!K2h{BWuA+iV(?~e zM8R|Hpl7V46F^*FaIgtga+)&88R>~f4SEJOqV04w8+=FBQps~dxj@dTzyc30W>zD{ z!{iXl!F$XMzRZg8G+k8h?d_{aRaY{}96>wK@Z2V8DVak%O>B*jpokOCwf-yS&O*b{ zNFS*6dv&V{G7kFP4Gu6wvp%Angk~k99Yn&xNe3$#-`*{kO65|oq^TCgOi8oli}IG9 zu4ijpHDt!+h+Q$zMMFr2T+9<(x2t4k7^j#&wDQQ(q>?Fo!zlvK4=-dofRGCSe%D4W zCk+^FLDl5an5{sQV8>>_a2Wbo71}2+GCLN4PsugnSTAehQZ6F>;ax_w;cs8u@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%?+lsP6?V)ss{jaus72H diff --git a/a3fe/data/example_restraint_stage/output/lambda_1.000/run_05/Simulation.pkl b/a3fe/data/example_restraint_stage/output/lambda_1.000/run_05/Simulation.pkl index a4aeeb0881dc2a7e27fa9c0f516e05a491865dcf..19b62875589cf81e70621e3993ef00a60915a800 100644 GIT binary patch delta 547 zcmaJ;O-lkn7-r2CGe07X4pAOLFv88g4oR1&LnsItM7Nj89d&5kUFIY55LVD37%184 z82yIuNAy>^cJ0)x9;}0&UY_TDo|$K!`AL1wn|IOIgLvQEG`jtde4^-M$~+f2#o*1{ zh=S+XLC;u8CxE!V;9wJ~`If8be;kixHQZk2jn%Ej4K@lgOYyDTuorQ*@ zkv>rC_v%&^WE}Ln8ysMWW_?6C3C&7IJBWmXlMYrgzP(#6mCB`FNmDI~nUZG97v(KI zUC-9IYRHVs5xZibi-wR4xtJ%oZdb|7FitUlXyuWmNhMSGhEoKdA703G03jCu{H~2$ zP8u-Uf~v`-Fu@QatVfo1A@wu!9zj5!ncsZM^)q%-*ev-HGu{3!g%=8OU;0-FyqhBHog%?+otP6?V)ss{jaxHr@Q diff --git a/a3fe/data/example_run_dir/bound/discharge/input/run_somd.sh b/a3fe/data/example_run_dir/bound/discharge/input/run_somd.sh deleted file mode 100644 index c4a98cb..0000000 --- a/a3fe/data/example_run_dir/bound/discharge/input/run_somd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --time 24:00:00 -#SBATCH --gres=gpu:1 - -lam=$1 -echo "lambda is: " $lam - -srun /home/finlayclark/sire.app/bin/somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_run_dir/bound/discharge/output/lambda_0.000/run_01/run_somd.sh b/a3fe/data/example_run_dir/bound/discharge/output/lambda_0.000/run_01/run_somd.sh deleted file mode 100644 index c4a98cb..0000000 --- a/a3fe/data/example_run_dir/bound/discharge/output/lambda_0.000/run_01/run_somd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --time 24:00:00 -#SBATCH --gres=gpu:1 - -lam=$1 -echo "lambda is: " $lam - -srun /home/finlayclark/sire.app/bin/somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_run_dir/free/discharge/input/run_somd.sh b/a3fe/data/example_run_dir/free/discharge/input/run_somd.sh deleted file mode 100644 index c4a98cb..0000000 --- a/a3fe/data/example_run_dir/free/discharge/input/run_somd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --time 24:00:00 -#SBATCH --gres=gpu:1 - -lam=$1 -echo "lambda is: " $lam - -srun /home/finlayclark/sire.app/bin/somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_run_dir/free/discharge/output/lambda_0.000/run_01/run_somd.sh b/a3fe/data/example_run_dir/free/discharge/output/lambda_0.000/run_01/run_somd.sh deleted file mode 100644 index c4a98cb..0000000 --- a/a3fe/data/example_run_dir/free/discharge/output/lambda_0.000/run_01/run_somd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p main -#SBATCH -n 1 -#SBATCH --time 24:00:00 -#SBATCH --gres=gpu:1 - -lam=$1 -echo "lambda is: " $lam - -srun /home/finlayclark/sire.app/bin/somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/data/example_run_dir/input/run_somd.sh b/a3fe/data/example_run_dir/input/run_somd.sh deleted file mode 100644 index 4e26298..0000000 --- a/a3fe/data/example_run_dir/input/run_somd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -#SBATCH -o somd-array-gpu-%A.%a.out -#SBATCH -p RTX3080,GTX980 -#SBATCH -n 1 -#SBATCH --time 24:00:00 -#SBATCH --gres=gpu:1 - -lam=$1 -echo "lambda is: " $lam - -srun somd-freenrg -C somd.cfg -l $lam -p CUDA - diff --git a/a3fe/read/_process_slurm_files.py b/a3fe/read/_process_slurm_files.py deleted file mode 100644 index 2f065ef..0000000 --- a/a3fe/read/_process_slurm_files.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Functionality for processing slurm files.""" - -import os as _os -import re as _re - - -def get_slurm_file_base(slurm_file: str) -> str: - """ - Find out what the slurm output file will be called. - - Parameters - ---------- - slurm_file : str - The absolute path to the slurm job file. - - Returns - ------- - slurm_file_base : str - The file base for for any output written by the slurm job. - """ - # Get the path to the base dir - base_dir = _os.path.dirname(slurm_file) - # Find the slurm output file - with open(slurm_file, "r") as f: - for line in f: - split_line = _re.split(" |=", line) - if len(split_line) > 0 and split_line[0] == "#SBATCH": - if split_line[1] == "--output" or split_line[1] == "-o": - slurm_pattern = split_line[2] - if "%" in slurm_pattern: - file_base = slurm_pattern.split("%")[0] - return _os.path.join(base_dir, file_base) - else: - return _os.path.join(base_dir, slurm_pattern) - - # We haven't returned - raise an error - raise RuntimeError(f"Could not find slurm output file name in {slurm_file}") diff --git a/a3fe/run/_simulation_runner.py b/a3fe/run/_simulation_runner.py index 2f04b36..a89d8b2 100644 --- a/a3fe/run/_simulation_runner.py +++ b/a3fe/run/_simulation_runner.py @@ -27,6 +27,8 @@ from ..analyse.plot import plot_sq_sem_convergence as _plot_sq_sem_convergence from ._logging_formatters import _A3feFileFormatter, _A3feStreamFormatter +from ..configuration import SlurmConfig as _SlurmConfig + class SimulationRunner(ABC): """An abstract base class for simulation runners. Note that @@ -51,6 +53,8 @@ def __init__( base_dir: _Optional[str] = None, input_dir: _Optional[str] = None, output_dir: _Optional[str] = None, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, stream_log_level: int = _logging.INFO, dg_multiplier: int = 1, ensemble_size: int = 5, @@ -69,6 +73,14 @@ def __init__( Path to the output directory in which to store the output from the simulation. If None, this is set to `base_directory/output`. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, + the standard slurm_config is used. stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the calculation object and its child objects. @@ -142,6 +154,23 @@ def __init__( self._stream_log_level = stream_log_level self._set_up_logging() + # Create a SLURM config with the default partition if none is provided + if slurm_config is None: + default_partition = _SlurmConfig.get_default_partition() + self._logger.info( + f"No SLURM config provided, using default partition {default_partition}" + ) + self.slurm_config = _SlurmConfig(partition=default_partition) + else: + self.slurm_config = slurm_config + + # Use the same SLURM config for analysis if none is provided + self.analysis_slurm_config = ( + analysis_slurm_config + if analysis_slurm_config is not None + else self.slurm_config + ) + # Save state if dump: self._dump() diff --git a/a3fe/run/_virtual_queue.py b/a3fe/run/_virtual_queue.py index 183441f..a9383d6 100644 --- a/a3fe/run/_virtual_queue.py +++ b/a3fe/run/_virtual_queue.py @@ -150,7 +150,7 @@ def submit(self, command_list: _List[str], slurm_file_base: str) -> Job: Parameters ---------- command_list : _List[str] - The command to be run by sbatch. + The command to be run. slurm_file_base : str The base name of the slurm file to be written. This allows the slurm file to be checked for errors. @@ -232,12 +232,12 @@ def _read_slurm_queue_inner() -> _List[int]: def _submit_job(self, job_command_list: _List[str]) -> int: """ - Submit the supplied command to slurm using sbatch. + Submit the supplied command to slurm. Parameters ---------- job_command_list : _List[str] - The comands to be run by sbatch. + The comands to be run. Returns ------- @@ -253,13 +253,15 @@ def _submit_job(self, job_command_list: _List[str]) -> int: logger=self._logger, ) def _submit_job_inner(job_command_list: _List[str]) -> int: - cmds = ["sbatch"] + job_command_list process = _subprocess.Popen( - cmds, + # " ".join(job_command_list), + job_command_list, stdin=_subprocess.PIPE, stdout=_subprocess.PIPE, stderr=_subprocess.STDOUT, close_fds=True, + env=_os.environ.copy(), + # shell=True, ) if process.stdout is None: raise ValueError("Could not get stdout from process.") diff --git a/a3fe/run/calc_set.py b/a3fe/run/calc_set.py index b0d9901..815f370 100644 --- a/a3fe/run/calc_set.py +++ b/a3fe/run/calc_set.py @@ -12,6 +12,8 @@ import numpy as _np from scipy import stats as _stats +from ..configuration import SlurmConfig as _SlurmConfig + from ..analyse.analyse_set import compute_stats as _compute_stats from ..analyse.plot import plot_against_exp as _plt_against_exp from ..read._read_exp_dgs import read_exp_dgs as _read_exp_dgs @@ -36,6 +38,8 @@ def __init__( input_dir: _Optional[str] = None, output_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -49,8 +53,7 @@ def __init__( List of paths to the Calculation base directories. If None, then all directories in the current directory will be assumed to be calculation base directories calc_args: Dict[str: _Dict], Optional, default: {} - Dictionary of arguments to pass to the Calculation objects in the form - {"path_to_calc_base_dir": {keyword: arg, ...} ...} + Dictionary of kwargsto pass to the Calculation objects. base_dir : str, Optional, default: None Path to the base directory which contains all the Calculations. If None, this is set to the current working directory. @@ -63,6 +66,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the set object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, Optional, default: True If True, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -77,6 +87,8 @@ def __init__( output_dir=output_dir, stream_log_level=stream_log_level, update_paths=update_paths, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, ) if not self.loaded_from_pickle: @@ -88,6 +100,12 @@ def __init__( if _os.path.isdir(directory) ] self.calc_paths = [_os.path.abspath(directory) for directory in calc_paths] + + # Ensure that all calculations share the same slurm config by adding this if it is not present + if calc_args.get("slurm_config") is None: + calc_args["slurm_config"] = self.slurm_config + if calc_args.get("analysis_slurm_config") is None: + calc_args["analysis_slurm_config"] = self.analysis_slurm_config self._calc_args = calc_args # Check that we can load all of the calculations diff --git a/a3fe/run/calculation.py b/a3fe/run/calculation.py index 9561ec6..7d0ec1a 100644 --- a/a3fe/run/calculation.py +++ b/a3fe/run/calculation.py @@ -5,7 +5,6 @@ import logging as _logging import os as _os -import shutil as _shutil from typing import List as _List from typing import Optional as _Optional @@ -13,7 +12,10 @@ from .enums import LegType as _LegType from .enums import PreparationStage as _PreparationStage from .leg import Leg as _Leg -from ..configuration import SystemPreparationConfig as _SystemPreparationConfig +from ..configuration import ( + SystemPreparationConfig as _SystemPreparationConfig, + SlurmConfig as _SlurmConfig, +) class Calculation(_SimulationRunner): @@ -23,7 +25,6 @@ class Calculation(_SimulationRunner): """ required_input_files = [ - "run_somd.sh", "protein.pdb", "ligand.sdf", "template_config.cfg", @@ -40,6 +41,8 @@ def __init__( input_dir: _Optional[str] = None, base_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -78,6 +81,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the calculation object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, Optional, default: True If True, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -93,6 +103,8 @@ def __init__( stream_log_level=stream_log_level, ensemble_size=ensemble_size, update_paths=update_paths, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, dump=False, ) @@ -196,6 +208,8 @@ def setup( input_dir=self.input_dir, base_dir=_os.path.join(self.base_dir, leg_type.name.lower()), stream_log_level=self.stream_log_level, + slurm_config=self.slurm_config, + analysis_slurm_config=self.analysis_slurm_config, ) self.legs.append(leg) leg.setup(configs[leg_type]) @@ -304,8 +318,8 @@ def run( - :math:`t_{\\mathrm{Optimal, k}}` is the calculated optimal runtime for lambda window :math:`k` - :math:`t_{\\mathrm{Current}, k}` is the current runtime for lambda window :math:`k` - :math:`C` is the runtime constant - - :math:`\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. - - :math:`\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` + - :math:`\\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. + - :math:`\\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` Parameters ---------- @@ -338,16 +352,3 @@ def run( super().run( run_nos=run_nos, adaptive=adaptive, runtime=runtime, parallel=parallel ) - - def update_run_somd(self) -> None: - """ - Overwrite the run_somd.sh script in all simulation output dirs with - the version currently in the calculation input dir. - """ - master_run_somd = _os.path.join(self.input_dir, "run_somd.sh") - for leg in self.legs: - for stage in leg.stages: - _shutil.copy(master_run_somd, stage.input_dir) - for lambda_window in stage.lam_windows: - for simulation in lambda_window.sims: - _shutil.copy(master_run_somd, simulation.input_dir) diff --git a/a3fe/run/enums.py b/a3fe/run/enums.py index fde628f..3ca7d4d 100644 --- a/a3fe/run/enums.py +++ b/a3fe/run/enums.py @@ -16,6 +16,7 @@ class _YamlSerialisableEnum(_Enum): """A base class for enums that can be serialised to and deserialised from YAML.""" + @classmethod def to_yaml(cls, dumper: _yaml.Dumper, data: _Any) -> _yaml.nodes.ScalarNode: return dumper.represent_scalar( diff --git a/a3fe/run/lambda_window.py b/a3fe/run/lambda_window.py index e1722e4..59471e1 100644 --- a/a3fe/run/lambda_window.py +++ b/a3fe/run/lambda_window.py @@ -20,6 +20,7 @@ from ._simulation_runner import SimulationRunner as _SimulationRunner from ._virtual_queue import VirtualQueue as _VirtualQueue from .simulation import Simulation as _Simulation +from ..configuration import SlurmConfig as _SlurmConfig class LamWindow(_SimulationRunner): @@ -50,6 +51,8 @@ def __init__( input_dir: _Optional[str] = None, output_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -103,6 +106,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the Ensemble object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, Optional, default: True If true, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -122,6 +132,8 @@ def __init__( stream_log_level=stream_log_level, ensemble_size=ensemble_size, update_paths=update_paths, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, dump=False, ) @@ -176,6 +188,8 @@ def __init__( input_dir=sim_base_dir, output_dir=sim_base_dir, stream_log_level=stream_log_level, + slurm_config=self.slurm_config, + analysis_slurm_config=self.analysis_slurm_config, ) ) diff --git a/a3fe/run/leg.py b/a3fe/run/leg.py index e5c8e2a..b9f9ff7 100644 --- a/a3fe/run/leg.py +++ b/a3fe/run/leg.py @@ -22,7 +22,6 @@ from ..analyse.plot import plot_convergence as _plot_convergence from ..analyse.plot import plot_rmsds as _plot_rmsds from ..analyse.plot import plot_sq_sem_convergence as _plot_sq_sem_convergence -from ..read._process_slurm_files import get_slurm_file_base as _get_slurm_file_base from ..read._process_somd_files import read_simfile_option as _read_simfile_option from ..read._process_somd_files import write_simfile_option as _write_simfile_option from . import system_prep as _system_prep @@ -35,7 +34,10 @@ from .enums import PreparationStage as _PreparationStage from .enums import StageType as _StageType from .stage import Stage as _Stage -from ..configuration import SystemPreparationConfig as _SystemPreparationConfig +from ..configuration import ( + SystemPreparationConfig as _SystemPreparationConfig, + SlurmConfig as _SlurmConfig, +) class Leg(_SimulationRunner): @@ -49,7 +51,6 @@ class Leg(_SimulationRunner): required_input_files[leg_type] = {} for prep_stage in _PreparationStage: required_input_files[leg_type][prep_stage] = [ - "run_somd.sh", "template_config.cfg", ] + prep_stage.get_simulation_input_files(leg_type) @@ -68,6 +69,8 @@ def __init__( base_dir: _Optional[str] = None, input_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -103,6 +106,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the calculation object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, optional, default: True if true, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -118,6 +128,8 @@ def __init__( base_dir=base_dir, input_dir=input_dir, stream_log_level=stream_log_level, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, ensemble_size=ensemble_size, update_paths=update_paths, dump=False, @@ -265,6 +277,8 @@ def setup( "input", "output" ), stream_log_level=self.stream_log_level, + slurm_config=self.slurm_config, + analysis_slurm_config=self.analysis_slurm_config, ) ) @@ -775,9 +789,6 @@ def write_input_files( for file in _glob.glob(f"{stage_input_dir}/lambda_*"): _subprocess.run(["rm", "-rf", file], check=True) - # Copy the run_somd.sh script to the stage input directory - _shutil.copy(f"{self.input_dir}/run_somd.sh", stage_input_dir) - # Copy the final coordinates from the ensemble equilibration stage to the stage input directory # and, if this is the bound stage, also copy over the restraints for i in range(self.ensemble_size): @@ -871,31 +882,9 @@ def _run_slurm( ------- None """ - # Write the slurm script - # Get the header from run_somd.sh - header_lines = [] - with open(f"{self.input_dir}/run_somd.sh", "r") as file: - for line in file.readlines(): - if line.startswith("#SBATCH") or line.startswith("#!/bin/bash"): - header_lines.append(line) - else: - break - - # Add lines to run the python function and write out - header_lines.append( - f"\npython -c 'from a3fe.run.system_prep import {sys_prep_fn.__name__}; {sys_prep_fn.__name__}()'" - ) - slurm_file = f"{run_dir}/{job_name}.sh" - with open(slurm_file, "w") as file: - file.writelines(header_lines) - - # Submit to the virtual queue - cmd_list = [ - "--chdir", - f"{run_dir}", - f"{run_dir}/{job_name}.sh", - ] # The virtual queue adds sbatch - slurm_file_base = _get_slurm_file_base(slurm_file) + cmd = f"python -c 'from a3fe.run.system_prep import {sys_prep_fn.__name__}; {sys_prep_fn.__name__}()'" + cmd_list = self.slurm_config.get_submission_cmds(cmd=cmd, run_dir=run_dir) + slurm_file_base = self.slurm_config.get_slurm_output_file_base(run_dir=run_dir) job = self.virtual_queue.submit(cmd_list, slurm_file_base=slurm_file_base) self._logger.info(f"Submitted job {job}") self.jobs.append(job) @@ -938,8 +927,8 @@ def run( - :math:`t_{\\mathrm{Optimal, k}}` is the calculated optimal runtime for lambda window :math:`k` - :math:`t_{\\mathrm{Current}, k}` is the current runtime for lambda window :math:`k` - :math:`C` is the runtime constant - - :math:`\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. - - :math:`\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` + - :math:`\\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. + - :math:`\\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` Parameters ---------- diff --git a/a3fe/run/simulation.py b/a3fe/run/simulation.py index 5fae8f9..faabe54 100644 --- a/a3fe/run/simulation.py +++ b/a3fe/run/simulation.py @@ -15,20 +15,19 @@ import numpy as _np from sire.units import k_boltz as _k_boltz -from ..read._process_slurm_files import get_slurm_file_base as _get_slurm_file_base from ..read._process_somd_files import read_simfile_option as _read_simfile_option from ..read._process_somd_files import write_simfile_option as _write_simfile_option from ._simulation_runner import SimulationRunner as _SimulationRunner from ._virtual_queue import Job as _Job from ._virtual_queue import VirtualQueue as _VirtualQueue from .enums import JobStatus as _JobStatus +from ..configuration import SlurmConfig as _SlurmConfig class Simulation(_SimulationRunner): """Class to store information about a single SOMD simulation.""" required_input_files = [ - "run_somd.sh", "somd.cfg", "somd.prm7", "somd.rst7", @@ -59,6 +58,8 @@ def __init__( input_dir: _Optional[str] = None, output_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -84,6 +85,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the simulation object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, Optional, default: True If True, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -102,6 +110,8 @@ def __init__( input_dir=input_dir, output_dir=output_dir, stream_log_level=stream_log_level, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, update_paths=update_paths, dump=False, ) @@ -309,11 +319,10 @@ def _update_simfile(self) -> None: ) def _get_slurm_file_base(self) -> None: - """Find out what the slurm output file will be called.""" - # Find the slurm output file - - slurm_file = _os.path.join(self.input_dir, "run_somd.sh") - self.slurm_file_base = _get_slurm_file_base(slurm_file) + """Find out what the slurm output file will be called and save it.""" + self.slurm_file_base = self.slurm_config.get_slurm_output_file_base( + run_dir=self.input_dir + ) self._logger.debug(f"Found slurm output file basename: {self.slurm_file_base}") def run(self, runtime: float = 2.5) -> None: @@ -344,12 +353,11 @@ def run(self, runtime: float = 2.5) -> None: self._set_n_cycles(n_cycles) # Run SOMD - note that command excludes sbatch as this is added by the virtual queue - cmd_list = [ - "--chdir", - f"{self.output_dir}", - f"{self.input_dir}/run_somd.sh", - f"{self.lam}", - ] + cmd = f"somd-freenrg -C somd.cfg -l {self.lam} -p CUDA" + cmd_list = self.slurm_config.get_submission_cmds( + cmd=cmd, run_dir=self.output_dir + ) + self.job = self.virtual_queue.submit( command_list=cmd_list, slurm_file_base=self.slurm_file_base ) diff --git a/a3fe/run/stage.py b/a3fe/run/stage.py index 0820f82..95f8074 100644 --- a/a3fe/run/stage.py +++ b/a3fe/run/stage.py @@ -53,6 +53,7 @@ from ._virtual_queue import VirtualQueue as _VirtualQueue from .enums import StageType as _StageType from .lambda_window import LamWindow as _LamWindow +from ..configuration.slurm_config import SlurmConfig as _SlurmConfig class Stage(_SimulationRunner): @@ -86,6 +87,8 @@ def __init__( input_dir: _Optional[str] = None, output_dir: _Optional[str] = None, stream_log_level: int = _logging.INFO, + slurm_config: _Optional[_SlurmConfig] = None, + analysis_slurm_config: _Optional[_SlurmConfig] = None, update_paths: bool = True, ) -> None: """ @@ -127,6 +130,13 @@ def __init__( stream_log_level : int, Optional, default: logging.INFO Logging level to use for the steam file handlers for the Ensemble object and its child objects. + slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler. If None, the + default partition is used. + analysis_slurm_config: SlurmConfig, default: None + Configuration for the SLURM job scheduler for the analysis. + This is helpful e.g. if you want to submit analysis to the CPU + partition, but the main simulation to the GPU partition. If None, update_paths: bool, Optional, default: True If True, if the simulation runner is loaded by unpickling, then update_paths() is called. @@ -144,6 +154,8 @@ def __init__( input_dir=input_dir, output_dir=output_dir, stream_log_level=stream_log_level, + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, ensemble_size=ensemble_size, update_paths=update_paths, dump=False, @@ -182,6 +194,8 @@ def __init__( base_dir=lam_base_dir, input_dir=self.input_dir, stream_log_level=self.stream_log_level, + slurm_config=self.slurm_config, + analysis_slurm_config=self.analysis_slurm_config, ) ) @@ -241,8 +255,8 @@ def run( - :math:`t_{\\mathrm{Optimal, k}}` is the calculated optimal runtime for lambda window :math:`k` - :math:`t_{\\mathrm{Current}, k}` is the current runtime for lambda window :math:`k` - :math:`C` is the runtime constant - - :math:`\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. - - :math:`\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` + - :math:`\\sigma_{\\mathrm{Current}}(\\Delta \\widehat{F}_k)` is the current uncertainty in the free energy change contribution for lambda window :math:`k`. This is estimated from inter-run deviations. + - :math:`\\Delta \\widehat{F}_k` is the free energy change contribution for lambda window :math:`k` Parameters ---------- @@ -793,11 +807,11 @@ def analyse( equilibrated=True, ) else: - jobs, mbar_outfiles, tmp_simfiles = _submit_mbar_slurm( + jobs, mbar_outfiles, tmp_files = _submit_mbar_slurm( output_dir=self.output_dir, virtual_queue=self.virtual_queue, + slurm_config=self.analysis_slurm_config, run_nos=run_nos, - run_somd_dir=self.input_dir, percentage_end=fraction * 100, percentage_start=0, subsampling=subsampling, @@ -810,7 +824,7 @@ def analyse( jobs=jobs, mbar_out_files=mbar_outfiles, virtual_queue=self.virtual_queue, - tmp_simfiles=tmp_simfiles, + tmp_files=tmp_files, ) mean_free_energy = _np.mean(free_energies) @@ -1064,8 +1078,8 @@ def analyse_convergence( _submit_mbar_slurm( output_dir=self.output_dir, virtual_queue=self.virtual_queue, + slurm_config=self.analysis_slurm_config, run_nos=run_nos, - run_somd_dir=self.input_dir, percentage_end=end_percent, percentage_start=start_percent, subsampling=False, @@ -1082,7 +1096,7 @@ def analyse_convergence( jobs=jobs, mbar_out_files=mbar_outfiles, virtual_queue=self.virtual_queue, - tmp_simfiles=tmp_simfiles, + tmp_files=tmp_simfiles, ) ) @@ -1217,6 +1231,8 @@ def update(self, save_name: str = "output_saved") -> None: base_dir=lam_base_dir, input_dir=self.input_dir, stream_log_level=self.stream_log_level, + slurm_config=self.slurm_config, + analysis_slurm_config=self.analysis_slurm_config, ) # Overwrite the default equilibration detection algorithm new_lam_win.check_equil = old_lam_vals_attrs["check_equil"] diff --git a/a3fe/tests/conftest.py b/a3fe/tests/conftest.py index da208fc..1d82626 100644 --- a/a3fe/tests/conftest.py +++ b/a3fe/tests/conftest.py @@ -96,7 +96,7 @@ def t4l_calc(): ) # Copy over remaining input files - for file in ["run_somd.sh", "template_config.cfg"]: + for file in ["template_config.cfg"]: subprocess.run( [ "cp", diff --git a/a3fe/tests/test_read.py b/a3fe/tests/test_read.py index 49ab4af..b0fc876 100644 --- a/a3fe/tests/test_read.py +++ b/a3fe/tests/test_read.py @@ -15,8 +15,6 @@ write_truncated_sim_datafile, ) -from ..read._process_slurm_files import get_slurm_file_base - def test_read_mbar_result(): """Test that the read_mbar_result function works correctly""" @@ -114,17 +112,3 @@ def test_write_truncated_sim_datafile_end_and_start(): lines = f.readlines() assert lines[13].split()[0] == "5000" assert lines[-2].split()[0] == "9000" - - -def test_process_slurm_file_base(): - """ - Test that the SLURM file base name is correctly extracted from a SLURM file. - """ - slurm_file_base = get_slurm_file_base("a3fe/data/example_run_dir/input/run_somd.sh") - assert slurm_file_base == "a3fe/data/example_run_dir/input/somd-array-gpu-" - - # Test alternative formatting - slurm_file_base = get_slurm_file_base( - "a3fe/data/alternative_input/alternative_run_somd.sh" - ) - assert slurm_file_base == "a3fe/data/alternative_input/somd-array-gpu-" diff --git a/a3fe/tests/test_run.py b/a3fe/tests/test_run.py index b7ccaf4..5b21821 100644 --- a/a3fe/tests/test_run.py +++ b/a3fe/tests/test_run.py @@ -398,7 +398,6 @@ def test_setup_calc_stages(self, setup_calc): """Test that setting up the calculation produced the correct stages.""" for leg in setup_calc.legs: expected_input_files = { - "run_somd.sh", "somd_1.rst7", "somd.cfg", "somd.prm7", @@ -445,7 +444,6 @@ def test_setup_calc_sims(self, setup_calc): """Test that setting up the calculation produced the correct simulations.""" for leg in setup_calc.legs: expected_base_files = { - "run_somd.sh", "somd.cfg", "Simulation.pkl", "Simulation.log", @@ -531,7 +529,6 @@ def test_integration_calculation(calc_slurm): "somd.rst7", "somd.prm7", "somd.pert", - "run_somd.sh", "somd_1.rst7", "somd_2.rst7", ] diff --git a/a3fe/tests/test_slurm_configuration.py b/a3fe/tests/test_slurm_configuration.py new file mode 100644 index 0000000..9a718a4 --- /dev/null +++ b/a3fe/tests/test_slurm_configuration.py @@ -0,0 +1,118 @@ +"""Unit and regression tests for the SlurmConfig class.""" + +from tempfile import TemporaryDirectory + + +from unittest.mock import patch + +from a3fe import SlurmConfig + +import os + + +def test_create_default_config(): + """Test that the default config is created correctly.""" + config = SlurmConfig() + assert config.partition == "default" + + +def test_modify_config(): + """Check that we can modify the config.""" + config = SlurmConfig() + config.partition = "test_partition" + + +def test_config_pickle_and_load(): + """Test that the config can be pickled and loaded.""" + with TemporaryDirectory() as dirname: + config = SlurmConfig() + config.dump(dirname) + config2 = SlurmConfig.load(dirname) + assert config == config2 + + +def test_get_submission_cmds(): + """ + Test that the submission commands are generated correctly + and that the script is written correctly. + """ + # Tmpdir to store the script + with TemporaryDirectory() as dirname: + config = SlurmConfig( + partition="test_partition", + time="24:00:00", + gres="gpu:1", + nodes=1, + ntasks_per_node=1, + output="test.out", + ) + submission_cmds = config.get_submission_cmds( + cmd="echo 'Test'", run_dir=dirname, script_name="test" + ) + script_path = os.path.join(dirname, "test.sh") + assert submission_cmds == ["sbatch", f"--chdir={dirname}", script_path] + + expected_script = ( + "#!/bin/bash\n" + "#SBATCH --partition=test_partition\n" + "#SBATCH --time=24:00:00\n" + "#SBATCH --gres=gpu:1\n" + "#SBATCH --nodes=1\n" + "#SBATCH --ntasks-per-node=1\n" + "#SBATCH --output=test.out\n" + "\necho 'Test'\n" + ) + + with open(script_path, "r") as f: + script = f.read() + + assert script == expected_script + + +def test_get_submission_cmds_extra_options(): + """ + Test that the submission commands are generated correctly + and that the script is written correctly with extra options. + """ + # Tmpdir to store the script + with TemporaryDirectory() as dirname: + config = SlurmConfig( + partition="test_partition", + time="24:00:00", + gres="gpu:1", + nodes=1, + ntasks_per_node=1, + output="test.out", + ) + config.extra_options = {"mem": "10G", "exclude": "node1"} + _ = config.get_submission_cmds( + cmd="echo 'Test'", run_dir=dirname, script_name="test" + ) + script_path = os.path.join(dirname, "test.sh") + + with open(script_path, "r") as f: + script = f.read() + + assert "#SBATCH --mem=10G\n" in script + assert "#SBATCH --exclude=node1\n" in script + + +def test_get_output_file_base(): + """ + Test that the output file base is generated correctly. + """ + config = SlurmConfig(output="slurm%j.out") + output_file_base = config.get_slurm_output_file_base(run_dir="test_dir") + assert output_file_base == "test_dir/slurm" + + +def test_get_default_partition(): + """ + Test that the default partition is set correctly. + """ + with patch("subprocess.run") as mocked_run: + # Define the mock return value + mocked_run.return_value.stdout = ( + "serial*\nRTX4060\nGTX980\nRTX3080\ntest\nlong\n" + ) + assert SlurmConfig.get_default_partition() == "serial" diff --git a/a3fe/tests/test_configuration.py b/a3fe/tests/test_sys_prep_configuration.py similarity index 92% rename from a3fe/tests/test_configuration.py rename to a3fe/tests/test_sys_prep_configuration.py index 70ac16b..6822df9 100644 --- a/a3fe/tests/test_configuration.py +++ b/a3fe/tests/test_sys_prep_configuration.py @@ -1,4 +1,4 @@ -"""Unit and regression tests for Pydantic configuration classes.""" +"""Unit and regression tests for the SystemPreparationConfig class.""" from tempfile import TemporaryDirectory @@ -26,7 +26,7 @@ def test_incorrect_config_mod(): config.ensemble_equilibration_time = -1 -def test_config_pickle_and_load(): +def test_config_dump_and_load(): """Test that the config can be pickled and loaded.""" with TemporaryDirectory() as dirname: config = SystemPreparationConfig() diff --git a/docs/a3fe_design.rst b/docs/a3fe_design.rst index 62ba18b..7620c82 100644 --- a/docs/a3fe_design.rst +++ b/docs/a3fe_design.rst @@ -51,8 +51,14 @@ For more details of the algorithms, please see [the preprint](https://doi.org/10 Some Notes on the Implementation ********************************* -a3fe is designed to be easily adaptable to any SLURM cluster. The SLURM submission settings can be tailored by modifying -the header of ``run_somd.sh`` in the input directory. +a3fe is designed to be easily adaptable to any SLURM cluster. The SLURM submission settings can be tailored by modifying +the :class:`a3fe.SlurmConfig` of your calculation (or other simulation runner). For example, to change the partition: + +.. code-block:: python + + calc.slurm_config.partition = "my-cluster-gpu-partition" + +If you don't supply a partition to the SlurmConfig, a3fe will use the default partition. If the input is not parameterised, a3fe will parameterise your input with ff14SB, OFF 2.0.0, and TIP3P by default. See :ref:`preparing input`. By default, a3fe will solvate your system in a rhombic dodecahedral box with 150 mM NaCl diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 6acb9aa..f4f74e3 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -13,13 +13,16 @@ Quick Start - Activate your a3fe conda environment - Create a base directory for the calculation and create an directory called ``input`` within this - Move your input files into the the input directory. For example, if you have parameterised AMBER-format input files, name these bound_param.rst7, bound_param.prm7, free_param.rst7, and free_param.prm7. **Ensure that the ligand is named LIG and is the first molecule in the system.** For more details see :ref:`Preparing Input for a3fe`. Alternatively, copy the pre-provided input from ``a3fe/a3fe/data/example_run_dir/input`` to your input directory. -- Copy run somd.sh and template_config.sh from ``a3fe/a3fe/data/example_run_dir`` to your ``input`` directory, making sure to the SLURM options in run_somd.sh so that the jobs will run on your cluster +- Copy template_config.cfg from ``a3fe/a3fe/data/example_run_dir`` to your ``input`` directory. - In the calculation base directory, run the following python code, either through ipython or as a python script (you will likely want to run this with ``nohup``/ through tmux to ensure that the calculation is not killed when you lose connection). Running though ipython will let you interact with the calculation while it's running. .. code-block:: python import a3fe as a3 - calc = a3.Calculation(ensemble_size=5) + calc = a3.Calculation( + ensemble_size=5, # Use 5 (independently equilibrated) replicate runs + slurm_config=a3.SlurmConfig(partition=""), # Set your desired partition! + ) calc.setup() calc.get_optimal_lam_vals() calc.run(adaptive=False, runtime = 5) # Run non-adaptively for 5 ns per replicate diff --git a/docs/guides.rst b/docs/guides.rst index eab7bdb..ebbcbe8 100644 --- a/docs/guides.rst +++ b/docs/guides.rst @@ -67,7 +67,7 @@ You can also find out which input files are required for a given preparation sta - free_preequil.prm7, free_preequil.rst7 - The solvated ligand after heating and short initial equilibration steps -In addition, for every preparation stage, **run_somd.sh and template_config.cfg must be present in the input +In addition, for every preparation stage, **template_config.cfg must be present in the input directory.** Please note that if you are suppling parameterised input files, **the ligand must be the first molecule in the system @@ -124,6 +124,9 @@ is not killed when you log out). Customising Calculations ************************* +Calculation Setup +----------------- + Calculation setup options, including the force fields, lambda schedules, and length of the equilibration steps, can be customised using :class:`a3fe.configuration.system_preparation.SystemPreparationConfig`. For example, to use GAFF2 instead of OFF2 for the small molecule, set this in the config object and pass this to ``calc.setup()``: @@ -133,11 +136,44 @@ For example, to use GAFF2 instead of OFF2 for the small molecule, set this in th cfg.forcefields["ligand"] = "gaff2" calc_set.setup(bound_leg_sysprep_config = cfg, free_leg_sysprep_config = cfg) +Individual Simulation settings +------------------------------- + To customise the specifics of how each lambda window is run (e.g. timestep), you can use the ``set_simfile_option`` method. For example, to set the timestep to 2 fs, run ``calc.set_simfile_option("timestep", "2 * femtosecond")``. This will change parameters from the defaults given in ``template_config.cfg`` in the ``input`` directory, and warn -you if you are trying to set a parameter that is not present in the template config file. To see a list of available options, run ``somd-freenrg --help-config``. Note that if you -want to change any slurm options in ``run_somd.sh``, you should modify ``run_somd.sh`` in the the calculation ``input`` directory then run ``calc.update_run_somd()`` to update all -``run_somd.sh`` files in the calculation. +you if you are trying to set a parameter that is not present in the template config file. To see a list of available options, run ``somd-freenrg --help-config``. + +SLURM Options +------------- + +SLURM options can be customised using the :class:`a3fe.SlurmConfig` object. For example, to change the partition, set ``calc.slurm_config.partition = "my-cluster-gpu-partition"``. You can +also set other options, e.g. + +.. code-block:: python + + slurm_config = a3.SlurmConfig( + partition="my-cluster-gpu-partition", + time="12:00:00", + ) + +.. note:: + + The molecular dynamics simulations should be run on GPUs - they are unbearably slow on CPU. However, you may want to run the MBAR analysis on CPUs to minimise submissions to the CPU queue. + To do this, you can supply an ``analysis_slurm_config`` which is different to the ``slurm_config``, which will only be used for the MBAR analysis. + + .. code-block:: python + + analysis_slurm_config = a3.SlurmConfig( + partition="my-cluster-cpu-partition", + time="00:10:00", + ) + + calc = a3.Calculation( + slurm_config=slurm_config, + analysis_slurm_config=analysis_slurm_config, + ) + + Then make sure to set ``slurm=True`` when running the analysis, e.g. ``calc.analyse(slurm=True)``. Running Fast Non-Adaptive Calculations *************************************** diff --git a/environment.yaml b/environment.yaml index e3c4b66..2441b34 100644 --- a/environment.yaml +++ b/environment.yaml @@ -1,4 +1,4 @@ -name: a3fe +name: a3fe-feature-decouple-2 channels: - conda-forge