From 08c0a4b321afcc0f497875203c2f8a2b0d983357 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Sat, 24 Apr 2021 10:16:07 -0400 Subject: [PATCH 01/30] added comments, no code changes --- presto/replica_exchange.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/presto/replica_exchange.py b/presto/replica_exchange.py index 251ead9..91d694c 100644 --- a/presto/replica_exchange.py +++ b/presto/replica_exchange.py @@ -32,6 +32,7 @@ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=1 assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + # sort by temp self.trajectories = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) self.stop_time = trajectories[0].stop_time @@ -86,12 +87,15 @@ def run(self): processes = [None]*len(self.trajectories) start_idx = self.current_idx - # we break the runs up into small chunks + # we break the runs up into small chunks of size swap_interval + # each trajectory is basically run in parallel for time swap_interval in each iter for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): next_idx = current_idx + 1 target_time = next_idx * self.swap_interval + for idx, traj in enumerate(self.trajectories): # how long does each traj need to run for? + # the last iter may have time_remaining \neq swap_interval time_remaining = max(0, target_time - traj.last_time_run()) if time_remaining: @@ -100,22 +104,26 @@ def run(self): "checkpoint_interval": min(MIN_CHECKPOINT_INTERVAL, self.swap_interval), }) processes[idx].start() - + for process in processes: if process is not None: process.join() + # all the chunks in this iter are done + # run saves frames to chk file, so this ensures that run is done and saved properly for traj in self.trajectories: traj.load_from_checkpoint() assert traj.last_time_run() == target_time - self.exchange(next_idx*self.swap_interval) + self.exchange(next_idx * self.swap_interval) self.current_idx = next_idx self.save() self.finished = True return self def exchange(self, time): + """ time is from 0 + """ kB = presto.constants.BOLTZMANN_CONSTANT for i in range(len(self.trajectories)-1): @@ -132,6 +140,7 @@ def exchange(self, time): logger.info(f"E{i} & E{j}\tp={p}") if p > random.random(): + # or momenta scaling v_i_scaling = np.sqrt(T_j/T_i) v_j_scaling = np.sqrt(T_i/T_j) @@ -148,6 +157,7 @@ def exchange(self, time): def report(self): counts = np.zeros(shape=len(self.trajectories)) + #len of counts is no of temps possible = self.current_idx * (len(self.trajectories) - 1) for swap in self.swaps: From 537fc2b810abf25ac32bec4e04da21a4c1b072ee Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 19 Apr 2021 16:52:41 -0400 Subject: [PATCH 02/30] updated referenced script for automatic solvation to solvate.py --- tutorial/tutorial01/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial01/README.md b/tutorial/tutorial01/README.md index 985ae22..d7a0640 100644 --- a/tutorial/tutorial01/README.md +++ b/tutorial/tutorial01/README.md @@ -48,10 +48,10 @@ The overall workflow then, looks like this: ## Step 1: Build Solvated System -The starting material and product were brought together in GaussView to a rough pre-reactive conformation (``AcCl_NaN3.xyz``), and the system was solvated with 50 acetonitrile molecules using ``packmol/build_input.py`` (which automatically creates a sphere at the correct density for STP): +The starting material and product were brought together in GaussView to a rough pre-reactive conformation (``AcCl_NaN3.xyz``), and the system was solvated with 50 acetonitrile molecules using ``presto/scripts/solvate.py`` (which automatically creates a sphere at the correct density for STP): ``` -$ python ../packmol/build_input.py -f AcCl_NaN3.xyz -o solvated.xyz -s acetonitrile -n 50 +$ python /scripts/build_input.py -f AcCl_NaN3.xyz -o solvated.xyz -s acetonitrile -n 50 ``` The radius of the resultant solvated system was 10.2 Å, and the system had 311 atoms in total. From d46c2af3f501c73fbdd22fde77f6e57f2d0aad05 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 19 Apr 2021 16:54:17 -0400 Subject: [PATCH 03/30] remove interactive bash when calling packmol, prevent lmod reload --- scripts/solvate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/solvate.py b/scripts/solvate.py index 5377a9b..845d212 100644 --- a/scripts/solvate.py +++ b/scripts/solvate.py @@ -73,7 +73,7 @@ print(f"temp.inp created!") #### call packmol! -subprocess.call(['/bin/bash', '-i', '-c', "packmol < temp.inp"]) +subprocess.call(['/bin/bash', '-c', "packmol < temp.inp"]) #### either delete temporary file or leave it if packmol failed if os.path.exists(args["output"]): From 848ce70b77f5c18e82e2fea5e0abd3862e41ce1a Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Sat, 24 Apr 2021 10:16:07 -0400 Subject: [PATCH 04/30] added comments, no code changes --- presto/replica_exchange.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/presto/replica_exchange.py b/presto/replica_exchange.py index 251ead9..91d694c 100644 --- a/presto/replica_exchange.py +++ b/presto/replica_exchange.py @@ -32,6 +32,7 @@ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=1 assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + # sort by temp self.trajectories = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) self.stop_time = trajectories[0].stop_time @@ -86,12 +87,15 @@ def run(self): processes = [None]*len(self.trajectories) start_idx = self.current_idx - # we break the runs up into small chunks + # we break the runs up into small chunks of size swap_interval + # each trajectory is basically run in parallel for time swap_interval in each iter for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): next_idx = current_idx + 1 target_time = next_idx * self.swap_interval + for idx, traj in enumerate(self.trajectories): # how long does each traj need to run for? + # the last iter may have time_remaining \neq swap_interval time_remaining = max(0, target_time - traj.last_time_run()) if time_remaining: @@ -100,22 +104,26 @@ def run(self): "checkpoint_interval": min(MIN_CHECKPOINT_INTERVAL, self.swap_interval), }) processes[idx].start() - + for process in processes: if process is not None: process.join() + # all the chunks in this iter are done + # run saves frames to chk file, so this ensures that run is done and saved properly for traj in self.trajectories: traj.load_from_checkpoint() assert traj.last_time_run() == target_time - self.exchange(next_idx*self.swap_interval) + self.exchange(next_idx * self.swap_interval) self.current_idx = next_idx self.save() self.finished = True return self def exchange(self, time): + """ time is from 0 + """ kB = presto.constants.BOLTZMANN_CONSTANT for i in range(len(self.trajectories)-1): @@ -132,6 +140,7 @@ def exchange(self, time): logger.info(f"E{i} & E{j}\tp={p}") if p > random.random(): + # or momenta scaling v_i_scaling = np.sqrt(T_j/T_i) v_j_scaling = np.sqrt(T_i/T_j) @@ -148,6 +157,7 @@ def exchange(self, time): def report(self): counts = np.zeros(shape=len(self.trajectories)) + #len of counts is no of temps possible = self.current_idx * (len(self.trajectories) - 1) for swap in self.swaps: From 6b8610949dc3fe17c3847eedc7bed511543b9708 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Sat, 24 Apr 2021 20:18:39 -0400 Subject: [PATCH 05/30] catch oldchk=None, prevent ambiguous error message --- presto/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/presto/config.py b/presto/config.py index 0dbdda9..8e6e5a1 100644 --- a/presto/config.py +++ b/presto/config.py @@ -184,6 +184,7 @@ def build(file, checkpoint, geometry=None, oldchk=None, oldchk_idx=-1, **args): return None else: + assert oldchk, f"Need old checkpoint file for reaction trajectory!" assert os.path.exists(oldchk), f"Need old checkpoint file for reaction trajectory!" with h5py.File(oldchk, "r") as h5: atomic_numbers = h5.attrs["atomic_numbers"] From 1d327308f0397cd6c284a97f2c7c1f60f575d40d Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 26 Apr 2021 14:06:07 -0400 Subject: [PATCH 06/30] make folder for parallel remd --- presto/config.py | 4 +- presto/partest/par_test.py | 24 +++++ presto/partest/re_par.py | 173 +++++++++++++++++++++++++++++++++++++ presto/replica_exchange.py | 4 +- setup.py | 26 +----- 5 files changed, 204 insertions(+), 27 deletions(-) create mode 100644 presto/partest/par_test.py create mode 100644 presto/partest/re_par.py diff --git a/presto/config.py b/presto/config.py index 8e6e5a1..d416c1e 100644 --- a/presto/config.py +++ b/presto/config.py @@ -113,6 +113,7 @@ def build(file, checkpoint, geometry=None, oldchk=None, oldchk_idx=-1, **args): args["checkpoint_filename"] = checkpoint assert isinstance(settings["type"], str), "`type` must be a string" + if settings["type"].lower() == "equilibration": mol, x, v, a = None, None, None, None if not os.path.exists(checkpoint): @@ -194,10 +195,11 @@ def build(file, checkpoint, geometry=None, oldchk=None, oldchk_idx=-1, **args): temp = h5.get("bath_temperatures")[oldchk_idx] args["atomic_numbers"] = atomic_numbers.view(cctk.OneIndexedArray) + assert "termination_function" in settings, "Need `termination_function` in config YAML file for type=`reaction`!" f = build_termination_function(settings["termination_function"]) - + if "time_after_finished" in settings: assert isinstance(settings["time_after_finished"], (float, int)), "Need `time_after_finished` to be numeric!" args["time_after_finished"] = settings["time_after_finished"] diff --git a/presto/partest/par_test.py b/presto/partest/par_test.py new file mode 100644 index 0000000..cec9c10 --- /dev/null +++ b/presto/partest/par_test.py @@ -0,0 +1,24 @@ +import numpy as np + +class ParTest(object): + """Testing how MPI4py works in classes + + """ + def __init__(self, x, y): + self.x = x + self.y = y + + def add(self): + from mpi4py import MPI + size = MPI.COMM_WORLD.Get_size() + rank = MPI.COMM_WORLD.Get_rank() + + print(f"hello from process {rank} of {size}") + if not rank: + return self.x + self.y + else: + return 'abc' + +if __name__ == "__main__": + p = ParTest(1, 2) + print(p.add()) diff --git a/presto/partest/re_par.py b/presto/partest/re_par.py new file mode 100644 index 0000000..2e1b3c5 --- /dev/null +++ b/presto/partest/re_par.py @@ -0,0 +1,173 @@ +import numpy as np +import math, copy, cctk, os, re, logging, time, yaml, random +import multiprocessing as mp + +import presto + +logger = logging.getLogger(__name__) + +MIN_CHECKPOINT_INTERVAL = 50 + +class ReplicaExchange(): + """ + Runs several trajectories and manages interconversions between them. + + Based on: + http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf + + Attributes: + stop_time (int): + swaps (list of dict): + swap_interval (int): + checkpoint_filename (int): + finished (bool): + current_idx (int): + """ + def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): + temps = np.zeros(shape=len(trajectories)) + for idx, traj in enumerate(trajectories): + assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" + assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" + assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" + assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" + assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + + # sort by temp + self.trajectories = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) + self.stop_time = trajectories[0].stop_time + + self.swaps = list() + assert isinstance(swap_interval, (float, int)) + assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" + self.swap_interval = swap_interval + + assert isinstance(checkpoint_filename, str) + self.checkpoint_filename = checkpoint_filename + self.finished = False + self.current_idx = 0 + + self.load() + + def __str__(self): + return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + + def __repr__(self): + return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + + def save(self): + file_dict = { + "stop_time": self.stop_time, + "swap_interval": self.swap_interval, + "swaps": self.swaps, + "finished": self.finished, + "current_idx": self.current_idx, + } + with open(self.checkpoint_filename, "w+") as f: + yaml.dump(file_dict, f) + logger.info(f"Saving ReplicaExchange to {self.checkpoint_filename}.") + return self + + def load(self): + if os.path.exists(self.checkpoint_filename): + with open(self.checkpoint_filename, "r+") as f: + file_dict = yaml.safe_load(f) + self.stop_time = file_dict["stop_time"] + self.swap_interval = file_dict["swap_interval"] + self.swaps = file_dict["swaps"] + self.finished = file_dict["finished"] + self.current_idx = file_dict["current_idx"] + logger.info(f"Loaded ReplicaExchange from {self.checkpoint_filename}.") + return self + + def run(self): + if self.finished: + logger.info(f"Replica exchange already finished!") + return self + + processes = [None]*len(self.trajectories) + start_idx = self.current_idx + + # we break the runs up into small chunks of size swap_interval + # each trajectory is basically run in parallel for time swap_interval in each iter + # we make as many mp.Process objects as there are trajectories + for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): + next_idx = current_idx + 1 + target_time = next_idx * self.swap_interval + + for idx, traj in enumerate(self.trajectories): + # how long does each traj need to run for? + # the last iter may have time_remaining \neq swap_interval + time_remaining = max(0, target_time - traj.last_time_run()) + + if time_remaining: + processes[idx] = mp.Process(target=traj.run, kwargs={ + "time": self.swap_interval, + "checkpoint_interval": min(MIN_CHECKPOINT_INTERVAL, self.swap_interval), + }) + processes[idx].start() + + for process in processes: + if process is not None: + process.join() + # all the chunks in this iter are done + + # run saves frames to chk file, so this ensures that run is done and saved properly + for traj in self.trajectories: + traj.load_from_checkpoint() + assert traj.last_time_run() == target_time + + self.exchange(next_idx * self.swap_interval) + self.current_idx = next_idx + self.save() + self.finished = True + return self + + def exchange(self, time): + """ time is from 0 + """ + kB = presto.constants.BOLTZMANN_CONSTANT + + # make one pass from low to high T + for i in range(len(self.trajectories)-1): + j = i+1 + + E_i = self.trajectories[i].frames[-2].energy + E_j = self.trajectories[j].frames[-2].energy + T_i = self.trajectories[i].bath_scheduler(0) + T_j = self.trajectories[j].bath_scheduler(0) + b_i = 1 / (kB*T_i) + b_j = 1 / (kB*T_j) + + p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) + logger.info(f"E{i} & E{j}\tp={p}") + + if p > random.random(): + # or momenta scaling + v_i_scaling = np.sqrt(T_j/T_i) + v_j_scaling = np.sqrt(T_i/T_j) + + frame_i = self.trajectories[i].frames[-1] + frame_j = self.trajectories[j].frames[-1] + frame_i.velocities *= v_i_scaling + frame_j.velocities *= v_j_scaling + + self.trajectories[i].frames[-1] = frame_j + self.trajectories[j].frames[-1] = frame_i + + self.swaps.append({"time": time, "i": i, "j": j}) + logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") + + def report(self): + counts = np.zeros(shape=len(self.trajectories)) + #len of counts is no of temps + possible = self.current_idx * (len(self.trajectories) - 1) + + for swap in self.swaps: + counts[swap["i"]] += 1 + + text = f"Time: {self.current_idx * self.swap_interval} fs\n" + text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" + for i in range(len(self.trajectories) - 1): + text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" + + return text diff --git a/presto/replica_exchange.py b/presto/replica_exchange.py index 91d694c..2e1b3c5 100644 --- a/presto/replica_exchange.py +++ b/presto/replica_exchange.py @@ -89,6 +89,7 @@ def run(self): # we break the runs up into small chunks of size swap_interval # each trajectory is basically run in parallel for time swap_interval in each iter + # we make as many mp.Process objects as there are trajectories for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): next_idx = current_idx + 1 target_time = next_idx * self.swap_interval @@ -125,7 +126,8 @@ def exchange(self, time): """ time is from 0 """ kB = presto.constants.BOLTZMANN_CONSTANT - + + # make one pass from low to high T for i in range(len(self.trajectories)-1): j = i+1 diff --git a/setup.py b/setup.py index d31a9b8..b908cbe 100644 --- a/setup.py +++ b/setup.py @@ -1,27 +1,3 @@ import setuptools -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="presto-md", - packages=["presto", "presto.solvents"], - package_data={"presto.solvents": ["*"],}, - version="0.2.1", - author="Corin Wagen", - author_email="corin.wagen@gmail.com", - license="Apache 2.0", - description="explicit solvent molecular dynamics", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/cwagen/presto", -# packages=setuptools.find_packages(), - install_requires=["cctk", "tqdm", "h5py", "pyyaml", "matplotlib", "asciichartpy", "fasteners"], - classifiers=[ - "Programming Language :: Python :: 3", - "Development Status :: 3 - Alpha", - "License :: OSI Approved :: Apache Software License", - "Intended Audience :: Science/Research", - ], - python_requires='>=3.6', -) +setuptools.setup() From 4fd9aa13a8583ba55a28af68879cf0695d83a4be Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 26 Apr 2021 19:49:54 -0400 Subject: [PATCH 07/30] parallelized with mpi4py, pre-testing --- presto/partest/par_test.py | 29 ++++-- presto/partest/re_par.py | 208 ++++++++++++++++++++++--------------- presto/partest/run.py | 35 +++++++ 3 files changed, 182 insertions(+), 90 deletions(-) create mode 100644 presto/partest/run.py diff --git a/presto/partest/par_test.py b/presto/partest/par_test.py index cec9c10..cdb5f40 100644 --- a/presto/partest/par_test.py +++ b/presto/partest/par_test.py @@ -1,5 +1,11 @@ import numpy as np +from mpi4py import MPI +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + + class ParTest(object): """Testing how MPI4py works in classes @@ -9,16 +15,27 @@ def __init__(self, x, y): self.y = y def add(self): - from mpi4py import MPI - size = MPI.COMM_WORLD.Get_size() - rank = MPI.COMM_WORLD.Get_rank() - print(f"hello from process {rank} of {size}") + print(f"for process {rank}, self.x is at {id(self.x)}") if not rank: return self.x + self.y else: return 'abc' + def report(self, arg): + print("done") + + if __name__ == "__main__": - p = ParTest(1, 2) - print(p.add()) + # p = ParTest(1, 2) + # print("pre-addition") + # print(p.add()) + # p.report() + + sendbuf = float(rank) + # recvbuf = None + # if rank == 0: + # recvbuf = np.empty(size, dtype='f') + recvbuf = comm.gather(sendbuf, root=0) + print(f"sendbuf of process {rank}:{sendbuf}") + print(f"recvbuf of process {rank}:{recvbuf}") diff --git a/presto/partest/re_par.py b/presto/partest/re_par.py index 2e1b3c5..4b660cc 100644 --- a/presto/partest/re_par.py +++ b/presto/partest/re_par.py @@ -6,11 +6,14 @@ logger = logging.getLogger(__name__) +from mpi4py import MPI +size = MPI.COMM_WORLD.Get_size() +rank = MPI.COMM_WORLD.Get_rank() + MIN_CHECKPOINT_INTERVAL = 50 class ReplicaExchange(): - """ - Runs several trajectories and manages interconversions between them. + """Runs several trajectories and manages interconversions between them. Based on: http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf @@ -22,26 +25,32 @@ class ReplicaExchange(): checkpoint_filename (int): finished (bool): current_idx (int): + + Assumes there are ranks from 0 to len(trajectories) - 1 + """ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): - temps = np.zeros(shape=len(trajectories)) - for idx, traj in enumerate(trajectories): - assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" - assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" - assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" - assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" - assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" - - # sort by temp - self.trajectories = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) + if rank == 0: + # rank 0 does all the checking + for idx, traj in enumerate(trajectories): + assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" + assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" + assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" + assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" + assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + + self.swaps = list() + assert isinstance(swap_interval, (float, int)) + assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" + assert isinstance(checkpoint_filename, str) + + # these attributes are privately owned by all process + self.trajs = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) + self.temps = [traj.bath_scheduler(0) for traj in self.trajs] + self.traj = self.trajs[rank] self.stop_time = trajectories[0].stop_time - - self.swaps = list() - assert isinstance(swap_interval, (float, int)) - assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" self.swap_interval = swap_interval - assert isinstance(checkpoint_filename, str) self.checkpoint_filename = checkpoint_filename self.finished = False self.current_idx = 0 @@ -81,93 +90,124 @@ def load(self): def run(self): if self.finished: - logger.info(f"Replica exchange already finished!") + if rank == 0: + logger.info(f"From rank {rank}: Replica exchange already finished!") return self - processes = [None]*len(self.trajectories) start_idx = self.current_idx - # we break the runs up into small chunks of size swap_interval - # each trajectory is basically run in parallel for time swap_interval in each iter - # we make as many mp.Process objects as there are trajectories + # self.trajs is an array that everyone has privtely for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): next_idx = current_idx + 1 target_time = next_idx * self.swap_interval - for idx, traj in enumerate(self.trajectories): - # how long does each traj need to run for? - # the last iter may have time_remaining \neq swap_interval - time_remaining = max(0, target_time - traj.last_time_run()) - - if time_remaining: - processes[idx] = mp.Process(target=traj.run, kwargs={ - "time": self.swap_interval, - "checkpoint_interval": min(MIN_CHECKPOINT_INTERVAL, self.swap_interval), - }) - processes[idx].start() - - for process in processes: - if process is not None: - process.join() - # all the chunks in this iter are done - - # run saves frames to chk file, so this ensures that run is done and saved properly - for traj in self.trajectories: - traj.load_from_checkpoint() - assert traj.last_time_run() == target_time - - self.exchange(next_idx * self.swap_interval) - self.current_idx = next_idx - self.save() - self.finished = True - return self + time_remaining = max(0, target_time - self.trajs[rank].last_time_run()) + + if time_remaining: + self.traj.run(time=self.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, self.swap_interval)) + self.traj.load_from_checkpoint() + assert self.traj.last_time_run() == target_time + + self.exchange(next_idx * self.swap_interval) + # barrier at exchange + + self.current_idx = next_idx + self.save() + + # all done + self.finished = True + return self def exchange(self, time): """ time is from 0 """ - kB = presto.constants.BOLTZMANN_CONSTANT + # these two are only nonNone when rank == 0 + # indices of energies and frames are pegged: if we swap energies, swap frames too + # original version of code read energies from frames[-2] + # g_energies = comm.gather(self.traj.frames[-2].energy, root=0) + + # now, we read all properties from frames[-1] + g_frames = comm.gather(self.traj.frames[-1], root=0) - # make one pass from low to high T - for i in range(len(self.trajectories)-1): - j = i+1 + if rank == 0: + kB = presto.constants.BOLTZMANN_CONSTANT + + # make one pass from low to high T + for i in range(len(self.trajs) - 1): + j = i+1 + + E_i = g_frames[i].energy + E_j = g_frames[j].energy + b_i = 1 / (kB * self.temps[i]) + b_j = 1 / (kB * self.temps[j]) + + p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) + logger.info(f"E{i} & E{j}\tp={p}") + + if p > random.random(): + # or momenta scaling + v_i_scaling = np.sqrt(self.temps[j] / self.temps[i]) + v_j_scaling = np.sqrt(self.temps[i] / self.temps[j]) + + frame_i = g_frames[i] + frame_j = g_frames[j] + frame_i.velocities *= v_i_scaling + frame_j.velocities *= v_j_scaling + + g_frames[i] = frame_j + g_frames[j] = frame_i + + self.swaps.append({"time": time, "i": i, "j": j}) + logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") - E_i = self.trajectories[i].frames[-2].energy - E_j = self.trajectories[j].frames[-2].energy - T_i = self.trajectories[i].bath_scheduler(0) - T_j = self.trajectories[j].bath_scheduler(0) - b_i = 1 / (kB*T_i) - b_j = 1 / (kB*T_j) + # all together now: update own trajectory's last frame to g_frames[rank] + new_last_frame = comm.scatter(g_frames, root=0) + self.traj.frames[-1] = new_last_frame - p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) - logger.info(f"E{i} & E{j}\tp={p}") + def report(self): + if rank == 0: + counts = np.zeros(shape=len(self.trajs)) + #len of counts is no of temps + possible = self.current_idx * (len(self.trajs) - 1) + + for swap in self.swaps: + counts[swap["i"]] += 1 - if p > random.random(): - # or momenta scaling - v_i_scaling = np.sqrt(T_j/T_i) - v_j_scaling = np.sqrt(T_i/T_j) + text = f"Time: {self.current_idx * self.swap_interval} fs\n" + text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" + for i in range(len(self.trajs) - 1): + text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" - frame_i = self.trajectories[i].frames[-1] - frame_j = self.trajectories[j].frames[-1] - frame_i.velocities *= v_i_scaling - frame_j.velocities *= v_j_scaling + return text + return None - self.trajectories[i].frames[-1] = frame_j - self.trajectories[j].frames[-1] = frame_i - self.swaps.append({"time": time, "i": i, "j": j}) - logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") - def report(self): - counts = np.zeros(shape=len(self.trajectories)) - #len of counts is no of temps - possible = self.current_idx * (len(self.trajectories) - 1) +if __name__ == "__main__": + + # needs argv etc + + try: + if rank == 0: + trajs = [] + for temp in np.geomspace(300, 400, num=n_trajs): + name = f"{int(temp)}k" + + with open("template.yaml", 'r') as file : + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") + trajs.append(traj) - for swap in self.swaps: - counts[swap["i"]] += 1 + trajs = comm.bcast(trajs, root=0) + remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") + remd.run() - text = f"Time: {self.current_idx * self.swap_interval} fs\n" - text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" - for i in range(len(self.trajectories) - 1): - text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" + if rank == 0: + print(remd.report()) - return text + except Exception as e: + print(e) + sys.exit(1) diff --git a/presto/partest/run.py b/presto/partest/run.py new file mode 100644 index 0000000..15cee01 --- /dev/null +++ b/presto/partest/run.py @@ -0,0 +1,35 @@ +import logging, re, sys, os +logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') +import numpy as np +import presto + +logger = logging.getLogger(__name__) + +from mpi4py import MPI +size = MPI.COMM_WORLD.Get_size() +rank = MPI.COMM_WORLD.Get_rank() + +try: + if rank == 0: + trajs = [] + for temp in np.geomspace(300, 400, num=n_trajs): + name = f"{int(temp)}k" + + with open("template.yaml", 'r') as file : + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") + trajs.append(traj) + + trajs = comm.bcast(trajs, root=0) + remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") + remd.run() + + if rank == 0: + print(remd.report()) + +except Exception as e: + print(e) + sys.exit(1) From ae1658240d592836c51eb94be75a487986a8a038 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 30 Apr 2021 21:38:29 -0400 Subject: [PATCH 08/30] update parallel run script --- presto/__init__.py | 1 + presto/partest/re_par.py | 213 --------------------------------------- presto/partest/run.py | 18 ++-- 3 files changed, 13 insertions(+), 219 deletions(-) delete mode 100644 presto/partest/re_par.py diff --git a/presto/__init__.py b/presto/__init__.py index 8caa967..bf32286 100644 --- a/presto/__init__.py +++ b/presto/__init__.py @@ -7,6 +7,7 @@ import presto.analysis import presto.constraints import presto.replica_exchange +import presto.replica_exchange_par import presto.controller import presto.checks import presto.reporters diff --git a/presto/partest/re_par.py b/presto/partest/re_par.py deleted file mode 100644 index 4b660cc..0000000 --- a/presto/partest/re_par.py +++ /dev/null @@ -1,213 +0,0 @@ -import numpy as np -import math, copy, cctk, os, re, logging, time, yaml, random -import multiprocessing as mp - -import presto - -logger = logging.getLogger(__name__) - -from mpi4py import MPI -size = MPI.COMM_WORLD.Get_size() -rank = MPI.COMM_WORLD.Get_rank() - -MIN_CHECKPOINT_INTERVAL = 50 - -class ReplicaExchange(): - """Runs several trajectories and manages interconversions between them. - - Based on: - http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf - - Attributes: - stop_time (int): - swaps (list of dict): - swap_interval (int): - checkpoint_filename (int): - finished (bool): - current_idx (int): - - Assumes there are ranks from 0 to len(trajectories) - 1 - - """ - def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): - if rank == 0: - # rank 0 does all the checking - for idx, traj in enumerate(trajectories): - assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" - assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" - assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" - assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" - assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" - - self.swaps = list() - assert isinstance(swap_interval, (float, int)) - assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" - assert isinstance(checkpoint_filename, str) - - # these attributes are privately owned by all process - self.trajs = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) - self.temps = [traj.bath_scheduler(0) for traj in self.trajs] - self.traj = self.trajs[rank] - self.stop_time = trajectories[0].stop_time - self.swap_interval = swap_interval - - self.checkpoint_filename = checkpoint_filename - self.finished = False - self.current_idx = 0 - - self.load() - - def __str__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" - - def __repr__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" - - def save(self): - file_dict = { - "stop_time": self.stop_time, - "swap_interval": self.swap_interval, - "swaps": self.swaps, - "finished": self.finished, - "current_idx": self.current_idx, - } - with open(self.checkpoint_filename, "w+") as f: - yaml.dump(file_dict, f) - logger.info(f"Saving ReplicaExchange to {self.checkpoint_filename}.") - return self - - def load(self): - if os.path.exists(self.checkpoint_filename): - with open(self.checkpoint_filename, "r+") as f: - file_dict = yaml.safe_load(f) - self.stop_time = file_dict["stop_time"] - self.swap_interval = file_dict["swap_interval"] - self.swaps = file_dict["swaps"] - self.finished = file_dict["finished"] - self.current_idx = file_dict["current_idx"] - logger.info(f"Loaded ReplicaExchange from {self.checkpoint_filename}.") - return self - - def run(self): - if self.finished: - if rank == 0: - logger.info(f"From rank {rank}: Replica exchange already finished!") - return self - - start_idx = self.current_idx - - # self.trajs is an array that everyone has privtely - for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): - next_idx = current_idx + 1 - target_time = next_idx * self.swap_interval - - time_remaining = max(0, target_time - self.trajs[rank].last_time_run()) - - if time_remaining: - self.traj.run(time=self.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, self.swap_interval)) - self.traj.load_from_checkpoint() - assert self.traj.last_time_run() == target_time - - self.exchange(next_idx * self.swap_interval) - # barrier at exchange - - self.current_idx = next_idx - self.save() - - # all done - self.finished = True - return self - - def exchange(self, time): - """ time is from 0 - """ - # these two are only nonNone when rank == 0 - # indices of energies and frames are pegged: if we swap energies, swap frames too - # original version of code read energies from frames[-2] - # g_energies = comm.gather(self.traj.frames[-2].energy, root=0) - - # now, we read all properties from frames[-1] - g_frames = comm.gather(self.traj.frames[-1], root=0) - - if rank == 0: - kB = presto.constants.BOLTZMANN_CONSTANT - - # make one pass from low to high T - for i in range(len(self.trajs) - 1): - j = i+1 - - E_i = g_frames[i].energy - E_j = g_frames[j].energy - b_i = 1 / (kB * self.temps[i]) - b_j = 1 / (kB * self.temps[j]) - - p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) - logger.info(f"E{i} & E{j}\tp={p}") - - if p > random.random(): - # or momenta scaling - v_i_scaling = np.sqrt(self.temps[j] / self.temps[i]) - v_j_scaling = np.sqrt(self.temps[i] / self.temps[j]) - - frame_i = g_frames[i] - frame_j = g_frames[j] - frame_i.velocities *= v_i_scaling - frame_j.velocities *= v_j_scaling - - g_frames[i] = frame_j - g_frames[j] = frame_i - - self.swaps.append({"time": time, "i": i, "j": j}) - logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") - - # all together now: update own trajectory's last frame to g_frames[rank] - new_last_frame = comm.scatter(g_frames, root=0) - self.traj.frames[-1] = new_last_frame - - def report(self): - if rank == 0: - counts = np.zeros(shape=len(self.trajs)) - #len of counts is no of temps - possible = self.current_idx * (len(self.trajs) - 1) - - for swap in self.swaps: - counts[swap["i"]] += 1 - - text = f"Time: {self.current_idx * self.swap_interval} fs\n" - text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" - for i in range(len(self.trajs) - 1): - text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" - - return text - return None - - - -if __name__ == "__main__": - - # needs argv etc - - try: - if rank == 0: - trajs = [] - for temp in np.geomspace(300, 400, num=n_trajs): - name = f"{int(temp)}k" - - with open("template.yaml", 'r') as file : - filedata = file.read() - filedata = filedata.replace("", f"{temp:.2f}") - with open(f"{name}.yaml", 'w') as file: - file.write(filedata) - traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") - trajs.append(traj) - - trajs = comm.bcast(trajs, root=0) - remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") - remd.run() - - if rank == 0: - print(remd.report()) - - except Exception as e: - print(e) - sys.exit(1) diff --git a/presto/partest/run.py b/presto/partest/run.py index 15cee01..c8194bc 100644 --- a/presto/partest/run.py +++ b/presto/partest/run.py @@ -2,16 +2,22 @@ logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') import numpy as np import presto +import dill logger = logging.getLogger(__name__) from mpi4py import MPI -size = MPI.COMM_WORLD.Get_size() -rank = MPI.COMM_WORLD.Get_rank() +MPI.pickle.__init__(dill.dumps, dill.loads) +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + +n_trajs = 2 try: + all_trajs = [] + if rank == 0: - trajs = [] for temp in np.geomspace(300, 400, num=n_trajs): name = f"{int(temp)}k" @@ -21,10 +27,10 @@ with open(f"{name}.yaml", 'w') as file: file.write(filedata) traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") - trajs.append(traj) + all_trajs.append(traj) - trajs = comm.bcast(trajs, root=0) - remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") + trajs = comm.bcast(all_trajs, root=0) + remd = presto.replica_exchange_par.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") remd.run() if rank == 0: From e1f33f90d3db08c6e2e3d5085cd78c12d95bec6a Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 31 May 2021 00:15:21 -0400 Subject: [PATCH 09/30] added partest --- presto/#trajectory.py# | 682 ++++++++++++++++++++++++++ presto/.#trajectory.py | 1 + presto/config.py.rej | 30 ++ presto/partest/#remd.log# | 21 + presto/partest/.#pseudo | 1 + presto/partest/dce.xyz | 10 + presto/partest/dce_remd.sh | 16 + presto/partest/old/300k.yaml | 28 ++ presto/partest/old/400k.yaml | 28 ++ presto/partest/pseudo | 15 + presto/partest/run.py | 30 +- presto/partest/serial/dce.xyz | 10 + presto/partest/serial/dce_remd.sh | 18 + presto/partest/serial/run.py | 37 ++ presto/partest/serial/template.yaml | 26 + presto/partest/template.yaml | 26 + presto/partest/test/notes | 2 + presto/partest/{ => test}/par_test.py | 19 +- presto/partest/test/run.py | 17 + presto/replica_exchange_par.py | 193 ++++++++ 20 files changed, 1185 insertions(+), 25 deletions(-) create mode 100644 presto/#trajectory.py# create mode 120000 presto/.#trajectory.py create mode 100644 presto/config.py.rej create mode 100644 presto/partest/#remd.log# create mode 120000 presto/partest/.#pseudo create mode 100644 presto/partest/dce.xyz create mode 100644 presto/partest/dce_remd.sh create mode 100644 presto/partest/old/300k.yaml create mode 100644 presto/partest/old/400k.yaml create mode 100644 presto/partest/pseudo create mode 100644 presto/partest/serial/dce.xyz create mode 100644 presto/partest/serial/dce_remd.sh create mode 100644 presto/partest/serial/run.py create mode 100644 presto/partest/serial/template.yaml create mode 100644 presto/partest/template.yaml create mode 100644 presto/partest/test/notes rename presto/partest/{ => test}/par_test.py (67%) create mode 100644 presto/partest/test/run.py create mode 100644 presto/replica_exchange_par.py diff --git a/presto/#trajectory.py# b/presto/#trajectory.py# new file mode 100644 index 0000000..e900a5a --- /dev/null +++ b/presto/#trajectory.py# @@ -0,0 +1,682 @@ +import numpy as np +import math, copy, cctk, os, re, logging, time +import fasteners + +import h5py +import presto + +logger = logging.getLogger(__name__) + +class Trajectory(): + """ + + Attributes: + timestep (float): in fs + frames (list of presto.Frame): + stop_time (float): how long to run for + + high_atoms (np.ndarray): to calculate at high level of theory, list of 1-indexed atom numbers + active_atoms (np.ndarray): non-frozen atoms, list of 1-indexed atom numbers + + atomic_numbers (cctk.OneIndexedArray): list of atomic numbers + masses (cctk.OneIndexedArray): list of masses + + calculator (presto.calculators.Calculator): + integrator (presto.integrators.Integrator): + reporters (list of presto.reporters.Reporter): + checks (list of presto.checks.Check): + + finished (bool): + forwards (bool): + + checkpoint_filename (str): + lock (fasteners.InterProcessLock): lock object + save_interval (int): how many frames to save + """ + + def __init__( + self, + calculator=None, + integrator=None, + reporters=list(), + checks=list(), + timestep=None, + atomic_numbers=None, + high_atoms=None, + forwards=True, + checkpoint_filename=None, + stop_time=None, + save_interval=1, + **kwargs + ): + + # do this first! + if timestep is not None: + assert timestep > 0, "can't have timestep ≤ 0!" + self.timestep = float(timestep) + + if checkpoint_filename is not None: + assert isinstance(checkpoint_filename, str), "need string for file" + self.checkpoint_filename = checkpoint_filename + + self.lock = None + self.initialize_lock() + self.frames = list() + + if self.has_checkpoint(): + if "load_frames" in kwargs: + self.load_from_checkpoint(kwargs["load_frames"]) + else: + self.load_from_checkpoint(slice(-1,None,None)) + + if calculator is not None: + assert isinstance(calculator, presto.calculators.Calculator), "need a valid calculator!" + self.calculator = calculator + + if integrator is not None: + assert isinstance(integrator, presto.integrators.Integrator), "need a valid integrator!" + self.integrator = integrator + + assert all([isinstance(c, presto.checks.Check) for c in checks]) + self.checks = checks + + assert all([isinstance(r, presto.reporters.Reporter) for r in reporters]) + self.reporters = reporters + + if atomic_numbers is not None: + assert isinstance(atomic_numbers, cctk.OneIndexedArray), "atomic numbers must be cctk 1-indexed array!" + self.atomic_numbers = atomic_numbers + elif not hasattr(self, "atomic_numbers"): + raise ValueError("no atomic numbers specified") + + if not hasattr(self, "finished"): + self.finished = False + + if high_atoms is not None: + assert isinstance(high_atoms, np.ndarray), "high_atoms must be np.ndarray!" + self.high_atoms = high_atoms + else: + self.high_atoms = None + + active_atoms = None + if "active_atoms" in kwargs: + active_atoms = kwargs["active_atoms"] + assert isinstance(active_atoms, np.ndarray), "active_atoms must be np.ndarray!" + self.active_atoms = active_atoms + elif "inactive_atoms" in kwargs: + self.set_inactive_atoms(kwargs["inactive_atoms"]) + else: + # assume all atoms are active + self.set_inactive_atoms(np.ndarray([])) + + if not hasattr(self, "masses"): + self.masses = cctk.OneIndexedArray([float(cctk.helper_functions.draw_isotopologue(z)) for z in atomic_numbers]) + + if not hasattr(self, "frames"): + self.frames = [] + + if forwards is not None: + assert isinstance(forwards, bool), "forwards must be bool" + self.forwards = forwards + elif not hasattr(self, "forwards"): + self.forwards = True + + if not hasattr(self, "stop_time"): + assert (isinstance(stop_time, float)) or (isinstance(stop_time, int)), "stop_time needs to be numeric!" + assert stop_time > 0, "stop_time needs to be positive!" + self.stop_time = stop_time + + assert isinstance(save_interval, int), "save_interval needs to be positive" + assert save_interval > 0, "save_interval needs to be positive" + self.save_interval = save_interval + + def __str__(self): + return f"Trajectory({len(self.frames)} frames)" + + def __repr__(self): + return f"Trajectory({len(self.frames)} frames)" + + def set_inactive_atoms(self, inactive_atoms): + """ + Since sometimes it's easier to specify the inactive atoms than the inactive atoms, this method updates ``self.active_atoms`` with the complement of ``inactive_atoms``. + """ + assert isinstance(inactive_atoms, (list, np.ndarray)), "Need list of atoms!" + active_atoms = list(range(1, len(self.atomic_numbers)+1)) + if len(inactive_atoms): + for atom in inactive_atoms: + active_atoms.remove(atom) + active_atoms = np.array(active_atoms) + self.active_atoms = active_atoms + + def run(self, checkpoint_interval=10, keep_all=False, time=None, **kwargs): + """ + Run the trajectory. + + Args: + checkpoint_interval (int): interval at which to save (in frames, not fs) + keep_all (bool): whether or not to keep all frames in memory + time (float): total time to run for -- default is None, implying trajectory should be run until finished + """ + if self.checkpoint_filename is None: + if "checkpoint_filename" in kwargs: + self.checkpoint_filename = kwargs["checkpoint_filename"] + else: + raise ValueError("no checkpoint filename given!") + + self.load_from_checkpoint(slice(-1, None, None)) + assert len(self.frames) == 1, "Wrong number of frames - do you need to call trajectory.initialize()?" + + if self.finished: + logger.info("Trajectory already finished!") + else: + # initialize runtime controller + controller = presto.controller.Controller(self, **kwargs) + try: + controller.run(checkpoint_interval=checkpoint_interval, runtime=time) + except Exception as e: + raise ValueError(f"Trajectory run terminated prematurely due to error: {e}") + + if keep_all: + self.load_from_checkpoint() + assert self.frames[0].time == 0, "missing first frame despite keep_all being True!" + + return self + + def initialize(self): + """ + Adds first frame with randomly-initialized velocities. Should call ``self.save()``. + """ + pass + + def has_checkpoint(self): + if self.checkpoint_filename is None: + return False + if os.path.exists(self.checkpoint_filename): + return True + else: + return False + + def load_from_checkpoint(self, frames=slice(None)): + """ + Loads frames from ``self.checkpoint_filename``. + + Args: + frames (Slice object): if not all frames are desired, a Slice object can be passed + + Returns: + nothing + """ + if not self.has_checkpoint(): + return # nothing to load! + + self.initialize_lock() + self.lock.acquire() + + with h5py.File(self.checkpoint_filename, "r") as h5: + atomic_numbers = h5.attrs["atomic_numbers"] + self.atomic_numbers = cctk.OneIndexedArray(atomic_numbers) + + masses = h5.attrs["masses"] + self.masses = cctk.OneIndexedArray(masses) + + self.finished = h5.attrs['finished'] + self.forwards = h5.attrs['forwards'] + + self.frames = [] + if len(h5.get("all_energies")): + all_energies = h5.get("all_energies")[frames] + all_positions = h5.get("all_positions")[frames] + all_velocities= h5.get("all_velocities")[frames] + all_accels = h5.get("all_accelerations")[frames] + temperatures = h5.get("bath_temperatures")[frames] + + # v0.2.2 - provisionally removing this +# all_times = None +# try: + all_times = h5.get("all_times")[frames] +# except Exception as e: +# all_times = np.arange(0, self.timestep*len(all_energies)*self.save_interval, self.timestep*self.save_interval) +# # this was added recently, so may be some backwards compatibility issues. +# pass + + if isinstance(all_energies, np.ndarray): + assert len(all_positions) == len(all_energies) + assert len(all_velocities) == len(all_energies) + assert len(all_accels) == len(all_energies) + assert len(all_times) == len(all_energies) + + for i, t in enumerate(all_times): + self.frames.append(presto.frame.Frame( + self, + all_positions[i].view(cctk.OneIndexedArray), + all_velocities[i].view(cctk.OneIndexedArray), + all_accels[i].view(cctk.OneIndexedArray), + energy=all_energies[i], + bath_temperature=temperatures[i], + time=all_times[i], + )) + + logger.info(f"Loaded trajectory from checkpoint file {self.checkpoint_filename} -- {len(self.frames)} frames read.") + + self.lock.release() + return + + def num_frames(self): + if self.has_checkpoint(): + num = 0 + with h5py.File(self.checkpoint_filename, "r") as h5: + num = len(h5.get("all_energies")) + return num + else: + return len(self.frames) + + def save(self, keep_all=False): + if self.checkpoint_filename is None: + raise ValueError("can't save without checkpoint filename") + self.initialize_lock() + self.lock.acquire() + + last_run_time = self.frames[-1].time + if self.has_checkpoint(): + with h5py.File(self.checkpoint_filename, "r+") as h5: + n_atoms = len(self.atomic_numbers) + h5.attrs['finished'] = self.finished + + all_energies = h5.get("all_energies") + old_n_frames = len(all_energies) + # v0.2.2 - provisionally removing this +# if "all_times" not in h5: +# # time is a new column, so old checkpoints may not have it. +# old_times = np.arange(0, self.timestep, self.timestep*old_n_frames) +# h5.create_dataset("all_times", data=old_times, maxshape=(None,), compression="gzip", compression_opts=9) + + all_times = h5.get("all_times") + last_saved_time = all_times[-1] + new_n_frames = int((last_run_time - last_saved_time) / (self.timestep*self.save_interval)) + now_n_frames = new_n_frames + old_n_frames + + if new_n_frames == 0: + self.lock.release() + return + assert new_n_frames > 0, f"we can't write negative frames ({old_n_frames} previously in {self.checkpoint_filename}, but now only {now_n_frames})" + + frames_to_add = list() + # there is probably a more elegant way to handle this, but this seems robust at least + for frame in self.frames[-(new_n_frames*self.save_interval)-1:]: + if frame.time <= last_saved_time: + continue + if frame.time % (self.timestep * self.save_interval) == 0: + frames_to_add.append(frame) + assert new_n_frames == len(frames_to_add), "pernicious math error in frame numbers!" + + new_times = np.asarray([frame.time for frame in frames_to_add]) + all_times.resize((now_n_frames,)) + all_times[-new_n_frames:] = new_times + + all_energies = h5.get("all_energies") + new_energies = np.asarray([frame.energy for frame in frames_to_add]) + all_energies.resize((now_n_frames,)) + all_energies[-new_n_frames:] = new_energies + + new_positions = np.stack([frame.positions for frame in frames_to_add]) + all_positions = h5.get("all_positions") + all_positions.resize((now_n_frames,n_atoms,3)) + all_positions[-new_n_frames:] = new_positions + + new_velocities= np.stack([frame.velocities for frame in frames_to_add]) + all_velocities = h5.get("all_velocities") + all_velocities.resize((now_n_frames,n_atoms,3)) + all_velocities[-new_n_frames:] = new_velocities + + new_accels = np.stack([frame.accelerations for frame in frames_to_add]) + all_accels = h5.get("all_accelerations") + all_accels.resize((now_n_frames,n_atoms,3)) + all_accels[-new_n_frames:] = new_accels + + new_temps = np.stack([frame.bath_temperature for frame in frames_to_add]) + all_temps = h5.get("bath_temperatures") + all_temps.resize((now_n_frames,)) + all_temps[-new_n_frames:] = new_temps + + logger.info(f"Saving to existing checkpoint file {self.checkpoint_filename} ({new_n_frames} frames added; {last_run_time:.1f}/{self.stop_time:.1f} fs run in total)") + else: + with h5py.File(self.checkpoint_filename, "w") as h5: + h5.attrs['atomic_numbers'] = self.atomic_numbers.view(np.ndarray) + h5.attrs['masses'] = self.masses.view(np.ndarray) + h5.attrs['finished'] = self.finished + h5.attrs['forwards'] = self.forwards + + n_atoms = len(self.atomic_numbers) + + frames_to_add = list() + for frame in self.frames: + if frame.time % (self.timestep * self.save_interval) == 0: + frames_to_add.append(frame) + + energies = np.asarray([frame.energy for frame in frames_to_add]) + h5.create_dataset("all_energies", data=energies, maxshape=(None,), compression="gzip", compression_opts=9) + + times = np.asarray([frame.time for frame in frames_to_add]) + h5.create_dataset("all_times", data=times, maxshape=(None,), compression="gzip", compression_opts=9) + + all_positions = np.stack([frame.positions for frame in frames_to_add]) + h5.create_dataset("all_positions", data=all_positions, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) + + all_velocities = np.stack([frame.velocities for frame in frames_to_add]) + h5.create_dataset("all_velocities", data=all_velocities, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) + + all_accels= np.stack([frame.accelerations for frame in frames_to_add]) + h5.create_dataset("all_accelerations", data=all_accels, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) + + temps = np.asarray([frame.bath_temperature for frame in frames_to_add]) + h5.create_dataset("bath_temperatures", data=temps, maxshape=(None,), compression="gzip", compression_opts=9) + + logger.info(f"Saving to new checkpoint file {self.checkpoint_filename} ({len(frames_to_add)} frames added; {last_run_time:.1f}/{self.stop_time:.1f} fs run in total)") + self.lock.release() + + # lower memory usage + if keep_all: + pass + else: + self.frames = [self.frames[-1]] + + def write_movie(self, filename, solvents="all", idxs=None): + """ + Write a movie to a trajectory file. Detects trajectory type automatically from file extension. + + Supported file formats: ``.pdb``, ``.mol2``, ``.xyz``/``.molden`` + + Args: + filename (str): path where movie will be written + solvents (int): number of solvent molecules to include (closest included first). can also be ``none`` or ``all``. + idxs (list of int): indices of atoms to include. will override ``solvents`` if present. + """ + + # what do we make a movie of? + if idxs is not None: + assert isinstance(idxs, list), "idxs must be list of indices or ``None``!" + else: + if isinstance(solvents, str): + if solvents == "high": + idxs = self.high_atoms + elif solvents == "all": + idxs = None + else: + raise ValueError(f"unknown solvents keyword {solvents} -- must be 'high' or 'all'") + elif isinstance(solvents, int): + molecule = self.frames[0].molecule().assign_connectivity() + idxs = molecule.limit_solvent_shell(num_solvents=solvents, return_idxs=True) + else: + raise ValueError("``solvents`` must be int, 'high', or 'all'!") + + ensemble = self.as_ensemble(idxs) + logger.info("Writing trajectory to {filename}") + if re.search("pdb$", filename): + cctk.PDBFile.write_ensemble_to_trajectory(filename, ensemble) + elif re.search("mol2$", filename): + #### connectivity matters + ensemble.assign_connectivity() + cctk.MOL2File.write_ensemble_to_file(filename, ensemble) + elif re.search("molden$", filename) or re.search("xyz$", filename): + cctk.XYZFile.write_ensemble_to_file(filename, ensemble) + else: + raise ValueError(f"error writing {filename}: this filetype isn't currently supported!") + + def as_ensemble(self, idxs=None): + ensemble = cctk.ConformationalEnsemble() + for frame in self.frames[:-1]: + ensemble.add_molecule(frame.molecule(idxs), {"bath_temperature": frame.bath_temperature, "energy": frame.energy}) + return ensemble + + @classmethod + def new_from_checkpoint(cls, checkpoint, frame): + """ + Creates new trajectory from the given checkpoint file. + + Args: + checkpoint (str): path to checkpoint file + frame (int): the index of the desired frame + + Returns: + new ``Trajectory`` object + """ + assert isinstance(frame, int), "need an integer frame number" + + new_traj = cls(checkpoint_filename=checkpoint) + new_traj.load_from_checkpoint(idxs=frame) + + assert len(new_traj.frames) == 1, "got too many frames!" + return new_traj + + def initialize_lock(self): + """ + Create hidden lockfile to accompany ``.chk`` file. + """ + if self.checkpoint_filename is None: + return + + if self.lock is None: + lockfile = None + if "/" in self.checkpoint_filename: + lockfile = f"{self.checkpoint_filename}.lock"[::-1].replace("/", "./", 1)[::-1] + else: + lockfile = f".{self.checkpoint_filename}.lock" + self.lock = fasteners.InterProcessLock(lockfile) + + def last_time_run(self): + """ Get last finished time """ + return self.frames[-1].time + +class ReactionTrajectory(Trajectory): + """ + Attributes: + termination_function (function): detects if first or last Frame has reached product/SM or should otherwise be halted. + takes ``Frame`` argument as option and returns ``True``/``False``. + optionally, can return 1 for forward and 2 for reverse (to differentiate recrossing from productive). + time_after_finished (float/int): how long (in fs) to continue propagation after termination conditions reached + """ + + @classmethod + def new_from_checkpoint(self): + pass + + def __init__(self, termination_function=None, time_after_finished=100, **kwargs): + super().__init__(**kwargs) + + assert isinstance(time_after_finished, (int, float)), "time_after_finished must be numeric" + self.time_after_finished = time_after_finished + self.elapsed_since_finished = 0 + + assert hasattr(termination_function, "__call__"), "termination_function must be a function!" + self.termination_function = termination_function + + def __str__(self): + return f"ReactionTrajectory({len(self.frames)} frames)" + + def __repr__(self): + return f"ReactionTrajectory({len(self.frames)} frames)" + + def initialize(self, frame=None, positions=None, velocities=None, accelerations=None, bath_temp=None, new_velocities=None, **kwargs): + """ + Generates initial frame object for reaction trajectory. Initializes any non-zero velocities. + Velocities are taken from the Maxwell–Boltzmann distribution for the given temperature. + + Can pass either a frame object, or the relevant attributes (frame gets precedence). + + Args: + frame (presto.frame.Frame): equilibrated frame + new_velocities (cctk.OneIndexedArray): array of velocities to add to equilibrated frame (for previously-frozen atoms) + velocities, accelerations, positions (cctk.OneIndexedArray): values from frame (instead of frame object) + bath_temperature (float): + + Returns: + frame + """ + logger.info("Initializing new reaction trajectory...") + if self.has_checkpoint(): + self.load_from_checkpoint(slice(-1,None,None)) + return + + if frame is not None: + assert isinstance(frame, presto.frame.Frame), "need a valid frame" + + positions = frame.positions + velocities = frame.velocities + accelerations = frame.accelerations + bath_temp = frame.bath_temperature + + else: + assert positions is not None, "no Frame supplied, need positions" + assert velocities is not None, "no Frame supplied, need velocities" + assert accelerations is not None, "no Frame supplied, need accelerations" + assert bath_temp is not None, "no Frame supplied, need bath temperature" + + assert isinstance(positions, cctk.OneIndexedArray) + assert isinstance(velocities, cctk.OneIndexedArray) + assert isinstance(accelerations, cctk.OneIndexedArray) + assert isinstance(bath_temp, (float, int, np.integer)) + + new_frame = presto.frame.Frame(self, positions, velocities, accelerations, bath_temperature=bath_temp, time=0.0) + + if new_velocities is None: + random_gaussian = np.random.normal(size=positions.shape).view(cctk.OneIndexedArray) + random_gaussian[new_frame.active_mask()] = 0 + new_velocities = random_gaussian * np.sqrt(bath_temp * presto.constants.BOLTZMANN_CONSTANT / self.masses.reshape(-1,1)) + + new_frame.velocities += new_velocities.view(cctk.OneIndexedArray) + + self.frames = [new_frame] + self.save() + +class EquilibrationTrajectory(Trajectory): + """ + Attributes: + bath_scheduler (function): takes current time and returns target temperature + alternatively, pass a number if you want a constant-temperature bath + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + bath_scheduler = kwargs.get("bath_scheduler") + + if hasattr(bath_scheduler, "__call__"): + self.bath_scheduler = bath_scheduler + elif isinstance(bath_scheduler, (int, float)): + def sched(time): + return bath_scheduler + + self.bath_scheduler = sched + else: + raise ValueError(f"unknown type {type(bath_scheduler)} for bath_scheduler - want either a function or a number!") + + def __str__(self): + return f"EquilibrationTrajectory({len(self.frames)} frames)" + + def __repr__(self): + return f"EquilibrationTrajectory({len(self.frames)} frames)" + + def initialize(self, positions, velocities=None, accelerations=None, **kwargs): + """ + Generates initial frame object for initialization trajectory. + Velocities are taken from the Maxwell–Boltzmann distribution for the given temperature. + + Args: + positions (cctk.OneIndexedArray): starting positions + velocities (cctk.OneIndexedArray): starting velocities, optional. + accelerations (cctk.OneIndexedArray): starting accelerations, optional. + + Returns: + frame + """ + logger.info("Initializing new equilibration trajectory...") + if self.has_checkpoint(): + self.load_from_checkpoint(slice(-1,None,None)) + assert len(self.frames) == 1, "didn't load frames properly!" + return + + assert isinstance(positions, cctk.OneIndexedArray), "positions must be a one-indexed array!" + + # determine active atoms + inactive_mask = np.ones(shape=len(positions)).view(cctk.OneIndexedArray) + inactive_mask[self.active_atoms] = 0 + inactive_mask = inactive_mask.astype(bool) + + if velocities is None: + # add random velocity to everything + sigma = np.sqrt(self.bath_scheduler(0) * presto.constants.BOLTZMANN_CONSTANT / self.masses.reshape(-1,1)) + velocities = np.random.normal(scale=sigma, size=positions.shape).view(cctk.OneIndexedArray) + velocities[inactive_mask] = 0 + + # subtract out center-of-mass translational motion + com_translation = np.sum(self.masses.reshape(-1,1) * velocities, axis=0) + correction_tran = np.tile(com_translation / np.sum(self.masses[self.active_atoms]), (len(velocities),1)) + correction_tran[inactive_mask] = 0 + velocities = velocities - correction_tran + com_translation = np.sum(self.masses.reshape(-1,1) * velocities, axis=0) + assert np.linalg.norm(np.sum(self.masses.reshape(-1,1) * velocities, axis=0)) < 0.0001, "didn't remove COM translation well enough!" + + velocities = velocities.view(cctk.OneIndexedArray) + else: + assert isinstance(velocities, cctk.OneIndexedArray) + velocities[inactive_mask] = 0 + + if accelerations is None: + accelerations = np.zeros_like(positions).view(cctk.OneIndexedArray) + else: + assert isinstance(accelerations, cctk.OneIndexedArray) + accelerations[inactive_mask] = 0 + + self.frames = [presto.frame.Frame(self, positions, velocities, accelerations, bath_temperature=self.bath_scheduler(0), time=0.0)] + self.save() + +def join(traj1, traj2): + """ + Join two reaction trajectories together -- one forward and one reverse! + Returns a single reaction trajectory. + + Args: + traj1 (presto.ReactionTrajectory): forward trajectory + traj2 (presto.ReactionTrajectory): reverse trajectory + + Returns: + combined ``ReactionTrajectory`` + """ + logger.info("Joining forward and reverse reaction trajectories....") + assert isinstance(traj1, ReactionTrajectory), "Need a ReactionTrajectory" + assert isinstance(traj2, ReactionTrajectory), "Need a ReactionTrajectory" + + assert traj1.forwards == True, "First trajectory must be forwards!" + assert traj2.forwards == False, "Second trajectory must be reverse!" + + assert traj1.finished, "First trajectory must be finished!" + assert traj2.finished, "Second trajectory must be finished!" + + assert np.array_equal(traj1.frames[0].positions, traj2.frames[0].positions), "Link positions must be same!" + assert np.array_equal(traj1.frames[0].velocities, traj2.frames[0].velocities), "Link velocities must be same!" + assert np.array_equal(traj1.frames[0].accelerations, traj2.frames[0].accelerations), "Link accelerations must be same!" + + new_traj = ReactionTrajectory( + timestep = traj1.timestep, + atomic_numbers = traj1.atomic_numbers, + high_atoms = traj1.high_atoms, + active_atoms = traj1.active_atoms, + calculator = traj1.calculator, + integrator = traj1.integrator, + termination_function = traj1.termination_function, + stop_time = traj1.stop_time, + forwards = True, + ) + + f_frames = copy.deepcopy(traj1.frames) + r_frames = copy.deepcopy(traj2.frames) + r_frames.reverse() + + new_traj.frames = r_frames + f_frames[1:] # don't double-count middle frame + + if traj1.finished == 2: + #### if the first traj finished with the reverse condition, reverse order + new_traj.frames = new_traj.frames[::-1] + + return new_traj + diff --git a/presto/.#trajectory.py b/presto/.#trajectory.py new file mode 120000 index 0000000..084e1ce --- /dev/null +++ b/presto/.#trajectory.py @@ -0,0 +1 @@ +mhs65@grace2.grace.hpc.yale.internal.10549:1612467822 \ No newline at end of file diff --git a/presto/config.py.rej b/presto/config.py.rej new file mode 100644 index 0000000..c593a39 --- /dev/null +++ b/presto/config.py.rej @@ -0,0 +1,30 @@ +diff a/presto/config.py b/presto/config.py (rejected hunks) +@@ -237,23 +237,18 @@ def build_bath_scheduler(settings): + + delta = settings["start_temp"] - settings["target_temp"] + +- def sched(time): +- if time > settings["target_time"]: +- return settings["target_temp"] +- else: +- return settings["target_temp"] + delta * (1 - time / settings["target_time"]) ++ if time > settings["target_time"]: ++ return settings["target_temp"] ++ else: ++ return settings["target_temp"] + delta * (1 - time / settings["target_time"]) + +- return sched + + elif settings["type"].lower() == "constant": + assert "target_temp" in settings, "Need `target_temp` for this bath scheduler!" + assert isinstance(settings["target_temp"], (float, int)), "`target_temp` must be numeric!" + assert settings["target_temp"] > 0, "`target_temp` must be positive!" + +- def sched(time): +- return settings["target_temp"] +- +- return sched ++ return settings["target_temp"] + + else: + raise ValueError(f"Unknown bath scheduler type {settings['type']}! Allowed options are `linear` or `constant`.") diff --git a/presto/partest/#remd.log# b/presto/partest/#remd.log# new file mode 100644 index 0000000..f576f50 --- /dev/null +++ b/presto/partest/#remd.log# @@ -0,0 +1,21 @@ +05-30 21:38 presto.config Loaded configuration data from /home/mhs65/.config/presto/presto.config. +05-30 21:38 presto.trajectory Initializing new equilibration trajectory... +05-30 21:38 presto.trajectory Saving to new checkpoint file 300k.chk (1 frames added; 0.0/250.0 fs run in total) +05-30 21:38 presto.trajectory Initializing new equilibration trajectory... +05-30 21:38 presto.trajectory Saving to new checkpoint file 400k.chk (1 frames added; 0.0/250.0 fs run in total) +05-30 21:38 presto.trajectory Loaded trajectory from checkpoint file 300k.chk -- 1 frames read. +05-30 21:38 presto.controller Trajectory will run 50 frames (current time = 0.0 fs, end time = 50.0 fs) +05-30 21:38 presto.controller Run initiated ok - frame 00001 completed in 0.19 s. +05-30 21:38 presto.controller Run initiated ok - frame 00002 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00003 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00004 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00005 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00006 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00007 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00008 completed in 0.04 s. +05-30 21:38 presto.controller Run initiated ok - frame 00009 completed in 0.04 s. +05-30 21:38 presto.trajectory Saving to existing checkpoint file 300k.chk (50 frames added; 50.0/250.0 fs run in total) +05-30 21:38 presto.controller Trajectory done running with 51 frames. +05-30 21:38 presto.trajectory Loaded trajectory from checkpoint file 300k.chk -- 51 frames read. +05-30 21:38 presto.replica_exchange_par gathered frames +05-30 21:38 presto.replica_exchange_par E_i is -15.406513014878293 diff --git a/presto/partest/.#pseudo b/presto/partest/.#pseudo new file mode 120000 index 0000000..084e1ce --- /dev/null +++ b/presto/partest/.#pseudo @@ -0,0 +1 @@ +mhs65@grace2.grace.hpc.yale.internal.10549:1612467822 \ No newline at end of file diff --git a/presto/partest/dce.xyz b/presto/partest/dce.xyz new file mode 100644 index 0000000..6643077 --- /dev/null +++ b/presto/partest/dce.xyz @@ -0,0 +1,10 @@ +8 +C2H4Cl2 +C -1.259345218 0.000000000 -1.676453798 +H -0.376267218 -0.509845000 -2.075709798 +H -2.142423218 -0.509845000 -2.075709798 +C -1.259345218 0.000000000 -0.146465798 +H -2.142423218 0.509845000 0.252790202 +H -0.376267218 0.509845000 0.252790202 +Cl -1.259345218 -1.648164277 0.498867074 +Cl -1.259345218 1.648164277 -2.321786671 diff --git a/presto/partest/dce_remd.sh b/presto/partest/dce_remd.sh new file mode 100644 index 0000000..e19fad6 --- /dev/null +++ b/presto/partest/dce_remd.sh @@ -0,0 +1,16 @@ +#!/bin/bash +#SBATCH --job-name=dce_remd_par +#SBATCH --ntasks=8 +#SBATCH --cpus-per-task=8 +#SBATCH --partition=day +#SBATCH -t 1:00:00 +#SBATCH --mem-per-cpu=8100mb +#SBATCH --mail-type=END,FAIL + +module purge +module load miniconda +source activate presto-d + +mpiexec python run.py + + diff --git a/presto/partest/old/300k.yaml b/presto/partest/old/300k.yaml new file mode 100644 index 0000000..6d841f6 --- /dev/null +++ b/presto/partest/old/300k.yaml @@ -0,0 +1,28 @@ +# presto config file for nprocshared=2 + +type: equilibration + +timestep: 1 +high_atoms: 1-8 +stop_time: 250 + +anchor: 1 + +integrator: + type: langevin + viscosity: 0.0001 + +potential: + type: spherical_harmonic + radius: 8 + +calculator: + type: gaussian + route_card: "#p force b3lyp/6-31g empiricaldispersion=gd3 pop=none SCRF=(PCM, solvent=dichloromethane)" + link0: + nprocshared: 8 + mem: "64GB" + +bath_scheduler: + type: constant + target_temp: 300.00 diff --git a/presto/partest/old/400k.yaml b/presto/partest/old/400k.yaml new file mode 100644 index 0000000..1086ea9 --- /dev/null +++ b/presto/partest/old/400k.yaml @@ -0,0 +1,28 @@ +# presto config file for nprocshared=2 + +type: equilibration + +timestep: 1 +high_atoms: 1-8 +stop_time: 250 + +anchor: 1 + +integrator: + type: langevin + viscosity: 0.0001 + +potential: + type: spherical_harmonic + radius: 8 + +calculator: + type: gaussian + route_card: "#p force b3lyp/6-31g empiricaldispersion=gd3 pop=none SCRF=(PCM, solvent=dichloromethane)" + link0: + nprocshared: 8 + mem: "64GB" + +bath_scheduler: + type: constant + target_temp: 400.00 diff --git a/presto/partest/pseudo b/presto/partest/pseudo new file mode 100644 index 0000000..5d97114 --- /dev/null +++ b/presto/partest/pseudo @@ -0,0 +1,15 @@ +constraints: traj needs to be buit from a yaml, need to write one yaml per t + +for each cycle: + set up trajectories + + for each traj: + read setup info + run as separate job (run.py has master script that takes temp as param) + dump frame with attrs into chk file + + exchange script starts (slurm controls dependency): + for each traj, loads frame info from chk + compares energies and + + diff --git a/presto/partest/run.py b/presto/partest/run.py index c8194bc..f5e78f7 100644 --- a/presto/partest/run.py +++ b/presto/partest/run.py @@ -1,18 +1,22 @@ -import logging, re, sys, os -logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') -import numpy as np -import presto +from mpi4py import MPI import dill +import presto +import numpy as np +import logging +import re +import sys +import os +logging.basicConfig(level=logging.INFO, filename=f"remd.log", + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') logger = logging.getLogger(__name__) -from mpi4py import MPI MPI.pickle.__init__(dill.dumps, dill.loads) comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() -n_trajs = 2 +n_trajs = 8 try: all_trajs = [] @@ -20,22 +24,24 @@ if rank == 0: for temp in np.geomspace(300, 400, num=n_trajs): name = f"{int(temp)}k" - - with open("template.yaml", 'r') as file : + + with open("template.yaml", 'r') as file: filedata = file.read() filedata = filedata.replace("", f"{temp:.2f}") with open(f"{name}.yaml", 'w') as file: file.write(filedata) - traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") + traj = presto.config.build( + f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") all_trajs.append(traj) trajs = comm.bcast(all_trajs, root=0) - remd = presto.replica_exchange_par.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") + remd = presto.replica_exchange_par.ReplicaExchange( + trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") remd.run() if rank == 0: print(remd.report()) except Exception as e: - print(e) - sys.exit(1) + print(e) + sys.exit(1) diff --git a/presto/partest/serial/dce.xyz b/presto/partest/serial/dce.xyz new file mode 100644 index 0000000..6643077 --- /dev/null +++ b/presto/partest/serial/dce.xyz @@ -0,0 +1,10 @@ +8 +C2H4Cl2 +C -1.259345218 0.000000000 -1.676453798 +H -0.376267218 -0.509845000 -2.075709798 +H -2.142423218 -0.509845000 -2.075709798 +C -1.259345218 0.000000000 -0.146465798 +H -2.142423218 0.509845000 0.252790202 +H -0.376267218 0.509845000 0.252790202 +Cl -1.259345218 -1.648164277 0.498867074 +Cl -1.259345218 1.648164277 -2.321786671 diff --git a/presto/partest/serial/dce_remd.sh b/presto/partest/serial/dce_remd.sh new file mode 100644 index 0000000..c3a1c15 --- /dev/null +++ b/presto/partest/serial/dce_remd.sh @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH --job-name=dce_remd_p2 +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=8 +#SBATCH --partition=day +#SBATCH -t 15:00:00 +#SBATCH --mem-per-cpu=8100mb +#SBATCH --mail-type=END,FAIL + +module purge +module load SciPy-bundle +module load miniconda +module load Gaussian +source activate presto-d + +python ./run.py + + diff --git a/presto/partest/serial/run.py b/presto/partest/serial/run.py new file mode 100644 index 0000000..df62845 --- /dev/null +++ b/presto/partest/serial/run.py @@ -0,0 +1,37 @@ +import logging, re, sys, os +logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') +import numpy as np +import presto + +logger = logging.getLogger(__name__) + +for n_trajs in [2]: + + try: + logger.info(f"\n{n_trajs} trajectories:\n----------------------------\n") + trajs = [] + for temp in np.geomspace(300, 400, num=n_trajs): + name = f"{int(temp)}k" + + with open("template.yaml", 'r') as file : + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") + trajs.append(traj) + + remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") + remd.run() + print(remd.report()) + + for temp in np.geomspace(300, 400, num=n_trajs): + name = f"{int(temp)}k" + os.remove(f"{name}.yaml") + os.remove(f"{name}.chk") + + os.rename("./remd.chk", f"./remd_{n_trajs}.chk") + + except Exception as e: + print(e) + sys.exit(1) diff --git a/presto/partest/serial/template.yaml b/presto/partest/serial/template.yaml new file mode 100644 index 0000000..97e4894 --- /dev/null +++ b/presto/partest/serial/template.yaml @@ -0,0 +1,26 @@ +# presto config file for nprocshared=2 + +type: equilibration + +timestep: 1 +high_atoms: 1-8 +stop_time: 250 + +anchor: 1 + +integrator: + type: langevin + viscosity: 0.0001 + +potential: + type: spherical_harmonic + radius: 8 + +calculator: + type: xtb + gfn : 2 + parallel: 8 + +bath_scheduler: + type: constant + target_temp: diff --git a/presto/partest/template.yaml b/presto/partest/template.yaml new file mode 100644 index 0000000..97e4894 --- /dev/null +++ b/presto/partest/template.yaml @@ -0,0 +1,26 @@ +# presto config file for nprocshared=2 + +type: equilibration + +timestep: 1 +high_atoms: 1-8 +stop_time: 250 + +anchor: 1 + +integrator: + type: langevin + viscosity: 0.0001 + +potential: + type: spherical_harmonic + radius: 8 + +calculator: + type: xtb + gfn : 2 + parallel: 8 + +bath_scheduler: + type: constant + target_temp: diff --git a/presto/partest/test/notes b/presto/partest/test/notes new file mode 100644 index 0000000..b2a7635 --- /dev/null +++ b/presto/partest/test/notes @@ -0,0 +1,2 @@ +tested that calling mpi comm world on calling script and imported script +is fine diff --git a/presto/partest/par_test.py b/presto/partest/test/par_test.py similarity index 67% rename from presto/partest/par_test.py rename to presto/partest/test/par_test.py index cdb5f40..d378388 100644 --- a/presto/partest/par_test.py +++ b/presto/partest/test/par_test.py @@ -5,7 +5,6 @@ size = comm.Get_size() rank = comm.Get_rank() - class ParTest(object): """Testing how MPI4py works in classes @@ -15,27 +14,21 @@ def __init__(self, x, y): self.y = y def add(self): - print(f"for process {rank}, self.x is at {id(self.x)}") if not rank: return self.x + self.y else: return 'abc' - def report(self, arg): - print("done") - - if __name__ == "__main__": - # p = ParTest(1, 2) + p = ParTest(1, 2) # print("pre-addition") - # print(p.add()) - # p.report() + print(p.add()) - sendbuf = float(rank) + # sendbuf = float(rank) # recvbuf = None # if rank == 0: # recvbuf = np.empty(size, dtype='f') - recvbuf = comm.gather(sendbuf, root=0) - print(f"sendbuf of process {rank}:{sendbuf}") - print(f"recvbuf of process {rank}:{recvbuf}") + #recvbuf = comm.gather(sendbuf, root=0) + #print(f"sendbuf of process {rank}:{sendbuf}") + #print(f"recvbuf of process {rank}:{recvbuf}") diff --git a/presto/partest/test/run.py b/presto/partest/test/run.py new file mode 100644 index 0000000..e3505b8 --- /dev/null +++ b/presto/partest/test/run.py @@ -0,0 +1,17 @@ +import logging, re, sys, os +#logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') +#import numpy as np +#import presto +import dill +from par_test import ParTest +#logger = logging.getLogger(__name__) + +from mpi4py import MPI +MPI.pickle.__init__(dill.dumps, dill.loads) +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + +p = ParTest(1, 2) +# print("pre-addition") +print(p.add()) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py new file mode 100644 index 0000000..0595fc6 --- /dev/null +++ b/presto/replica_exchange_par.py @@ -0,0 +1,193 @@ +import numpy as np +import math, copy, cctk, os, re, logging, time, yaml, random +import multiprocessing as mp + +import presto + +logger = logging.getLogger(__name__) + +from mpi4py import MPI +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + +MIN_CHECKPOINT_INTERVAL = 50 + +class ReplicaExchange(): + """Runs several trajectories and manages interconversions between them. + + Based on: + http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf + + Attributes: + stop_time (int): + swaps (list of dict): + swap_interval (int): + checkpoint_filename (int): + finished (bool): + current_idx (int): + + Assumes there are ranks from 0 to len(trajectories) - 1 + + """ + def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): + if rank == 0: + # rank 0 does all the checking + for idx, traj in enumerate(trajectories): + assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" + assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" + assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" + assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" + assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + + assert isinstance(swap_interval, (float, int)) + assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" + assert isinstance(checkpoint_filename, str) + + # these attributes are privately owned by all process + self.swaps = [] + self.trajs = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) + self.temps = [traj.bath_scheduler(0) for traj in self.trajs] + self.traj = self.trajs[rank] + self.stop_time = trajectories[0].stop_time + self.swap_interval = swap_interval + + self.checkpoint_filename = checkpoint_filename + self.finished = False + self.current_idx = 0 + + self.load() + + def __str__(self): + return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + + def __repr__(self): + return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + + def save(self): + file_dict = { + "stop_time": self.stop_time, + "swap_interval": self.swap_interval, + "swaps": self.swaps, + "finished": self.finished, + "current_idx": self.current_idx, + } + with open(self.checkpoint_filename, "w+") as f: + yaml.dump(file_dict, f) + logger.info(f"Saving ReplicaExchange to {self.checkpoint_filename}.") + return self + + def load(self): + if os.path.exists(self.checkpoint_filename): + with open(self.checkpoint_filename, "r+") as f: + file_dict = yaml.safe_load(f) + self.stop_time = file_dict["stop_time"] + self.swap_interval = file_dict["swap_interval"] + self.swaps = file_dict["swaps"] + self.finished = file_dict["finished"] + self.current_idx = file_dict["current_idx"] + logger.info(f"Loaded ReplicaExchange from {self.checkpoint_filename}.") + return self + + def run(self): + if self.finished: + if rank == 0: + logger.info(f"From rank {rank}: Replica exchange already finished!") + return self + + start_idx = self.current_idx + + # self.trajs is an array that everyone has privately + for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): + next_idx = current_idx + 1 + target_time = next_idx * self.swap_interval + + time_remaining = max(0, target_time - self.trajs[rank].last_time_run()) + + if time_remaining: + self.traj.run(time=self.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, self.swap_interval)) + self.traj.load_from_checkpoint() + assert self.traj.last_time_run() == target_time + + self.exchange(next_idx * self.swap_interval) + # barrier at exchange + + self.current_idx = next_idx + self.save() + + # all done + self.finished = True + return self + + def exchange(self, time): + """ time is from 0 + """ + # these two are only nonNone when rank == 0 + # indices of energies and frames are pegged: if we swap energies, swap frames too + # original version of code read energies from frames[-2] + # g_energies = comm.gather(self.traj.frames[-2].energy, root=0) + + # now, we read all properties from frames[-1] + g_frames = comm.gather(self.traj.frames[-1], root=0) + logger.info(f"g_frames is {g_frames}") + if rank == 0: + kB = presto.constants.BOLTZMANN_CONSTANT + + # make one pass from low to high T + for i in range(len(self.trajs) - 1): + j = i+1 + + E_i = g_frames[i].energy + logger.info(f"E_i is {E_i}") + + E_j = g_frames[j].energy + logger.info(f"E_j is {E_j}") + + b_i = 1 / (kB * self.temps[i]) + logger.info(f"b_i is {b_i}") + + b_j = 1 / (kB * self.temps[j]) + logger.info(f"b_j is {b_j}") + + + p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) + logger.info(f"E{i} & E{j}\tp={p}") + + if p > random.random(): + # or momenta scaling + v_i_scaling = np.sqrt(self.temps[j] / self.temps[i]) + v_j_scaling = np.sqrt(self.temps[i] / self.temps[j]) + + frame_i = g_frames[i] + frame_j = g_frames[j] + frame_i.velocities *= v_i_scaling + frame_j.velocities *= v_j_scaling + + g_frames[i] = frame_j + g_frames[j] = frame_i + + self.swaps.append({"time": time, "i": i, "j": j}) + logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") + + # all together now: update own trajectory's last frame to g_frames[rank] + new_last_frame = comm.scatter(g_frames, root=0) + self.traj.frames[-1] = new_last_frame + # are we saving this last frame to chekpoint? + + return + + def report(self): + if rank == 0: + counts = np.zeros(shape=len(self.trajs)) + #len of counts is no of temps + possible = self.current_idx * (len(self.trajs) - 1) + for swap in self.swaps: + counts[swap["i"]] += 1 + + text = f"Time: {self.current_idx * self.swap_interval} fs\n" + text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" + for i in range(len(self.trajs) - 1): + text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" + + return text + return None From 873fd14e83380dca81a6ec2bd21737d83ada7ba7 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 31 May 2021 07:51:38 -0400 Subject: [PATCH 10/30] change undeclared variable --- presto/#trajectory.py# | 682 ------------------------------------- presto/.#trajectory.py | 1 - presto/replica_exchange.py | 4 +- 3 files changed, 2 insertions(+), 685 deletions(-) delete mode 100644 presto/#trajectory.py# delete mode 120000 presto/.#trajectory.py diff --git a/presto/#trajectory.py# b/presto/#trajectory.py# deleted file mode 100644 index e900a5a..0000000 --- a/presto/#trajectory.py# +++ /dev/null @@ -1,682 +0,0 @@ -import numpy as np -import math, copy, cctk, os, re, logging, time -import fasteners - -import h5py -import presto - -logger = logging.getLogger(__name__) - -class Trajectory(): - """ - - Attributes: - timestep (float): in fs - frames (list of presto.Frame): - stop_time (float): how long to run for - - high_atoms (np.ndarray): to calculate at high level of theory, list of 1-indexed atom numbers - active_atoms (np.ndarray): non-frozen atoms, list of 1-indexed atom numbers - - atomic_numbers (cctk.OneIndexedArray): list of atomic numbers - masses (cctk.OneIndexedArray): list of masses - - calculator (presto.calculators.Calculator): - integrator (presto.integrators.Integrator): - reporters (list of presto.reporters.Reporter): - checks (list of presto.checks.Check): - - finished (bool): - forwards (bool): - - checkpoint_filename (str): - lock (fasteners.InterProcessLock): lock object - save_interval (int): how many frames to save - """ - - def __init__( - self, - calculator=None, - integrator=None, - reporters=list(), - checks=list(), - timestep=None, - atomic_numbers=None, - high_atoms=None, - forwards=True, - checkpoint_filename=None, - stop_time=None, - save_interval=1, - **kwargs - ): - - # do this first! - if timestep is not None: - assert timestep > 0, "can't have timestep ≤ 0!" - self.timestep = float(timestep) - - if checkpoint_filename is not None: - assert isinstance(checkpoint_filename, str), "need string for file" - self.checkpoint_filename = checkpoint_filename - - self.lock = None - self.initialize_lock() - self.frames = list() - - if self.has_checkpoint(): - if "load_frames" in kwargs: - self.load_from_checkpoint(kwargs["load_frames"]) - else: - self.load_from_checkpoint(slice(-1,None,None)) - - if calculator is not None: - assert isinstance(calculator, presto.calculators.Calculator), "need a valid calculator!" - self.calculator = calculator - - if integrator is not None: - assert isinstance(integrator, presto.integrators.Integrator), "need a valid integrator!" - self.integrator = integrator - - assert all([isinstance(c, presto.checks.Check) for c in checks]) - self.checks = checks - - assert all([isinstance(r, presto.reporters.Reporter) for r in reporters]) - self.reporters = reporters - - if atomic_numbers is not None: - assert isinstance(atomic_numbers, cctk.OneIndexedArray), "atomic numbers must be cctk 1-indexed array!" - self.atomic_numbers = atomic_numbers - elif not hasattr(self, "atomic_numbers"): - raise ValueError("no atomic numbers specified") - - if not hasattr(self, "finished"): - self.finished = False - - if high_atoms is not None: - assert isinstance(high_atoms, np.ndarray), "high_atoms must be np.ndarray!" - self.high_atoms = high_atoms - else: - self.high_atoms = None - - active_atoms = None - if "active_atoms" in kwargs: - active_atoms = kwargs["active_atoms"] - assert isinstance(active_atoms, np.ndarray), "active_atoms must be np.ndarray!" - self.active_atoms = active_atoms - elif "inactive_atoms" in kwargs: - self.set_inactive_atoms(kwargs["inactive_atoms"]) - else: - # assume all atoms are active - self.set_inactive_atoms(np.ndarray([])) - - if not hasattr(self, "masses"): - self.masses = cctk.OneIndexedArray([float(cctk.helper_functions.draw_isotopologue(z)) for z in atomic_numbers]) - - if not hasattr(self, "frames"): - self.frames = [] - - if forwards is not None: - assert isinstance(forwards, bool), "forwards must be bool" - self.forwards = forwards - elif not hasattr(self, "forwards"): - self.forwards = True - - if not hasattr(self, "stop_time"): - assert (isinstance(stop_time, float)) or (isinstance(stop_time, int)), "stop_time needs to be numeric!" - assert stop_time > 0, "stop_time needs to be positive!" - self.stop_time = stop_time - - assert isinstance(save_interval, int), "save_interval needs to be positive" - assert save_interval > 0, "save_interval needs to be positive" - self.save_interval = save_interval - - def __str__(self): - return f"Trajectory({len(self.frames)} frames)" - - def __repr__(self): - return f"Trajectory({len(self.frames)} frames)" - - def set_inactive_atoms(self, inactive_atoms): - """ - Since sometimes it's easier to specify the inactive atoms than the inactive atoms, this method updates ``self.active_atoms`` with the complement of ``inactive_atoms``. - """ - assert isinstance(inactive_atoms, (list, np.ndarray)), "Need list of atoms!" - active_atoms = list(range(1, len(self.atomic_numbers)+1)) - if len(inactive_atoms): - for atom in inactive_atoms: - active_atoms.remove(atom) - active_atoms = np.array(active_atoms) - self.active_atoms = active_atoms - - def run(self, checkpoint_interval=10, keep_all=False, time=None, **kwargs): - """ - Run the trajectory. - - Args: - checkpoint_interval (int): interval at which to save (in frames, not fs) - keep_all (bool): whether or not to keep all frames in memory - time (float): total time to run for -- default is None, implying trajectory should be run until finished - """ - if self.checkpoint_filename is None: - if "checkpoint_filename" in kwargs: - self.checkpoint_filename = kwargs["checkpoint_filename"] - else: - raise ValueError("no checkpoint filename given!") - - self.load_from_checkpoint(slice(-1, None, None)) - assert len(self.frames) == 1, "Wrong number of frames - do you need to call trajectory.initialize()?" - - if self.finished: - logger.info("Trajectory already finished!") - else: - # initialize runtime controller - controller = presto.controller.Controller(self, **kwargs) - try: - controller.run(checkpoint_interval=checkpoint_interval, runtime=time) - except Exception as e: - raise ValueError(f"Trajectory run terminated prematurely due to error: {e}") - - if keep_all: - self.load_from_checkpoint() - assert self.frames[0].time == 0, "missing first frame despite keep_all being True!" - - return self - - def initialize(self): - """ - Adds first frame with randomly-initialized velocities. Should call ``self.save()``. - """ - pass - - def has_checkpoint(self): - if self.checkpoint_filename is None: - return False - if os.path.exists(self.checkpoint_filename): - return True - else: - return False - - def load_from_checkpoint(self, frames=slice(None)): - """ - Loads frames from ``self.checkpoint_filename``. - - Args: - frames (Slice object): if not all frames are desired, a Slice object can be passed - - Returns: - nothing - """ - if not self.has_checkpoint(): - return # nothing to load! - - self.initialize_lock() - self.lock.acquire() - - with h5py.File(self.checkpoint_filename, "r") as h5: - atomic_numbers = h5.attrs["atomic_numbers"] - self.atomic_numbers = cctk.OneIndexedArray(atomic_numbers) - - masses = h5.attrs["masses"] - self.masses = cctk.OneIndexedArray(masses) - - self.finished = h5.attrs['finished'] - self.forwards = h5.attrs['forwards'] - - self.frames = [] - if len(h5.get("all_energies")): - all_energies = h5.get("all_energies")[frames] - all_positions = h5.get("all_positions")[frames] - all_velocities= h5.get("all_velocities")[frames] - all_accels = h5.get("all_accelerations")[frames] - temperatures = h5.get("bath_temperatures")[frames] - - # v0.2.2 - provisionally removing this -# all_times = None -# try: - all_times = h5.get("all_times")[frames] -# except Exception as e: -# all_times = np.arange(0, self.timestep*len(all_energies)*self.save_interval, self.timestep*self.save_interval) -# # this was added recently, so may be some backwards compatibility issues. -# pass - - if isinstance(all_energies, np.ndarray): - assert len(all_positions) == len(all_energies) - assert len(all_velocities) == len(all_energies) - assert len(all_accels) == len(all_energies) - assert len(all_times) == len(all_energies) - - for i, t in enumerate(all_times): - self.frames.append(presto.frame.Frame( - self, - all_positions[i].view(cctk.OneIndexedArray), - all_velocities[i].view(cctk.OneIndexedArray), - all_accels[i].view(cctk.OneIndexedArray), - energy=all_energies[i], - bath_temperature=temperatures[i], - time=all_times[i], - )) - - logger.info(f"Loaded trajectory from checkpoint file {self.checkpoint_filename} -- {len(self.frames)} frames read.") - - self.lock.release() - return - - def num_frames(self): - if self.has_checkpoint(): - num = 0 - with h5py.File(self.checkpoint_filename, "r") as h5: - num = len(h5.get("all_energies")) - return num - else: - return len(self.frames) - - def save(self, keep_all=False): - if self.checkpoint_filename is None: - raise ValueError("can't save without checkpoint filename") - self.initialize_lock() - self.lock.acquire() - - last_run_time = self.frames[-1].time - if self.has_checkpoint(): - with h5py.File(self.checkpoint_filename, "r+") as h5: - n_atoms = len(self.atomic_numbers) - h5.attrs['finished'] = self.finished - - all_energies = h5.get("all_energies") - old_n_frames = len(all_energies) - # v0.2.2 - provisionally removing this -# if "all_times" not in h5: -# # time is a new column, so old checkpoints may not have it. -# old_times = np.arange(0, self.timestep, self.timestep*old_n_frames) -# h5.create_dataset("all_times", data=old_times, maxshape=(None,), compression="gzip", compression_opts=9) - - all_times = h5.get("all_times") - last_saved_time = all_times[-1] - new_n_frames = int((last_run_time - last_saved_time) / (self.timestep*self.save_interval)) - now_n_frames = new_n_frames + old_n_frames - - if new_n_frames == 0: - self.lock.release() - return - assert new_n_frames > 0, f"we can't write negative frames ({old_n_frames} previously in {self.checkpoint_filename}, but now only {now_n_frames})" - - frames_to_add = list() - # there is probably a more elegant way to handle this, but this seems robust at least - for frame in self.frames[-(new_n_frames*self.save_interval)-1:]: - if frame.time <= last_saved_time: - continue - if frame.time % (self.timestep * self.save_interval) == 0: - frames_to_add.append(frame) - assert new_n_frames == len(frames_to_add), "pernicious math error in frame numbers!" - - new_times = np.asarray([frame.time for frame in frames_to_add]) - all_times.resize((now_n_frames,)) - all_times[-new_n_frames:] = new_times - - all_energies = h5.get("all_energies") - new_energies = np.asarray([frame.energy for frame in frames_to_add]) - all_energies.resize((now_n_frames,)) - all_energies[-new_n_frames:] = new_energies - - new_positions = np.stack([frame.positions for frame in frames_to_add]) - all_positions = h5.get("all_positions") - all_positions.resize((now_n_frames,n_atoms,3)) - all_positions[-new_n_frames:] = new_positions - - new_velocities= np.stack([frame.velocities for frame in frames_to_add]) - all_velocities = h5.get("all_velocities") - all_velocities.resize((now_n_frames,n_atoms,3)) - all_velocities[-new_n_frames:] = new_velocities - - new_accels = np.stack([frame.accelerations for frame in frames_to_add]) - all_accels = h5.get("all_accelerations") - all_accels.resize((now_n_frames,n_atoms,3)) - all_accels[-new_n_frames:] = new_accels - - new_temps = np.stack([frame.bath_temperature for frame in frames_to_add]) - all_temps = h5.get("bath_temperatures") - all_temps.resize((now_n_frames,)) - all_temps[-new_n_frames:] = new_temps - - logger.info(f"Saving to existing checkpoint file {self.checkpoint_filename} ({new_n_frames} frames added; {last_run_time:.1f}/{self.stop_time:.1f} fs run in total)") - else: - with h5py.File(self.checkpoint_filename, "w") as h5: - h5.attrs['atomic_numbers'] = self.atomic_numbers.view(np.ndarray) - h5.attrs['masses'] = self.masses.view(np.ndarray) - h5.attrs['finished'] = self.finished - h5.attrs['forwards'] = self.forwards - - n_atoms = len(self.atomic_numbers) - - frames_to_add = list() - for frame in self.frames: - if frame.time % (self.timestep * self.save_interval) == 0: - frames_to_add.append(frame) - - energies = np.asarray([frame.energy for frame in frames_to_add]) - h5.create_dataset("all_energies", data=energies, maxshape=(None,), compression="gzip", compression_opts=9) - - times = np.asarray([frame.time for frame in frames_to_add]) - h5.create_dataset("all_times", data=times, maxshape=(None,), compression="gzip", compression_opts=9) - - all_positions = np.stack([frame.positions for frame in frames_to_add]) - h5.create_dataset("all_positions", data=all_positions, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) - - all_velocities = np.stack([frame.velocities for frame in frames_to_add]) - h5.create_dataset("all_velocities", data=all_velocities, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) - - all_accels= np.stack([frame.accelerations for frame in frames_to_add]) - h5.create_dataset("all_accelerations", data=all_accels, maxshape=(None,n_atoms,3), compression="gzip", compression_opts=9) - - temps = np.asarray([frame.bath_temperature for frame in frames_to_add]) - h5.create_dataset("bath_temperatures", data=temps, maxshape=(None,), compression="gzip", compression_opts=9) - - logger.info(f"Saving to new checkpoint file {self.checkpoint_filename} ({len(frames_to_add)} frames added; {last_run_time:.1f}/{self.stop_time:.1f} fs run in total)") - self.lock.release() - - # lower memory usage - if keep_all: - pass - else: - self.frames = [self.frames[-1]] - - def write_movie(self, filename, solvents="all", idxs=None): - """ - Write a movie to a trajectory file. Detects trajectory type automatically from file extension. - - Supported file formats: ``.pdb``, ``.mol2``, ``.xyz``/``.molden`` - - Args: - filename (str): path where movie will be written - solvents (int): number of solvent molecules to include (closest included first). can also be ``none`` or ``all``. - idxs (list of int): indices of atoms to include. will override ``solvents`` if present. - """ - - # what do we make a movie of? - if idxs is not None: - assert isinstance(idxs, list), "idxs must be list of indices or ``None``!" - else: - if isinstance(solvents, str): - if solvents == "high": - idxs = self.high_atoms - elif solvents == "all": - idxs = None - else: - raise ValueError(f"unknown solvents keyword {solvents} -- must be 'high' or 'all'") - elif isinstance(solvents, int): - molecule = self.frames[0].molecule().assign_connectivity() - idxs = molecule.limit_solvent_shell(num_solvents=solvents, return_idxs=True) - else: - raise ValueError("``solvents`` must be int, 'high', or 'all'!") - - ensemble = self.as_ensemble(idxs) - logger.info("Writing trajectory to {filename}") - if re.search("pdb$", filename): - cctk.PDBFile.write_ensemble_to_trajectory(filename, ensemble) - elif re.search("mol2$", filename): - #### connectivity matters - ensemble.assign_connectivity() - cctk.MOL2File.write_ensemble_to_file(filename, ensemble) - elif re.search("molden$", filename) or re.search("xyz$", filename): - cctk.XYZFile.write_ensemble_to_file(filename, ensemble) - else: - raise ValueError(f"error writing {filename}: this filetype isn't currently supported!") - - def as_ensemble(self, idxs=None): - ensemble = cctk.ConformationalEnsemble() - for frame in self.frames[:-1]: - ensemble.add_molecule(frame.molecule(idxs), {"bath_temperature": frame.bath_temperature, "energy": frame.energy}) - return ensemble - - @classmethod - def new_from_checkpoint(cls, checkpoint, frame): - """ - Creates new trajectory from the given checkpoint file. - - Args: - checkpoint (str): path to checkpoint file - frame (int): the index of the desired frame - - Returns: - new ``Trajectory`` object - """ - assert isinstance(frame, int), "need an integer frame number" - - new_traj = cls(checkpoint_filename=checkpoint) - new_traj.load_from_checkpoint(idxs=frame) - - assert len(new_traj.frames) == 1, "got too many frames!" - return new_traj - - def initialize_lock(self): - """ - Create hidden lockfile to accompany ``.chk`` file. - """ - if self.checkpoint_filename is None: - return - - if self.lock is None: - lockfile = None - if "/" in self.checkpoint_filename: - lockfile = f"{self.checkpoint_filename}.lock"[::-1].replace("/", "./", 1)[::-1] - else: - lockfile = f".{self.checkpoint_filename}.lock" - self.lock = fasteners.InterProcessLock(lockfile) - - def last_time_run(self): - """ Get last finished time """ - return self.frames[-1].time - -class ReactionTrajectory(Trajectory): - """ - Attributes: - termination_function (function): detects if first or last Frame has reached product/SM or should otherwise be halted. - takes ``Frame`` argument as option and returns ``True``/``False``. - optionally, can return 1 for forward and 2 for reverse (to differentiate recrossing from productive). - time_after_finished (float/int): how long (in fs) to continue propagation after termination conditions reached - """ - - @classmethod - def new_from_checkpoint(self): - pass - - def __init__(self, termination_function=None, time_after_finished=100, **kwargs): - super().__init__(**kwargs) - - assert isinstance(time_after_finished, (int, float)), "time_after_finished must be numeric" - self.time_after_finished = time_after_finished - self.elapsed_since_finished = 0 - - assert hasattr(termination_function, "__call__"), "termination_function must be a function!" - self.termination_function = termination_function - - def __str__(self): - return f"ReactionTrajectory({len(self.frames)} frames)" - - def __repr__(self): - return f"ReactionTrajectory({len(self.frames)} frames)" - - def initialize(self, frame=None, positions=None, velocities=None, accelerations=None, bath_temp=None, new_velocities=None, **kwargs): - """ - Generates initial frame object for reaction trajectory. Initializes any non-zero velocities. - Velocities are taken from the Maxwell–Boltzmann distribution for the given temperature. - - Can pass either a frame object, or the relevant attributes (frame gets precedence). - - Args: - frame (presto.frame.Frame): equilibrated frame - new_velocities (cctk.OneIndexedArray): array of velocities to add to equilibrated frame (for previously-frozen atoms) - velocities, accelerations, positions (cctk.OneIndexedArray): values from frame (instead of frame object) - bath_temperature (float): - - Returns: - frame - """ - logger.info("Initializing new reaction trajectory...") - if self.has_checkpoint(): - self.load_from_checkpoint(slice(-1,None,None)) - return - - if frame is not None: - assert isinstance(frame, presto.frame.Frame), "need a valid frame" - - positions = frame.positions - velocities = frame.velocities - accelerations = frame.accelerations - bath_temp = frame.bath_temperature - - else: - assert positions is not None, "no Frame supplied, need positions" - assert velocities is not None, "no Frame supplied, need velocities" - assert accelerations is not None, "no Frame supplied, need accelerations" - assert bath_temp is not None, "no Frame supplied, need bath temperature" - - assert isinstance(positions, cctk.OneIndexedArray) - assert isinstance(velocities, cctk.OneIndexedArray) - assert isinstance(accelerations, cctk.OneIndexedArray) - assert isinstance(bath_temp, (float, int, np.integer)) - - new_frame = presto.frame.Frame(self, positions, velocities, accelerations, bath_temperature=bath_temp, time=0.0) - - if new_velocities is None: - random_gaussian = np.random.normal(size=positions.shape).view(cctk.OneIndexedArray) - random_gaussian[new_frame.active_mask()] = 0 - new_velocities = random_gaussian * np.sqrt(bath_temp * presto.constants.BOLTZMANN_CONSTANT / self.masses.reshape(-1,1)) - - new_frame.velocities += new_velocities.view(cctk.OneIndexedArray) - - self.frames = [new_frame] - self.save() - -class EquilibrationTrajectory(Trajectory): - """ - Attributes: - bath_scheduler (function): takes current time and returns target temperature - alternatively, pass a number if you want a constant-temperature bath - """ - - def __init__(self, **kwargs): - super().__init__(**kwargs) - - bath_scheduler = kwargs.get("bath_scheduler") - - if hasattr(bath_scheduler, "__call__"): - self.bath_scheduler = bath_scheduler - elif isinstance(bath_scheduler, (int, float)): - def sched(time): - return bath_scheduler - - self.bath_scheduler = sched - else: - raise ValueError(f"unknown type {type(bath_scheduler)} for bath_scheduler - want either a function or a number!") - - def __str__(self): - return f"EquilibrationTrajectory({len(self.frames)} frames)" - - def __repr__(self): - return f"EquilibrationTrajectory({len(self.frames)} frames)" - - def initialize(self, positions, velocities=None, accelerations=None, **kwargs): - """ - Generates initial frame object for initialization trajectory. - Velocities are taken from the Maxwell–Boltzmann distribution for the given temperature. - - Args: - positions (cctk.OneIndexedArray): starting positions - velocities (cctk.OneIndexedArray): starting velocities, optional. - accelerations (cctk.OneIndexedArray): starting accelerations, optional. - - Returns: - frame - """ - logger.info("Initializing new equilibration trajectory...") - if self.has_checkpoint(): - self.load_from_checkpoint(slice(-1,None,None)) - assert len(self.frames) == 1, "didn't load frames properly!" - return - - assert isinstance(positions, cctk.OneIndexedArray), "positions must be a one-indexed array!" - - # determine active atoms - inactive_mask = np.ones(shape=len(positions)).view(cctk.OneIndexedArray) - inactive_mask[self.active_atoms] = 0 - inactive_mask = inactive_mask.astype(bool) - - if velocities is None: - # add random velocity to everything - sigma = np.sqrt(self.bath_scheduler(0) * presto.constants.BOLTZMANN_CONSTANT / self.masses.reshape(-1,1)) - velocities = np.random.normal(scale=sigma, size=positions.shape).view(cctk.OneIndexedArray) - velocities[inactive_mask] = 0 - - # subtract out center-of-mass translational motion - com_translation = np.sum(self.masses.reshape(-1,1) * velocities, axis=0) - correction_tran = np.tile(com_translation / np.sum(self.masses[self.active_atoms]), (len(velocities),1)) - correction_tran[inactive_mask] = 0 - velocities = velocities - correction_tran - com_translation = np.sum(self.masses.reshape(-1,1) * velocities, axis=0) - assert np.linalg.norm(np.sum(self.masses.reshape(-1,1) * velocities, axis=0)) < 0.0001, "didn't remove COM translation well enough!" - - velocities = velocities.view(cctk.OneIndexedArray) - else: - assert isinstance(velocities, cctk.OneIndexedArray) - velocities[inactive_mask] = 0 - - if accelerations is None: - accelerations = np.zeros_like(positions).view(cctk.OneIndexedArray) - else: - assert isinstance(accelerations, cctk.OneIndexedArray) - accelerations[inactive_mask] = 0 - - self.frames = [presto.frame.Frame(self, positions, velocities, accelerations, bath_temperature=self.bath_scheduler(0), time=0.0)] - self.save() - -def join(traj1, traj2): - """ - Join two reaction trajectories together -- one forward and one reverse! - Returns a single reaction trajectory. - - Args: - traj1 (presto.ReactionTrajectory): forward trajectory - traj2 (presto.ReactionTrajectory): reverse trajectory - - Returns: - combined ``ReactionTrajectory`` - """ - logger.info("Joining forward and reverse reaction trajectories....") - assert isinstance(traj1, ReactionTrajectory), "Need a ReactionTrajectory" - assert isinstance(traj2, ReactionTrajectory), "Need a ReactionTrajectory" - - assert traj1.forwards == True, "First trajectory must be forwards!" - assert traj2.forwards == False, "Second trajectory must be reverse!" - - assert traj1.finished, "First trajectory must be finished!" - assert traj2.finished, "Second trajectory must be finished!" - - assert np.array_equal(traj1.frames[0].positions, traj2.frames[0].positions), "Link positions must be same!" - assert np.array_equal(traj1.frames[0].velocities, traj2.frames[0].velocities), "Link velocities must be same!" - assert np.array_equal(traj1.frames[0].accelerations, traj2.frames[0].accelerations), "Link accelerations must be same!" - - new_traj = ReactionTrajectory( - timestep = traj1.timestep, - atomic_numbers = traj1.atomic_numbers, - high_atoms = traj1.high_atoms, - active_atoms = traj1.active_atoms, - calculator = traj1.calculator, - integrator = traj1.integrator, - termination_function = traj1.termination_function, - stop_time = traj1.stop_time, - forwards = True, - ) - - f_frames = copy.deepcopy(traj1.frames) - r_frames = copy.deepcopy(traj2.frames) - r_frames.reverse() - - new_traj.frames = r_frames + f_frames[1:] # don't double-count middle frame - - if traj1.finished == 2: - #### if the first traj finished with the reverse condition, reverse order - new_traj.frames = new_traj.frames[::-1] - - return new_traj - diff --git a/presto/.#trajectory.py b/presto/.#trajectory.py deleted file mode 120000 index 084e1ce..0000000 --- a/presto/.#trajectory.py +++ /dev/null @@ -1 +0,0 @@ -mhs65@grace2.grace.hpc.yale.internal.10549:1612467822 \ No newline at end of file diff --git a/presto/replica_exchange.py b/presto/replica_exchange.py index 2e1b3c5..418f6e1 100644 --- a/presto/replica_exchange.py +++ b/presto/replica_exchange.py @@ -49,10 +49,10 @@ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=1 self.load() def __str__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" def __repr__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" def save(self): file_dict = { From 11ca8ff8d2f7083e9f255ee2073c95a65f615480 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Mon, 31 May 2021 08:37:49 -0400 Subject: [PATCH 11/30] bugfix idxs required to be string, not list --- presto/trajectory.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/presto/trajectory.py b/presto/trajectory.py index e900a5a..204aee3 100644 --- a/presto/trajectory.py +++ b/presto/trajectory.py @@ -393,8 +393,16 @@ def write_movie(self, filename, solvents="all", idxs=None): """ # what do we make a movie of? - if idxs is not None: - assert isinstance(idxs, list), "idxs must be list of indices or ``None``!" + if idxs: + if isinstance(idxs, str): + if idxs == "high": + idxs = self.high_atoms + elif idxs == "all": + idxs = None + else: + raise ValueError(f"unknown idxs keyword {idxs} -- must be 'high' or 'all'") + else: + raise ValueError(f"unknown idxs keyword {idxs} -- must be 'high' or 'all'") else: if isinstance(solvents, str): if solvents == "high": From 6bdaf7f98f6183d00973561aa4210a0d116a1bf0 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 1 Jun 2021 00:48:28 -0400 Subject: [PATCH 12/30] add mpi-parallelized remd --- presto/__init__.py | 2 +- presto/partest/#remd.log# | 21 ----- presto/partest/.#pseudo | 1 - presto/partest/run.py | 47 ----------- presto/partest/run_remd_mpi.py | 51 ++++++++++++ ...xchange_par.py => replica_exchange_mpi.py} | 77 +++++++++++-------- setup.cfg | 6 ++ 7 files changed, 105 insertions(+), 100 deletions(-) delete mode 100644 presto/partest/#remd.log# delete mode 120000 presto/partest/.#pseudo delete mode 100644 presto/partest/run.py create mode 100644 presto/partest/run_remd_mpi.py rename presto/{replica_exchange_par.py => replica_exchange_mpi.py} (77%) create mode 100644 setup.cfg diff --git a/presto/__init__.py b/presto/__init__.py index bf32286..95bc5a2 100644 --- a/presto/__init__.py +++ b/presto/__init__.py @@ -7,7 +7,7 @@ import presto.analysis import presto.constraints import presto.replica_exchange -import presto.replica_exchange_par +import presto.replica_exchange_mpi import presto.controller import presto.checks import presto.reporters diff --git a/presto/partest/#remd.log# b/presto/partest/#remd.log# deleted file mode 100644 index f576f50..0000000 --- a/presto/partest/#remd.log# +++ /dev/null @@ -1,21 +0,0 @@ -05-30 21:38 presto.config Loaded configuration data from /home/mhs65/.config/presto/presto.config. -05-30 21:38 presto.trajectory Initializing new equilibration trajectory... -05-30 21:38 presto.trajectory Saving to new checkpoint file 300k.chk (1 frames added; 0.0/250.0 fs run in total) -05-30 21:38 presto.trajectory Initializing new equilibration trajectory... -05-30 21:38 presto.trajectory Saving to new checkpoint file 400k.chk (1 frames added; 0.0/250.0 fs run in total) -05-30 21:38 presto.trajectory Loaded trajectory from checkpoint file 300k.chk -- 1 frames read. -05-30 21:38 presto.controller Trajectory will run 50 frames (current time = 0.0 fs, end time = 50.0 fs) -05-30 21:38 presto.controller Run initiated ok - frame 00001 completed in 0.19 s. -05-30 21:38 presto.controller Run initiated ok - frame 00002 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00003 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00004 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00005 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00006 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00007 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00008 completed in 0.04 s. -05-30 21:38 presto.controller Run initiated ok - frame 00009 completed in 0.04 s. -05-30 21:38 presto.trajectory Saving to existing checkpoint file 300k.chk (50 frames added; 50.0/250.0 fs run in total) -05-30 21:38 presto.controller Trajectory done running with 51 frames. -05-30 21:38 presto.trajectory Loaded trajectory from checkpoint file 300k.chk -- 51 frames read. -05-30 21:38 presto.replica_exchange_par gathered frames -05-30 21:38 presto.replica_exchange_par E_i is -15.406513014878293 diff --git a/presto/partest/.#pseudo b/presto/partest/.#pseudo deleted file mode 120000 index 084e1ce..0000000 --- a/presto/partest/.#pseudo +++ /dev/null @@ -1 +0,0 @@ -mhs65@grace2.grace.hpc.yale.internal.10549:1612467822 \ No newline at end of file diff --git a/presto/partest/run.py b/presto/partest/run.py deleted file mode 100644 index f5e78f7..0000000 --- a/presto/partest/run.py +++ /dev/null @@ -1,47 +0,0 @@ -from mpi4py import MPI -import dill -import presto -import numpy as np -import logging -import re -import sys -import os -logging.basicConfig(level=logging.INFO, filename=f"remd.log", - format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') - -logger = logging.getLogger(__name__) - -MPI.pickle.__init__(dill.dumps, dill.loads) -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -n_trajs = 8 - -try: - all_trajs = [] - - if rank == 0: - for temp in np.geomspace(300, 400, num=n_trajs): - name = f"{int(temp)}k" - - with open("template.yaml", 'r') as file: - filedata = file.read() - filedata = filedata.replace("", f"{temp:.2f}") - with open(f"{name}.yaml", 'w') as file: - file.write(filedata) - traj = presto.config.build( - f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") - all_trajs.append(traj) - - trajs = comm.bcast(all_trajs, root=0) - remd = presto.replica_exchange_par.ReplicaExchange( - trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") - remd.run() - - if rank == 0: - print(remd.report()) - -except Exception as e: - print(e) - sys.exit(1) diff --git a/presto/partest/run_remd_mpi.py b/presto/partest/run_remd_mpi.py new file mode 100644 index 0000000..2980853 --- /dev/null +++ b/presto/partest/run_remd_mpi.py @@ -0,0 +1,51 @@ +from mpi4py import MPI +import argparse, copy, cctk, dill, logging, math, os, random, re, sys, time, yaml +import numpy as np +import presto + +logging.basicConfig(level=logging.INFO, filename=f"remd.log", + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') + +logger = logging.getLogger(__name__) + +MPI.pickle.__init__(dill.dumps, dill.loads) +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + +parser = argparse.ArgumentParser(prog="run_remd_mpi.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") +parser.add_argument("input", default=None, type=str, help="name of input geometry (.xyz)") +parser.add_argument("template", type=str, default="template.yaml", help="path to template file (usually ends in .yaml)") +parser.add_argument("checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") +parser.add_argument("--mintemp", "-a", default=100, type=int, help="minimum trajectory temperature (K)") +parser.add_argument("--maxtemp", "-z", default=800, type=int, help="maximum trajectory temperature (K)") +parser.add_argument("--trajs", "-n", default=8, type=int, help="number of trajectories (equal to slurm --ntasks)") +parser.add_argument("--swap", "-s", default=50, type=int, help="time interval between swaps (fs)") + +args = vars(parser.parse_args(sys.argv[1:])) + +try: + all_trajs = [] + + if rank == 0: + for temp in np.geomspace(args["mintemp"], args["maxtemp"], num=args["trajs"]): + name = f"{int(temp)}k" + with open(args["template"], 'r') as file: + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build( + f"{name}.yaml", f"{name}.chk", geometry=args["input"]) + all_trajs.append(traj) + + trajs = comm.bcast(all_trajs, root=0) + remd = presto.replica_exchange_mpi.ReplicaExchange(trajectories=trajs, swap_interval=args["swap"], checkpoint_filename=args["checkpoint_filename"]) + remd.run() + + if rank == 0: + print(remd.report()) + +except Exception as e: + print(e) + sys.exit(1) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_mpi.py similarity index 77% rename from presto/replica_exchange_par.py rename to presto/replica_exchange_mpi.py index 0595fc6..eedd692 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_mpi.py @@ -1,12 +1,21 @@ +from mpi4py import MPI import numpy as np -import math, copy, cctk, os, re, logging, time, yaml, random -import multiprocessing as mp - +import argparse +import copy +import cctk +import dill +import logging +import math +import os +import random +import re +import sys +import time +import yaml import presto logger = logging.getLogger(__name__) -from mpi4py import MPI comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() @@ -26,24 +35,28 @@ class ReplicaExchange(): checkpoint_filename (int): finished (bool): current_idx (int): - + Assumes there are ranks from 0 to len(trajectories) - 1 """ + def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): if rank == 0: # rank 0 does all the checking for idx, traj in enumerate(trajectories): - assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" + assert isinstance( + traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" - assert np.array_equal(traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" - assert np.array_equal(traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + assert np.array_equal( + traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" + assert np.array_equal( + traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" assert isinstance(swap_interval, (float, int)) assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" assert isinstance(checkpoint_filename, str) - + # these attributes are privately owned by all process self.swaps = [] self.trajs = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) @@ -59,10 +72,10 @@ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=1 self.load() def __str__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + return f"ReplicaExchange({len(self.trajs)}) trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename}" def __repr__(self): - return f"ReplicaExchange({len(trajectories)} trajectories, swap_interval={swap_interval} fs, checkpoint_file={checkpoint_filename})" + return f"ReplicaExchange({len(self.trajs)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" def save(self): file_dict = { @@ -86,13 +99,15 @@ def load(self): self.swaps = file_dict["swaps"] self.finished = file_dict["finished"] self.current_idx = file_dict["current_idx"] - logger.info(f"Loaded ReplicaExchange from {self.checkpoint_filename}.") + logger.info( + f"Loaded ReplicaExchange from {self.checkpoint_filename}.") return self def run(self): if self.finished: if rank == 0: - logger.info(f"From rank {rank}: Replica exchange already finished!") + logger.info( + f"From rank {rank}: Replica exchange already finished!") return self start_idx = self.current_idx @@ -101,22 +116,28 @@ def run(self): for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): next_idx = current_idx + 1 target_time = next_idx * self.swap_interval - - time_remaining = max(0, target_time - self.trajs[rank].last_time_run()) + + time_remaining = max( + 0, target_time - self.trajs[rank].last_time_run()) if time_remaining: - self.traj.run(time=self.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, self.swap_interval)) + self.traj.run(time=self.swap_interval, checkpoint_interval=min( + MIN_CHECKPOINT_INTERVAL, self.swap_interval)) self.traj.load_from_checkpoint() assert self.traj.last_time_run() == target_time self.exchange(next_idx * self.swap_interval) # barrier at exchange - + self.current_idx = next_idx - self.save() + + if rank == 0: + self.save() # all done self.finished = True + if rank == 0: + self.save() return self def exchange(self, time): @@ -129,35 +150,30 @@ def exchange(self, time): # now, we read all properties from frames[-1] g_frames = comm.gather(self.traj.frames[-1], root=0) - logger.info(f"g_frames is {g_frames}") - if rank == 0: + + if rank == 0: kB = presto.constants.BOLTZMANN_CONSTANT - + # make one pass from low to high T for i in range(len(self.trajs) - 1): j = i+1 E_i = g_frames[i].energy - logger.info(f"E_i is {E_i}") E_j = g_frames[j].energy - logger.info(f"E_j is {E_j}") b_i = 1 / (kB * self.temps[i]) - logger.info(f"b_i is {b_i}") b_j = 1 / (kB * self.temps[j]) - logger.info(f"b_j is {b_j}") - - p = min(1, np.exp( (E_i - E_j) * (b_i - b_j) ) ) + p = min(1, np.exp((E_i - E_j) * (b_i - b_j))) logger.info(f"E{i} & E{j}\tp={p}") if p > random.random(): # or momenta scaling v_i_scaling = np.sqrt(self.temps[j] / self.temps[i]) v_j_scaling = np.sqrt(self.temps[i] / self.temps[j]) - + frame_i = g_frames[i] frame_j = g_frames[j] frame_i.velocities *= v_i_scaling @@ -167,7 +183,8 @@ def exchange(self, time): g_frames[j] = frame_i self.swaps.append({"time": time, "i": i, "j": j}) - logger.info(f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") + logger.info( + f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") # all together now: update own trajectory's last frame to g_frames[rank] new_last_frame = comm.scatter(g_frames, root=0) @@ -179,7 +196,7 @@ def exchange(self, time): def report(self): if rank == 0: counts = np.zeros(shape=len(self.trajs)) - #len of counts is no of temps + # len of counts is no of temps possible = self.current_idx * (len(self.trajs) - 1) for swap in self.swaps: counts[swap["i"]] += 1 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..cd1eb7e --- /dev/null +++ b/setup.cfg @@ -0,0 +1,6 @@ +[metadata] +name = presto +version = 0.2.2-dev + +[options] +packages = presto \ No newline at end of file From 24b3ea780752227f5f41a14ab6dc070ca9ddbc3a Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 1 Jun 2021 00:51:54 -0400 Subject: [PATCH 13/30] cleanup parallel remd testing files --- presto/partest/dce.xyz | 10 - presto/partest/dce_remd.sh | 16 -- presto/partest/old/300k.yaml | 28 -- presto/partest/old/400k.yaml | 28 -- presto/partest/pseudo | 15 - presto/partest/run_remd_mpi.py | 51 ---- presto/partest/serial/dce.xyz | 10 - presto/partest/serial/dce_remd.sh | 18 -- presto/partest/serial/run.py | 37 --- presto/partest/serial/template.yaml | 26 -- presto/partest/template.yaml | 26 -- presto/partest/test/notes | 2 - presto/partest/test/par_test.py | 34 --- presto/partest/test/run.py | 17 -- tutorial/notes | 9 + tutorial/tutorial00/analyze.py | 39 +++ tutorial/tutorial00/presto_tut_00.sh | 15 + tutorial/tutorial01/mine/AcCl_NaN3.xyz | 13 + tutorial/tutorial01/mine/solvated.xyz | 313 +++++++++++++++++++++ tutorial/tutorial01/presto_tut_01_equil.sh | 15 + 20 files changed, 404 insertions(+), 318 deletions(-) delete mode 100644 presto/partest/dce.xyz delete mode 100644 presto/partest/dce_remd.sh delete mode 100644 presto/partest/old/300k.yaml delete mode 100644 presto/partest/old/400k.yaml delete mode 100644 presto/partest/pseudo delete mode 100644 presto/partest/run_remd_mpi.py delete mode 100644 presto/partest/serial/dce.xyz delete mode 100644 presto/partest/serial/dce_remd.sh delete mode 100644 presto/partest/serial/run.py delete mode 100644 presto/partest/serial/template.yaml delete mode 100644 presto/partest/template.yaml delete mode 100644 presto/partest/test/notes delete mode 100644 presto/partest/test/par_test.py delete mode 100644 presto/partest/test/run.py create mode 100644 tutorial/notes create mode 100644 tutorial/tutorial00/analyze.py create mode 100644 tutorial/tutorial00/presto_tut_00.sh create mode 100644 tutorial/tutorial01/mine/AcCl_NaN3.xyz create mode 100644 tutorial/tutorial01/mine/solvated.xyz create mode 100644 tutorial/tutorial01/presto_tut_01_equil.sh diff --git a/presto/partest/dce.xyz b/presto/partest/dce.xyz deleted file mode 100644 index 6643077..0000000 --- a/presto/partest/dce.xyz +++ /dev/null @@ -1,10 +0,0 @@ -8 -C2H4Cl2 -C -1.259345218 0.000000000 -1.676453798 -H -0.376267218 -0.509845000 -2.075709798 -H -2.142423218 -0.509845000 -2.075709798 -C -1.259345218 0.000000000 -0.146465798 -H -2.142423218 0.509845000 0.252790202 -H -0.376267218 0.509845000 0.252790202 -Cl -1.259345218 -1.648164277 0.498867074 -Cl -1.259345218 1.648164277 -2.321786671 diff --git a/presto/partest/dce_remd.sh b/presto/partest/dce_remd.sh deleted file mode 100644 index e19fad6..0000000 --- a/presto/partest/dce_remd.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=dce_remd_par -#SBATCH --ntasks=8 -#SBATCH --cpus-per-task=8 -#SBATCH --partition=day -#SBATCH -t 1:00:00 -#SBATCH --mem-per-cpu=8100mb -#SBATCH --mail-type=END,FAIL - -module purge -module load miniconda -source activate presto-d - -mpiexec python run.py - - diff --git a/presto/partest/old/300k.yaml b/presto/partest/old/300k.yaml deleted file mode 100644 index 6d841f6..0000000 --- a/presto/partest/old/300k.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# presto config file for nprocshared=2 - -type: equilibration - -timestep: 1 -high_atoms: 1-8 -stop_time: 250 - -anchor: 1 - -integrator: - type: langevin - viscosity: 0.0001 - -potential: - type: spherical_harmonic - radius: 8 - -calculator: - type: gaussian - route_card: "#p force b3lyp/6-31g empiricaldispersion=gd3 pop=none SCRF=(PCM, solvent=dichloromethane)" - link0: - nprocshared: 8 - mem: "64GB" - -bath_scheduler: - type: constant - target_temp: 300.00 diff --git a/presto/partest/old/400k.yaml b/presto/partest/old/400k.yaml deleted file mode 100644 index 1086ea9..0000000 --- a/presto/partest/old/400k.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# presto config file for nprocshared=2 - -type: equilibration - -timestep: 1 -high_atoms: 1-8 -stop_time: 250 - -anchor: 1 - -integrator: - type: langevin - viscosity: 0.0001 - -potential: - type: spherical_harmonic - radius: 8 - -calculator: - type: gaussian - route_card: "#p force b3lyp/6-31g empiricaldispersion=gd3 pop=none SCRF=(PCM, solvent=dichloromethane)" - link0: - nprocshared: 8 - mem: "64GB" - -bath_scheduler: - type: constant - target_temp: 400.00 diff --git a/presto/partest/pseudo b/presto/partest/pseudo deleted file mode 100644 index 5d97114..0000000 --- a/presto/partest/pseudo +++ /dev/null @@ -1,15 +0,0 @@ -constraints: traj needs to be buit from a yaml, need to write one yaml per t - -for each cycle: - set up trajectories - - for each traj: - read setup info - run as separate job (run.py has master script that takes temp as param) - dump frame with attrs into chk file - - exchange script starts (slurm controls dependency): - for each traj, loads frame info from chk - compares energies and - - diff --git a/presto/partest/run_remd_mpi.py b/presto/partest/run_remd_mpi.py deleted file mode 100644 index 2980853..0000000 --- a/presto/partest/run_remd_mpi.py +++ /dev/null @@ -1,51 +0,0 @@ -from mpi4py import MPI -import argparse, copy, cctk, dill, logging, math, os, random, re, sys, time, yaml -import numpy as np -import presto - -logging.basicConfig(level=logging.INFO, filename=f"remd.log", - format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') - -logger = logging.getLogger(__name__) - -MPI.pickle.__init__(dill.dumps, dill.loads) -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -parser = argparse.ArgumentParser(prog="run_remd_mpi.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") -parser.add_argument("input", default=None, type=str, help="name of input geometry (.xyz)") -parser.add_argument("template", type=str, default="template.yaml", help="path to template file (usually ends in .yaml)") -parser.add_argument("checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") -parser.add_argument("--mintemp", "-a", default=100, type=int, help="minimum trajectory temperature (K)") -parser.add_argument("--maxtemp", "-z", default=800, type=int, help="maximum trajectory temperature (K)") -parser.add_argument("--trajs", "-n", default=8, type=int, help="number of trajectories (equal to slurm --ntasks)") -parser.add_argument("--swap", "-s", default=50, type=int, help="time interval between swaps (fs)") - -args = vars(parser.parse_args(sys.argv[1:])) - -try: - all_trajs = [] - - if rank == 0: - for temp in np.geomspace(args["mintemp"], args["maxtemp"], num=args["trajs"]): - name = f"{int(temp)}k" - with open(args["template"], 'r') as file: - filedata = file.read() - filedata = filedata.replace("", f"{temp:.2f}") - with open(f"{name}.yaml", 'w') as file: - file.write(filedata) - traj = presto.config.build( - f"{name}.yaml", f"{name}.chk", geometry=args["input"]) - all_trajs.append(traj) - - trajs = comm.bcast(all_trajs, root=0) - remd = presto.replica_exchange_mpi.ReplicaExchange(trajectories=trajs, swap_interval=args["swap"], checkpoint_filename=args["checkpoint_filename"]) - remd.run() - - if rank == 0: - print(remd.report()) - -except Exception as e: - print(e) - sys.exit(1) diff --git a/presto/partest/serial/dce.xyz b/presto/partest/serial/dce.xyz deleted file mode 100644 index 6643077..0000000 --- a/presto/partest/serial/dce.xyz +++ /dev/null @@ -1,10 +0,0 @@ -8 -C2H4Cl2 -C -1.259345218 0.000000000 -1.676453798 -H -0.376267218 -0.509845000 -2.075709798 -H -2.142423218 -0.509845000 -2.075709798 -C -1.259345218 0.000000000 -0.146465798 -H -2.142423218 0.509845000 0.252790202 -H -0.376267218 0.509845000 0.252790202 -Cl -1.259345218 -1.648164277 0.498867074 -Cl -1.259345218 1.648164277 -2.321786671 diff --git a/presto/partest/serial/dce_remd.sh b/presto/partest/serial/dce_remd.sh deleted file mode 100644 index c3a1c15..0000000 --- a/presto/partest/serial/dce_remd.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=dce_remd_p2 -#SBATCH --nodes=1 -#SBATCH --cpus-per-task=8 -#SBATCH --partition=day -#SBATCH -t 15:00:00 -#SBATCH --mem-per-cpu=8100mb -#SBATCH --mail-type=END,FAIL - -module purge -module load SciPy-bundle -module load miniconda -module load Gaussian -source activate presto-d - -python ./run.py - - diff --git a/presto/partest/serial/run.py b/presto/partest/serial/run.py deleted file mode 100644 index df62845..0000000 --- a/presto/partest/serial/run.py +++ /dev/null @@ -1,37 +0,0 @@ -import logging, re, sys, os -logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') -import numpy as np -import presto - -logger = logging.getLogger(__name__) - -for n_trajs in [2]: - - try: - logger.info(f"\n{n_trajs} trajectories:\n----------------------------\n") - trajs = [] - for temp in np.geomspace(300, 400, num=n_trajs): - name = f"{int(temp)}k" - - with open("template.yaml", 'r') as file : - filedata = file.read() - filedata = filedata.replace("", f"{temp:.2f}") - with open(f"{name}.yaml", 'w') as file: - file.write(filedata) - traj = presto.config.build(f"{name}.yaml", f"{name}.chk", geometry="dce.xyz") - trajs.append(traj) - - remd = presto.replica_exchange.ReplicaExchange(trajectories=trajs, swap_interval=50, checkpoint_filename="remd.chk") - remd.run() - print(remd.report()) - - for temp in np.geomspace(300, 400, num=n_trajs): - name = f"{int(temp)}k" - os.remove(f"{name}.yaml") - os.remove(f"{name}.chk") - - os.rename("./remd.chk", f"./remd_{n_trajs}.chk") - - except Exception as e: - print(e) - sys.exit(1) diff --git a/presto/partest/serial/template.yaml b/presto/partest/serial/template.yaml deleted file mode 100644 index 97e4894..0000000 --- a/presto/partest/serial/template.yaml +++ /dev/null @@ -1,26 +0,0 @@ -# presto config file for nprocshared=2 - -type: equilibration - -timestep: 1 -high_atoms: 1-8 -stop_time: 250 - -anchor: 1 - -integrator: - type: langevin - viscosity: 0.0001 - -potential: - type: spherical_harmonic - radius: 8 - -calculator: - type: xtb - gfn : 2 - parallel: 8 - -bath_scheduler: - type: constant - target_temp: diff --git a/presto/partest/template.yaml b/presto/partest/template.yaml deleted file mode 100644 index 97e4894..0000000 --- a/presto/partest/template.yaml +++ /dev/null @@ -1,26 +0,0 @@ -# presto config file for nprocshared=2 - -type: equilibration - -timestep: 1 -high_atoms: 1-8 -stop_time: 250 - -anchor: 1 - -integrator: - type: langevin - viscosity: 0.0001 - -potential: - type: spherical_harmonic - radius: 8 - -calculator: - type: xtb - gfn : 2 - parallel: 8 - -bath_scheduler: - type: constant - target_temp: diff --git a/presto/partest/test/notes b/presto/partest/test/notes deleted file mode 100644 index b2a7635..0000000 --- a/presto/partest/test/notes +++ /dev/null @@ -1,2 +0,0 @@ -tested that calling mpi comm world on calling script and imported script -is fine diff --git a/presto/partest/test/par_test.py b/presto/partest/test/par_test.py deleted file mode 100644 index d378388..0000000 --- a/presto/partest/test/par_test.py +++ /dev/null @@ -1,34 +0,0 @@ -import numpy as np - -from mpi4py import MPI -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -class ParTest(object): - """Testing how MPI4py works in classes - - """ - def __init__(self, x, y): - self.x = x - self.y = y - - def add(self): - print(f"for process {rank}, self.x is at {id(self.x)}") - if not rank: - return self.x + self.y - else: - return 'abc' - -if __name__ == "__main__": - p = ParTest(1, 2) - # print("pre-addition") - print(p.add()) - - # sendbuf = float(rank) - # recvbuf = None - # if rank == 0: - # recvbuf = np.empty(size, dtype='f') - #recvbuf = comm.gather(sendbuf, root=0) - #print(f"sendbuf of process {rank}:{sendbuf}") - #print(f"recvbuf of process {rank}:{recvbuf}") diff --git a/presto/partest/test/run.py b/presto/partest/test/run.py deleted file mode 100644 index e3505b8..0000000 --- a/presto/partest/test/run.py +++ /dev/null @@ -1,17 +0,0 @@ -import logging, re, sys, os -#logging.basicConfig(level=logging.INFO, filename=f"remd.log", format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') -#import numpy as np -#import presto -import dill -from par_test import ParTest -#logger = logging.getLogger(__name__) - -from mpi4py import MPI -MPI.pickle.__init__(dill.dumps, dill.loads) -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -p = ParTest(1, 2) -# print("pre-addition") -print(p.add()) diff --git a/tutorial/notes b/tutorial/notes new file mode 100644 index 0000000..5eda46f --- /dev/null +++ b/tutorial/notes @@ -0,0 +1,9 @@ +Notes for use of presto: + +1. preequilibration of solvent (preequil.yaml) +2. equilibration of system (equil.yaml) + +(1) and (2) are run with run.py + +3. reaction simulation (rxn.yaml) +(3) is run with run_ts.py \ No newline at end of file diff --git a/tutorial/tutorial00/analyze.py b/tutorial/tutorial00/analyze.py new file mode 100644 index 0000000..cf31da9 --- /dev/null +++ b/tutorial/tutorial00/analyze.py @@ -0,0 +1,39 @@ + +import argparse, math, sys, os, subprocess, glob, re, shutil, logging, presto +import numpy as np +from asciichartpy import plot + +parser = argparse.ArgumentParser(prog="analyze.py", description="Analyze a single presto job -- prints temperature and energy as a function of time, and can write a movie.") +parser.add_argument("--cutoff", "-c", default=0, type=int, help="index of first frame to analyze, defaults to 0 (i.e. analyzing all frames)") +parser.add_argument("--movie", "-m", default=False, help="which atoms to include in movie, either 'high' or 'all'. if blank, no movie will be written.") +parser.add_argument("config_filename", type=str, help="path to config file (usually ends in .yaml)") +parser.add_argument("checkpoint_filename", type=str, help="path to checkpoint file (usually ends in .chk)") + +args = vars(parser.parse_args(sys.argv[1:])) + +traj = presto.config.build(args["config_filename"], args["checkpoint_filename"], load_frames=slice(args["cutoff"], None, None)) +print(f"{len(traj.frames)} frames loaded from {args['checkpoint_filename']} ({traj.num_frames()} total)") +if traj.finished: + print("trajectory finished!") + +temps = np.array([f.temperature() for f in traj.frames]) +energies = np.array([f.energy for f in traj.frames][:-1]) +rel_energies = energies - np.min(energies) +rel_energies = energies * 627.509 + +max_width = 100 +scale = math.ceil(len(energies) / max_width) +if scale < 1: + scale == 1 + +height = 16 + +print(f"TEMPERATURE:\t\t{np.mean(temps):.2f} K (± {np.std(temps):.2f})") +print(plot(np.mean(temps[:(len(temps)//scale)*scale].reshape(-1,scale), axis=1), {"height": height})) +print(f"ENERGY:\t\t\t{np.mean(energies):.2f} (± {np.std(energies)*627.509:.2f} kcal/mol)") +print(plot(np.mean(rel_energies[:(len(rel_energies)//scale)*scale].reshape(-1,scale), axis=1), {"height":height})) + +if args["movie"]: + movie_path = re.sub("chk$", "pdb", args["checkpoint_filename"]) + print(f"writing movie to {movie_path}...") + traj.write_movie(movie_path, idxs=args["movie"]) diff --git a/tutorial/tutorial00/presto_tut_00.sh b/tutorial/tutorial00/presto_tut_00.sh new file mode 100644 index 0000000..836dd35 --- /dev/null +++ b/tutorial/tutorial00/presto_tut_00.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH --job-name=presto_tut_00 +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=8 +#SBATCH --partition=day +#SBATCH -t 00:05:00 +#SBATCH --mem-per-cpu=8000mb +#SBATCH --mail-type=END,FAIL + +module load miniconda +conda activate presto-d + +python test_presto.py + + diff --git a/tutorial/tutorial01/mine/AcCl_NaN3.xyz b/tutorial/tutorial01/mine/AcCl_NaN3.xyz new file mode 100644 index 0000000..60fac94 --- /dev/null +++ b/tutorial/tutorial01/mine/AcCl_NaN3.xyz @@ -0,0 +1,13 @@ +11 +close to TS + C -1.08358600 -0.26735500 0.52360200 + O -0.22813100 -1.05036100 0.86101600 + C -1.70614000 0.77957400 1.39400000 + H -1.02897400 1.64083300 1.33607900 + H -2.69423200 1.07404900 1.04220300 + H -1.74041800 0.41054300 2.42232800 + Cl -1.73177300 -0.35921400 -1.14209900 + N 1.57453200 1.21832200 -0.27449400 + N 0.66337300 1.95262400 -0.23529500 + N 2.50446800 0.46198300 -0.31822300 + Na 1.84277800 -1.55633900 0.18340100 diff --git a/tutorial/tutorial01/mine/solvated.xyz b/tutorial/tutorial01/mine/solvated.xyz new file mode 100644 index 0000000..ef225fe --- /dev/null +++ b/tutorial/tutorial01/mine/solvated.xyz @@ -0,0 +1,313 @@ + 311 + Built with Packmol + C -0.753758 -0.658688 -0.002991 + O 0.101697 -1.441694 0.334423 + C -1.376312 0.388241 0.867407 + H -0.699146 1.249500 0.809486 + H -2.364404 0.682716 0.515610 + H -1.410590 0.019210 1.895735 + Cl -1.401945 -0.750547 -1.668692 + N 1.904360 0.826989 -0.801087 + N 0.993201 1.561291 -0.761888 + N 2.834296 0.070650 -0.844816 + Na 2.172606 -1.947672 -0.343192 + C 0.327934 -2.453899 -8.984994 + H 0.277427 -2.900961 -8.014177 + H 0.928236 -1.569326 -8.939521 + H 0.764544 -3.146200 -9.674190 + C -1.091750 -2.087193 -9.455763 + N -2.161122 -1.810972 -9.810369 + C -5.205138 -6.586187 1.956134 + H -4.451093 -6.778046 2.690645 + H -6.147176 -6.951573 2.308210 + H -5.273688 -5.532659 1.782122 + C -4.835907 -7.300461 0.642711 + N -4.557785 -7.838486 -0.346621 + C -2.567489 -3.702633 5.530558 + H -2.793906 -4.700232 5.216819 + H -3.320161 -3.363303 6.211175 + H -1.614562 -3.689352 6.017029 + C -2.529835 -2.774334 4.302371 + N -2.501472 -2.075096 3.377243 + C 0.978981 2.554762 9.199888 + H 0.157182 3.054428 9.668802 + H 1.330789 1.771007 9.837743 + H 0.658564 2.139024 8.267475 + C 2.116576 3.561988 8.948947 + N 2.973466 4.320678 8.759927 + C -8.881401 -1.433952 -0.132785 + H -9.886845 -1.796926 -0.180031 + H -8.306353 -1.872811 -0.921216 + H -8.881046 -0.369440 -0.241017 + C -8.262463 -1.812012 1.225739 + N -7.796250 -2.096785 2.249042 + C 5.180780 -2.547945 6.041074 + H 4.646032 -2.242412 5.166092 + H 4.715841 -2.127461 6.908211 + H 5.168411 -3.615519 6.112012 + C 6.637384 -2.056356 5.950269 + N 7.734566 -1.686068 5.881869 + C 4.995053 -4.983618 1.879699 + H 4.441182 -4.079643 1.734936 + H 4.571293 -5.761538 1.279560 + H 6.014107 -4.827261 1.593374 + C 4.935437 -5.390077 3.363895 + N 4.890532 -5.696242 4.481860 + C 6.741755 4.115500 3.695467 + H 7.715847 3.998612 3.268405 + H 6.347085 5.073075 3.426791 + H 6.095639 3.346916 3.325721 + C 6.837744 4.011728 5.228965 + N 6.910048 3.933562 6.384068 + C 2.196605 4.959932 1.494640 + H 2.660715 5.682741 0.856637 + H 1.216794 4.736710 1.127159 + H 2.784705 4.066143 1.508024 + C 2.092402 5.527287 2.922523 + N 2.013912 5.954645 3.998071 + C -2.774953 -5.680957 -6.037438 + H -2.597342 -4.797261 -5.460864 + H -2.327073 -6.521263 -5.549393 + H -3.828904 -5.841501 -6.128610 + C -2.158290 -5.512339 -7.438471 + N -1.693791 -5.385328 -8.493795 + C 6.477149 1.305912 -4.506183 + H 7.041989 2.063902 -5.007488 + H 7.143795 0.646754 -3.990437 + H 5.812447 1.762762 -3.803076 + C 5.661404 0.506146 -5.538914 + N 5.046947 -0.096275 -6.316816 + C -8.723344 -2.058586 -3.305789 + H -9.409259 -1.257679 -3.124217 + H -9.014522 -2.914279 -2.733158 + H -8.731745 -2.306304 -4.346685 + C -7.304969 -1.623209 -2.893165 + N -6.236583 -1.295262 -2.582357 + C -4.115322 2.074959 -7.497615 + H -4.252817 1.898527 -8.543974 + H -3.992953 1.140272 -6.991368 + H -3.243890 2.677814 -7.349050 + C -5.347763 2.806478 -6.934082 + N -6.276095 3.357493 -6.509603 + C 2.542265 -8.151151 -3.656131 + H 2.845875 -7.175629 -3.974057 + H 1.918717 -8.592467 -4.405349 + H 3.407344 -8.762813 -3.506440 + C 1.757668 -8.039673 -2.335683 + N 1.166674 -7.955702 -1.341061 + C -5.817602 -4.061581 4.995508 + H -6.786164 -4.509843 4.919039 + H -5.801759 -3.385969 5.825084 + H -5.082078 -4.824601 5.142835 + C -5.505003 -3.290617 3.699554 + N -5.269538 -2.709890 2.723381 + C -1.087836 -5.838515 7.443334 + H -1.688338 -5.001370 7.732273 + H -0.266715 -5.939587 8.121895 + H -1.681548 -6.728378 7.466819 + C -0.550862 -5.617174 6.017056 + N -0.146389 -5.450450 4.942717 + C -2.706064 -6.231979 -2.715133 + H -2.771964 -5.430956 -2.008790 + H -3.630502 -6.315018 -3.247504 + H -1.913221 -6.034081 -3.405883 + C -2.421821 -7.550162 -1.971360 + N -2.207716 -8.543079 -1.411115 + C 3.885038 4.948419 5.467694 + H 3.254436 5.747063 5.798464 + H 4.835505 5.019660 5.953943 + H 3.429868 4.010846 5.709926 + C 4.079776 5.045840 3.943166 + N 4.226462 5.119221 2.794820 + C 0.605901 -0.430194 8.900450 + H 0.913967 -1.052293 9.714692 + H 0.134296 -1.031033 8.151129 + H -0.085584 0.305237 9.255259 + C 1.836496 0.271449 8.296354 + N 2.763438 0.799959 7.841321 + C 6.468548 0.437619 3.946502 + H 6.031517 -0.246078 3.249034 + H 7.260490 -0.050092 4.475525 + H 6.859152 1.283257 3.419980 + C 5.395562 0.906486 4.946736 + N 4.587339 1.259658 5.700158 + C 4.631204 5.034690 -6.382117 + H 5.194958 5.939449 -6.474274 + H 4.576882 4.751693 -5.351650 + H 3.643003 5.189943 -6.761924 + C 5.320276 3.916368 -7.185943 + N 5.839318 3.073996 -7.791422 + C 2.925362 -0.179218 3.752872 + H 2.394731 -0.278688 4.676688 + H 3.941029 -0.486629 3.890056 + H 2.464035 -0.794118 3.008576 + C 2.891240 1.291382 3.297053 + N 2.865537 2.399107 2.953709 + C 8.089380 -4.812923 -1.256707 + H 8.374114 -4.922480 -2.282292 + H 7.084663 -4.448924 -1.202419 + H 8.152039 -5.761626 -0.765855 + C 9.035437 -3.813707 -0.565229 + N 9.748052 -3.061051 -0.044374 + C -3.356845 4.172349 -2.277226 + H -3.085625 3.409794 -2.977119 + H -3.400535 3.754192 -1.293287 + H -2.626460 4.953948 -2.300492 + C -4.735527 4.746774 -2.652557 + N -5.774014 5.179458 -2.935273 + C 3.626378 -8.773593 0.662062 + H 4.594016 -8.989093 0.259399 + H 3.575065 -9.121388 1.672659 + H 3.457831 -7.717193 0.639431 + C 2.550139 -9.483294 -0.180335 + N 1.739465 -10.017874 -0.814868 + C 6.160966 3.411476 -0.199189 + H 7.186331 3.569140 0.062856 + H 6.106244 2.943514 -1.159875 + H 5.698984 2.780959 0.531510 + C 5.428873 4.765548 -0.245329 + N 4.877426 5.785498 -0.280084 + C -0.218266 9.330792 -0.007311 + H 0.742316 9.226609 -0.467016 + H -0.101392 9.740430 0.974237 + H -0.826641 9.984671 -0.596567 + C -0.893390 7.950070 0.089712 + N -1.401926 6.910046 0.162794 + C 4.001452 -2.392478 -2.475394 + H 3.247037 -1.646319 -2.613255 + H 4.422813 -2.297056 -1.496492 + H 3.566155 -3.363970 -2.583183 + C 5.107302 -2.205501 -3.530730 + N 5.940281 -2.064661 -4.325659 + C -4.653904 5.762199 2.863304 + H -5.651217 5.442157 3.082029 + H -4.329122 6.454227 3.611979 + H -4.001199 4.914383 2.854077 + C -4.625369 6.447036 1.484253 + N -4.603876 6.962888 0.445487 + C -3.333356 8.886154 1.356336 + H -2.842602 9.556492 2.030656 + H -2.917909 7.905837 1.462559 + H -4.379119 8.856595 1.580848 + C -3.132489 9.374834 -0.090193 + N -2.981187 9.742931 -1.179785 + C -6.659511 -0.742087 -5.754528 + H -6.777826 -1.580374 -5.100176 + H -5.717189 -0.271944 -5.565069 + H -6.693976 -1.075224 -6.770762 + C -7.795862 0.267231 -5.506366 + N -8.651814 1.027497 -5.319440 + C 5.809883 5.650046 -2.893630 + H 5.329277 6.571111 -3.149674 + H 6.362686 5.776398 -1.986247 + H 5.071162 4.887938 -2.758046 + C 6.769176 5.239419 -4.026211 + N 7.491761 4.930114 -4.879324 + C 3.373993 8.083031 3.821581 + H 3.827971 8.862385 3.245897 + H 3.734171 7.133865 3.483563 + H 3.622387 8.211558 4.854383 + C 1.844717 8.142450 3.650163 + N 0.692795 8.187207 3.521043 + C -0.335897 8.319363 -3.885632 + H -0.229975 8.225868 -2.825001 + H -1.287340 8.753337 -4.112176 + H 0.442263 8.946462 -4.267883 + C -0.238945 6.926775 -4.535939 + N -0.165917 5.877812 -5.025780 + C -7.550695 0.611065 5.073460 + H -6.661643 0.188406 4.654121 + H -8.000578 -0.094220 5.740602 + H -7.302684 1.502403 5.610962 + C -8.539719 0.951602 3.943210 + N -9.284698 1.208110 3.091853 + C 5.082623 -6.979130 -2.380441 + H 5.175808 -7.952870 -1.946797 + H 5.899983 -6.366823 -2.061219 + H 5.093841 -7.061213 -3.447229 + C 3.755974 -6.340798 -1.928629 + N 2.756679 -5.859977 -1.588302 + C 0.212336 -5.387201 -4.957044 + H -0.119437 -6.391063 -4.792467 + H 0.350100 -5.224469 -6.005586 + H -0.520918 -4.703424 -4.583297 + C 1.546903 -5.160729 -4.222714 + N 2.552161 -4.990139 -3.669581 + C 4.509319 -4.454962 -5.217535 + H 3.742637 -3.750734 -4.970223 + H 5.281381 -4.416153 -4.477729 + H 4.092722 -5.440092 -5.246952 + C 5.101161 -4.106527 -6.595910 + N 5.546964 -3.844069 -7.634166 + C 8.017368 -1.451798 -1.378369 + H 7.531136 -0.498658 -1.377230 + H 7.813583 -1.955050 -2.300382 + H 9.073194 -1.313703 -1.273192 + C 7.490879 -2.298052 -0.204374 + N 7.094303 -2.935491 0.679933 + C 2.037972 -3.853900 6.438487 + H 1.001133 -3.776561 6.185738 + H 2.580333 -3.061817 5.965888 + H 2.152761 -3.781064 7.499815 + C 2.584443 -5.210049 5.954925 + N 2.996070 -6.231563 5.590683 + C 2.521501 6.613542 -2.080576 + H 3.405115 7.214657 -2.027778 + H 2.588292 5.817921 -1.368237 + H 1.665730 7.217384 -1.861643 + C 2.385300 6.024405 -3.496897 + N 2.282707 5.580640 -4.563737 + C -1.024845 1.699689 -6.501495 + H -0.320449 1.024286 -6.062683 + H -1.851548 1.835045 -5.835806 + H -0.551720 2.642847 -6.678997 + C -1.529762 1.119513 -7.835682 + N -1.910090 0.682498 -8.840654 + C -3.520269 5.425990 -6.229570 + H -2.765962 5.155555 -5.520496 + H -4.458916 5.010336 -5.927786 + H -3.600590 6.491969 -6.275785 + C -3.139356 4.879231 -7.617936 + N -2.852434 4.467386 -8.663718 + C -6.620404 3.880267 0.362509 + H -6.316968 3.156787 1.090110 + H -7.637344 4.160972 0.541217 + H -5.993700 4.744418 0.435899 + C -6.495475 3.273801 -1.047523 + N -6.401373 2.816982 -2.109625 + C -0.008140 -5.261710 -0.054245 + H -0.560678 -4.820040 -0.857071 + H 0.885541 -5.706979 -0.438914 + H 0.248126 -4.507186 0.659842 + C -0.867962 -6.342481 0.627106 + N -1.515621 -7.156569 1.140332 + C -7.710787 -4.901754 -0.134369 + H -8.049290 -3.890699 -0.224276 + H -7.159130 -5.013599 0.775612 + H -8.553878 -5.560527 -0.123618 + C -6.804149 -5.247802 -1.330136 + N -6.121227 -5.508461 -2.230843 + C 0.123242 5.338726 6.766326 + H 0.038330 5.519845 7.817461 + H -0.853619 5.294824 6.331911 + H 0.680460 6.131044 6.311748 + C 0.849423 4.000892 6.532962 + N 1.396417 2.993172 6.357181 + C -1.136750 5.712290 3.387717 + H -0.165679 6.023661 3.711708 + H -1.510499 4.961197 4.051848 + H -1.799739 6.552136 3.389790 + C -1.042235 5.136411 1.962575 + N -0.971043 4.702632 0.889091 + C 2.782878 1.009091 -3.522089 + H 2.161094 0.171092 -3.285355 + H 2.471462 1.857420 -2.949151 + H 3.800616 0.775262 -3.288782 + C 2.661203 1.330760 -5.023196 + N 2.569552 1.573057 -6.153901 + C 8.305648 -0.509922 1.529778 + H 7.360002 -0.990124 1.671410 + H 8.968272 -1.172444 1.013160 + H 8.170423 0.380889 0.952655 + C 8.907610 -0.147355 2.900101 + N 9.361036 0.125747 3.932293 diff --git a/tutorial/tutorial01/presto_tut_01_equil.sh b/tutorial/tutorial01/presto_tut_01_equil.sh new file mode 100644 index 0000000..d0d5df3 --- /dev/null +++ b/tutorial/tutorial01/presto_tut_01_equil.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH --job-name=presto_tut_00 +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=16 +#SBATCH --partition=day +#SBATCH -t 24:00:00 +#SBATCH --mem-per-cpu=9000mb +#SBATCH --mail-type=END,FAIL + +module load miniconda +conda activate presto + +python run.py + + From 3609d03ccd93f037d15443eade460a56fb662439 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 1 Jun 2021 02:11:26 -0400 Subject: [PATCH 14/30] add mpi run script --- scripts/run_remd_mpi.py | 51 +++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 scripts/run_remd_mpi.py diff --git a/scripts/run_remd_mpi.py b/scripts/run_remd_mpi.py new file mode 100644 index 0000000..2980853 --- /dev/null +++ b/scripts/run_remd_mpi.py @@ -0,0 +1,51 @@ +from mpi4py import MPI +import argparse, copy, cctk, dill, logging, math, os, random, re, sys, time, yaml +import numpy as np +import presto + +logging.basicConfig(level=logging.INFO, filename=f"remd.log", + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') + +logger = logging.getLogger(__name__) + +MPI.pickle.__init__(dill.dumps, dill.loads) +comm = MPI.COMM_WORLD +size = comm.Get_size() +rank = comm.Get_rank() + +parser = argparse.ArgumentParser(prog="run_remd_mpi.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") +parser.add_argument("input", default=None, type=str, help="name of input geometry (.xyz)") +parser.add_argument("template", type=str, default="template.yaml", help="path to template file (usually ends in .yaml)") +parser.add_argument("checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") +parser.add_argument("--mintemp", "-a", default=100, type=int, help="minimum trajectory temperature (K)") +parser.add_argument("--maxtemp", "-z", default=800, type=int, help="maximum trajectory temperature (K)") +parser.add_argument("--trajs", "-n", default=8, type=int, help="number of trajectories (equal to slurm --ntasks)") +parser.add_argument("--swap", "-s", default=50, type=int, help="time interval between swaps (fs)") + +args = vars(parser.parse_args(sys.argv[1:])) + +try: + all_trajs = [] + + if rank == 0: + for temp in np.geomspace(args["mintemp"], args["maxtemp"], num=args["trajs"]): + name = f"{int(temp)}k" + with open(args["template"], 'r') as file: + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build( + f"{name}.yaml", f"{name}.chk", geometry=args["input"]) + all_trajs.append(traj) + + trajs = comm.bcast(all_trajs, root=0) + remd = presto.replica_exchange_mpi.ReplicaExchange(trajectories=trajs, swap_interval=args["swap"], checkpoint_filename=args["checkpoint_filename"]) + remd.run() + + if rank == 0: + print(remd.report()) + +except Exception as e: + print(e) + sys.exit(1) diff --git a/setup.py b/setup.py index ba364e3..b925418 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ long_description_content_type="text/markdown", url="https://github.com/cwagen/presto", # packages=setuptools.find_packages(), - install_requires=["cctk", "tqdm", "h5py", "pyyaml", "matplotlib", "asciichartpy", "fasteners"], + install_requires=["cctk", "tqdm", "h5py", "pyyaml", "matplotlib", "asciichartpy", "fasteners", "dill"], classifiers=[ "Programming Language :: Python :: 3", "Development Status :: 3 - Alpha", From b45fd2bdd8a0cc1c10723b7f86c2f2a957860a16 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 4 Jun 2021 03:23:19 -0400 Subject: [PATCH 15/30] add feature: slurm-parallelized remd --- presto/__init__.py | 1 + presto/config.py | 2 +- presto/controller.py | 2 +- presto/replica_exchange_par.py | 191 +++++++++++++++++++++++++++++++++ presto/test/300k.yaml | 24 +++++ presto/test/dce.xyz | 10 ++ presto/test/save_empty_traj.py | 6 ++ presto/test/test.sh | 16 +++ presto/trajectory.py | 29 ++--- scripts/run_remd_par.py | 104 ++++++++++++++++++ scripts/run_traj_temp.py | 36 +++++++ 11 files changed, 400 insertions(+), 21 deletions(-) create mode 100644 presto/replica_exchange_par.py create mode 100644 presto/test/300k.yaml create mode 100644 presto/test/dce.xyz create mode 100644 presto/test/save_empty_traj.py create mode 100644 presto/test/test.sh create mode 100644 scripts/run_remd_par.py create mode 100644 scripts/run_traj_temp.py diff --git a/presto/__init__.py b/presto/__init__.py index 95bc5a2..d595c1f 100644 --- a/presto/__init__.py +++ b/presto/__init__.py @@ -8,6 +8,7 @@ import presto.constraints import presto.replica_exchange import presto.replica_exchange_mpi +import presto.replica_exchange_par import presto.controller import presto.checks import presto.reporters diff --git a/presto/config.py b/presto/config.py index 73863e7..e2e3bae 100644 --- a/presto/config.py +++ b/presto/config.py @@ -52,7 +52,7 @@ def check_directory(field_name, directory): def build(file, checkpoint, geometry=None, oldchk=None, oldchk_idx=-1, **args): """ - Build a *presto* trajectory from a ``.yml`` config file. + Build a *presto* trajectory from a ``.yaml`` config file. The config file does not specify the actual structure (geometry and atomic numbers). This can come from one of two sources: 1. An existing ``presto`` trajectory saved as an ``.chk`` file. diff --git a/presto/controller.py b/presto/controller.py index 4377335..bf2e02c 100644 --- a/presto/controller.py +++ b/presto/controller.py @@ -49,7 +49,7 @@ def run(self, checkpoint_interval=25, end_time=None, runtime=None, **kwargs): try: new_frame = current_frame.next(forwards=self.trajectory.forwards, temp=bath_temperature) except Exception as e: - logger.info(f"Error at time {current_time} - terminating run") + logger.error(f"Error at time {current_time} - terminating run") raise ValueError(f"Controller failed: {e}") assert new_frame.time == current_time, f"frame time {new_frame.time} does not match loop time {current_time}" self.trajectory.frames.append(new_frame) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py new file mode 100644 index 0000000..73dd100 --- /dev/null +++ b/presto/replica_exchange_par.py @@ -0,0 +1,191 @@ +# presto/presto/replica_exchange_par.py +# Marcus Sak, Jun 2021 +# parallel ReplicaExchange class + +import numpy as np +import logging +import random +import sys +import subprocess +import presto + +logger = logging.getLogger(__name__) + +MIN_CHECKPOINT_INTERVAL = 50 + +class ReplicaExchange(): + """ + Runs several trajectories and manages interconversions between them. + + Based on: + http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf + """ + + def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): + for idx, traj in enumerate(trajectories): + assert isinstance( + traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" + assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" + assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" + assert np.array_equal( + traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" + assert np.array_equal( + traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" + + # sort by temp + self.trajectories = sorted( + trajectories, key=lambda x: x.bath_scheduler(0)) + self.stop_time = trajectories[0].stop_time + + self.swaps = list() + assert isinstance(swap_interval, (float, int)) + assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" + assert self.stop_time % swap_interval == 0, "stop time must a multiple of timestep" + self.swap_interval = swap_interval + + assert isinstance(checkpoint_filename, str) + self.checkpoint_filename = checkpoint_filename + self.finished = False + self.current_idx = 0 + + def __str__(self): + return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" + + def __repr__(self): + return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" + + def update_trajs(self): + """ + Updates all trajectories from respective chk files on newly unpickled remd object + Not run in the first iteration + """ + self.current_idx += 1 + + for traj in self.trajectories: + traj.load_from_checkpoint() + # ensure all the trajectories are run up to the same time + assert traj.last_time_run() == self.current_idx * self.swap_interval + + if self.current_idx * self.swap_interval == self.stop_time: + self.finished = True + + def run(self, slurm=True): + """ generates a (slurm) job array for trajectories in each segment and submits it + """ + + # always self.update_trajs before self.run + if self.finished: + logger.info(f"Replica exchange already finished!") + return self + + next_idx = self.current_idx + 1 + target_time = next_idx * self.swap_interval + + #time_remaining = max( + # 0, target_time - self.trajectories[0].last_time_run()) + + #if not time_remaining: + # return + + #temps_str = ','.join([str(temp) for temp in self.temps]) + + is_gaussian = False + if isinstance(self.trajectories[0].calculator, presto.calculators.XTBCalculator): + n_threads = self.trajectories[0].calculator.parallel + elif isinstance(self.trajectories[0].calculator, presto.calculators.GaussianCalculator): + is_gaussian = True + n_threads = int( + self.trajectories[0].calculator.link0["nprocshared"]) + + if slurm: + with open(f"traj_array.sh", 'w') as f: + f.write("#!/bin/bash\n") + f.write(f"#SBATCH --job-name=remd_traj_array_{target_time}fs\n") + f.write(f"#SBATCH --output=slurm-traj_arrays.out\n") + f.write(f"#SBATCH --open-mode=append\n") + f.write(f"#SBATCH --ntasks=1\n") + f.write(f"#SBATCH --cpus-per-task={n_threads}\n") + f.write(f"#SBATCH --array=0-{len(self.trajectories)-1}\n") + f.write(f"#SBATCH --partition=day\n") + # TODO: modifiable time and mem? + f.write(f"#SBATCH -t 00:15:00\n") + f.write(f"#SBATCH --mem-per-cpu=8000mb\n") + #f.write(f"#SBATCH --mail-type=END,FAIL\n") + f.write("\n") + f.write(f"module purge\n") + # TODO: needs to be modifiable, maybe use template file + # load anaconda module + f.write(f"module load miniconda\n") + #f.write(f"source /gpfs/loomis/apps/avx/software/miniconda/4.9.2/etc/profile.d/conda.sh\n") + # load gaussian module + if is_gaussian: + f.write(f"module load Gaussian\n") + #activate presto venv + f.write(f"conda activate presto-d\n") + f.write(f"python run_traj_temp.py -i $SLURM_ARRAY_TASK_ID -c {self.checkpoint_filename}\n") + + try: + sbatch_msg = subprocess.check_output(['sbatch', 'traj_array.sh']) + if 'Submitted' not in sbatch_msg.decode('utf-8'): + raise subprocess.CalledProcessError + + except subprocess.CalledProcessError as e: + logger.error("Could not submit slurm job array script") + sys.exit(1) + + return int(sbatch_msg.split()[-1]) # slurm jobid of the + + def exchange(self): + """ time is from 0 + """ + time = self.current_idx * self.swap_interval + kB = presto.constants.BOLTZMANN_CONSTANT + + # make one pass from low to high T + for i in range(len(self.trajectories)-1): + j = i+1 + + E_i = self.trajectories[i].frames[-2].energy + E_j = self.trajectories[j].frames[-2].energy + T_i = self.trajectories[i].bath_scheduler(0) + T_j = self.trajectories[j].bath_scheduler(0) + b_i = 1 / (kB*T_i) + b_j = 1 / (kB*T_j) + + p = min(1, np.exp((E_i - E_j) * (b_i - b_j))) + logger.info(f"E{i} & E{j}\tp={p}") + + if p > random.random(): + # or momenta scaling + v_i_scaling = np.sqrt(T_j/T_i) + v_j_scaling = np.sqrt(T_i/T_j) + + frame_i = self.trajectories[i].frames[-1] + frame_j = self.trajectories[j].frames[-1] + frame_i.velocities *= v_i_scaling + frame_j.velocities *= v_j_scaling + + self.trajectories[i].frames[-1] = frame_j + self.trajectories[j].frames[-1] = frame_i + + self.swaps.append({"time": time, "i": i, "j": j}) + logger.info( + f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") + + for traj in self.trajectories: + traj.save() + + def report(self): + counts = np.zeros(shape=len(self.trajectories)) + # len of counts is no of temps + possible = self.current_idx * (len(self.trajectories) - 1) + + for swap in self.swaps: + counts[swap["i"]] += 1 + + text = f"Time: {self.current_idx * self.swap_interval} fs\n" + text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" + for i in range(len(self.trajectories) - 1): + text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" + + return text diff --git a/presto/test/300k.yaml b/presto/test/300k.yaml new file mode 100644 index 0000000..d4ce2ea --- /dev/null +++ b/presto/test/300k.yaml @@ -0,0 +1,24 @@ +type: equilibration + +timestep: 1 +high_atoms: 1-8 +stop_time: 250 + +anchor: 1 + +integrator: + type: langevin + viscosity: 0.0001 + +potential: + type: spherical_harmonic + radius: 8 + +calculator: + type: xtb + gfn : 2 + parallel: 8 + +bath_scheduler: + type: constant + target_temp: 300.00 diff --git a/presto/test/dce.xyz b/presto/test/dce.xyz new file mode 100644 index 0000000..6643077 --- /dev/null +++ b/presto/test/dce.xyz @@ -0,0 +1,10 @@ +8 +C2H4Cl2 +C -1.259345218 0.000000000 -1.676453798 +H -0.376267218 -0.509845000 -2.075709798 +H -2.142423218 -0.509845000 -2.075709798 +C -1.259345218 0.000000000 -0.146465798 +H -2.142423218 0.509845000 0.252790202 +H -0.376267218 0.509845000 0.252790202 +Cl -1.259345218 -1.648164277 0.498867074 +Cl -1.259345218 1.648164277 -2.321786671 diff --git a/presto/test/save_empty_traj.py b/presto/test/save_empty_traj.py new file mode 100644 index 0000000..9add969 --- /dev/null +++ b/presto/test/save_empty_traj.py @@ -0,0 +1,6 @@ +import presto + +traj = presto.config.build("300k.yaml", checkpoint="300k.chk", geometry="dce.xyz") +traj.save() + +traj2 = presto.trajectory.Trajectory.new_from_checkpoint("300k.chk", -1) diff --git a/presto/test/test.sh b/presto/test/test.sh new file mode 100644 index 0000000..11780e2 --- /dev/null +++ b/presto/test/test.sh @@ -0,0 +1,16 @@ +#!/bin/bash +#SBATCH --job-name=test +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=1 +#SBATCH --partition=day +#SBATCH -t 1:00:00 +#SBATCH --mem-per-cpu=6000mb +#SBATCH --mail-type=END,FAIL + +module purge +module load miniconda +source activate presto-d + +python slurm_submit.py --spawn + + diff --git a/presto/trajectory.py b/presto/trajectory.py index 204aee3..fe41805 100644 --- a/presto/trajectory.py +++ b/presto/trajectory.py @@ -107,7 +107,8 @@ def __init__( self.set_inactive_atoms(kwargs["inactive_atoms"]) else: # assume all atoms are active - self.set_inactive_atoms(np.ndarray([])) + self.set_inactive_atoms(None) + if not hasattr(self, "masses"): self.masses = cctk.OneIndexedArray([float(cctk.helper_functions.draw_isotopologue(z)) for z in atomic_numbers]) @@ -139,14 +140,17 @@ def __repr__(self): def set_inactive_atoms(self, inactive_atoms): """ Since sometimes it's easier to specify the inactive atoms than the inactive atoms, this method updates ``self.active_atoms`` with the complement of ``inactive_atoms``. + + Args: + inactive_atoms (None or np.ndarray) """ - assert isinstance(inactive_atoms, (list, np.ndarray)), "Need list of atoms!" active_atoms = list(range(1, len(self.atomic_numbers)+1)) - if len(inactive_atoms): + if inactive_atoms: + assert isinstance(inactive_atoms, (list, np.ndarray)), "Need list of atoms!" for atom in inactive_atoms: active_atoms.remove(atom) - active_atoms = np.array(active_atoms) - self.active_atoms = active_atoms + + self.active_atoms = np.array(active_atoms) def run(self, checkpoint_interval=10, keep_all=False, time=None, **kwargs): """ @@ -229,15 +233,7 @@ def load_from_checkpoint(self, frames=slice(None)): all_velocities= h5.get("all_velocities")[frames] all_accels = h5.get("all_accelerations")[frames] temperatures = h5.get("bath_temperatures")[frames] - - # v0.2.2 - provisionally removing this -# all_times = None -# try: all_times = h5.get("all_times")[frames] -# except Exception as e: -# all_times = np.arange(0, self.timestep*len(all_energies)*self.save_interval, self.timestep*self.save_interval) -# # this was added recently, so may be some backwards compatibility issues. -# pass if isinstance(all_energies, np.ndarray): assert len(all_positions) == len(all_energies) @@ -284,11 +280,6 @@ def save(self, keep_all=False): all_energies = h5.get("all_energies") old_n_frames = len(all_energies) - # v0.2.2 - provisionally removing this -# if "all_times" not in h5: -# # time is a new column, so old checkpoints may not have it. -# old_times = np.arange(0, self.timestep, self.timestep*old_n_frames) -# h5.create_dataset("all_times", data=old_times, maxshape=(None,), compression="gzip", compression_opts=9) all_times = h5.get("all_times") last_saved_time = all_times[-1] @@ -437,7 +428,7 @@ def as_ensemble(self, idxs=None): return ensemble @classmethod - def new_from_checkpoint(cls, checkpoint, frame): + def new_from_checkpoint(cls, checkpoint, frame): # TODO: shouldn't frame be a slice? """ Creates new trajectory from the given checkpoint file. diff --git a/scripts/run_remd_par.py b/scripts/run_remd_par.py new file mode 100644 index 0000000..af1a671 --- /dev/null +++ b/scripts/run_remd_par.py @@ -0,0 +1,104 @@ +# presto/scripts/run_remd_par.py +# Marcus Sak, Jun 2021 +# Manager script to run slurm-parallelized remd + +import argparse +import logging +import os +import sys +import numpy as np +import presto +import dill +import subprocess + +logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') + +logger = logging.getLogger(__name__) + + +def sbatch_self(slurm_script, dependency): + with open(slurm_script, 'r') as f: + source = f.read().splitlines() # no newline in source + + with open(slurm_script, 'w') as f: + for line in source: + if "python" in line and "--spawn" not in line: + line += " --spawn" + f.write(line+'\n') + + try: + subprocess.run( + ['sbatch', f'--dependency=afterok:{dependency}', slurm_script]) + logger.info(f"Self-spawned with dependency on slurm job array {dependency}") + except subprocess.CalledProcessError as e: + logger.error("Could not submit slurm script") + sys.exit(1) + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser( + prog="run_remd_par.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") + parser.add_argument("--checkpoint_filename", type=str, default="remd.chk", + help="path to checkpoint file (usually ends in .chk)") + parser.add_argument("--input", default=None, type=str, + help="path of input geometry (.xyz)") + parser.add_argument("--template", "-t", type=str, default="template.yaml", + help="path to template file (usually ends in .yaml)") + parser.add_argument("--mintemp", "-a", default=100, + type=int, help="minimum trajectory temperature (K)") + parser.add_argument("--maxtemp", "-z", default=800, + type=int, help="maximum trajectory temperature (K)") + parser.add_argument("--trajs", "-n", default=8, type=int, + help="number of trajectories (equal to slurm --ntasks)") + parser.add_argument("--swap", "-s", default=50, type=int, + help="time interval between swaps (fs)") + parser.add_argument('--spawn', action='store_true', + help="add this flag when recursively called from run_remd_par.py") + + args = vars(parser.parse_args(sys.argv[1:])) + chkfile = args["checkpoint_filename"] + + if not args["spawn"]: # new remd run + all_trajs = [] + temps = np.geomspace( + args["mintemp"], args["maxtemp"], num=args["trajs"]) + for temp in temps: + name = f"{int(temp)}k" + with open(args["template"], 'r') as file: + filedata = file.read() + filedata = filedata.replace("", f"{temp:.2f}") + with open(f"{name}.yaml", 'w') as file: + file.write(filedata) + traj = presto.config.build( + f"{name}.yaml", f"{name}.chk", geometry=args["input"]) + all_trajs.append(traj) + remd = presto.replica_exchange_par.ReplicaExchange(trajectories=all_trajs, checkpoint_filename=args["checkpoint_filename"], + swap_interval=args["swap"]) + else: + try: + with (open(chkfile, "rb")) as f: + remd = dill.load(f) + except FileNotFoundError: + print("checkpoint file not found, do not call this script with --spawn on the first instance") + logger.info(f"Loaded ReplicaExchange from {chkfile}.") + remd.update_trajs() # load each traj from chkfile and add 1 to current index + remd.exchange() # pass self.current_idx * self.swap_interval as current time + # exchannge will save trajectories into chkfile + if remd.finished: + with (open(args["checkpoint_filename"], "wb")) as f: + dill.dump(remd, f) + logger.info(f"Replica exchange completed, saved ReplicaExchange to {chkfile}.") + print(remd.report()) + sys.exit(0) + + + with (open(args["checkpoint_filename"], "wb")) as f: + dill.dump(remd, f, protocol=-1) # HIGHEST_PROTOCOL + logger.info(f"Saved ReplicaExchange to {chkfile}.") + trajs_slurm_job_id = remd.run() # nonblocking, needs to return slurm jobID of submitted array + + slurm_script = f'remd_{os.path.splitext(args["input"])[0]}.sh' + sbatch_self(slurm_script, trajs_slurm_job_id) + sys.exit(0) diff --git a/scripts/run_traj_temp.py b/scripts/run_traj_temp.py new file mode 100644 index 0000000..34bd2bb --- /dev/null +++ b/scripts/run_traj_temp.py @@ -0,0 +1,36 @@ +# presto/scripts/run_traj_temp.py +# Marcus Sak, Jun 2021 +# Script to run one trajectory as part of slurm job array + +import sys +import presto +import logging +import argparse +import dill + +logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') + +logger = logging.getLogger(__name__) + +MIN_CHECKPOINT_INTERVAL = 50 + +parser = argparse.ArgumentParser( + prog="run_traj_temp.py", description="Script to run single trajectory at specified temperature, usually called by replica_exchange_par.py") +parser.add_argument("--checkpoint_filename", "-c", type=str, + help="path to remd checkpoint file") +parser.add_argument("--index", "-i", type=int, help="index of trajectory") +parser.add_argument("--swap", "-s", default=50, type=int, + help="time interval between swaps (fs)") + +args = vars(parser.parse_args(sys.argv[1:])) + +chkfile = args["checkpoint_filename"] +with (open(chkfile, "rb")) as f: + remd = dill.load(f) + +traj = remd.trajectories[args["index"]] +traj.run(time=args["swap"], checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, args["swap"])) +traj.save() + +sys.exit(0) \ No newline at end of file From c7b8c648f69a7d101df7932efa605a51d7ea20eb Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 4 Jun 2021 08:40:54 -0400 Subject: [PATCH 16/30] add documentation for slurm-parallel remd --- presto/replica_exchange_par.py | 34 ++++++++ .../{run_remd_par.py => remd_par_manager.py} | 26 ++---- scripts/remd_par_readme.md | 87 +++++++++++++++++++ scripts/run_traj_temp.py | 5 +- 4 files changed, 130 insertions(+), 22 deletions(-) rename scripts/{run_remd_par.py => remd_par_manager.py} (77%) create mode 100644 scripts/remd_par_readme.md diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index 73dd100..db8638b 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -8,6 +8,7 @@ import sys import subprocess import presto +import dill logger = logging.getLogger(__name__) @@ -176,6 +177,8 @@ def exchange(self): traj.save() def report(self): + + counts = np.zeros(shape=len(self.trajectories)) # len of counts is no of temps possible = self.current_idx * (len(self.trajectories) - 1) @@ -189,3 +192,34 @@ def report(self): text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" return text + + def save(self): + """ + Saves ReplicaExchange object to chkfile (pickle), keeping only the last frame of each trajectory + + """ + for traj in self.trajectories: + traj.frames = [traj.frames[-1]] + + with (open(self.checkpoint_filename, "wb")) as f: + dill.dump(self, f, protocol=-1) # HIGHEST_PROTOCOL + + logger.info(f"Saved ReplicaExchange to {self.checkpoint_filename}.") + + @classmethod + def load(cls, checkpoint): + """ Loads ReplicaExchange object from chkfile + + Returns: + ReplicaExchange object + """ + + try: + with (open(checkpoint, "rb")) as f: + remd = dill.load(f) + except FileNotFoundError: + print("checkpoint file not found, do not call this script with --spawn on the first instance") + logger.info(f"Loaded ReplicaExchange from {checkpoint}.") + + return remd + diff --git a/scripts/run_remd_par.py b/scripts/remd_par_manager.py similarity index 77% rename from scripts/run_remd_par.py rename to scripts/remd_par_manager.py index af1a671..2254f1e 100644 --- a/scripts/run_remd_par.py +++ b/scripts/remd_par_manager.py @@ -1,4 +1,4 @@ -# presto/scripts/run_remd_par.py +# presto/scripts/remd_par_manager.py # Marcus Sak, Jun 2021 # Manager script to run slurm-parallelized remd @@ -8,7 +8,6 @@ import sys import numpy as np import presto -import dill import subprocess logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', @@ -39,7 +38,7 @@ def sbatch_self(slurm_script, dependency): if __name__ == "__main__": parser = argparse.ArgumentParser( - prog="run_remd_par.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") + prog="remd_par_manager.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") parser.add_argument("--checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") parser.add_argument("--input", default=None, type=str, @@ -51,11 +50,11 @@ def sbatch_self(slurm_script, dependency): parser.add_argument("--maxtemp", "-z", default=800, type=int, help="maximum trajectory temperature (K)") parser.add_argument("--trajs", "-n", default=8, type=int, - help="number of trajectories (equal to slurm --ntasks)") + help="number of trajectories") parser.add_argument("--swap", "-s", default=50, type=int, help="time interval between swaps (fs)") parser.add_argument('--spawn', action='store_true', - help="add this flag when recursively called from run_remd_par.py") + help="add this flag when recursively called from remd_par_manager.py") args = vars(parser.parse_args(sys.argv[1:])) chkfile = args["checkpoint_filename"] @@ -77,26 +76,17 @@ def sbatch_self(slurm_script, dependency): remd = presto.replica_exchange_par.ReplicaExchange(trajectories=all_trajs, checkpoint_filename=args["checkpoint_filename"], swap_interval=args["swap"]) else: - try: - with (open(chkfile, "rb")) as f: - remd = dill.load(f) - except FileNotFoundError: - print("checkpoint file not found, do not call this script with --spawn on the first instance") - logger.info(f"Loaded ReplicaExchange from {chkfile}.") + remd = presto.replica_exchange_par.ReplicaExchange.load(args["checkpoint_filename"]) remd.update_trajs() # load each traj from chkfile and add 1 to current index remd.exchange() # pass self.current_idx * self.swap_interval as current time # exchannge will save trajectories into chkfile if remd.finished: - with (open(args["checkpoint_filename"], "wb")) as f: - dill.dump(remd, f) - logger.info(f"Replica exchange completed, saved ReplicaExchange to {chkfile}.") + remd.save() print(remd.report()) + logger.info(f"Replica exchange completed.") sys.exit(0) - - with (open(args["checkpoint_filename"], "wb")) as f: - dill.dump(remd, f, protocol=-1) # HIGHEST_PROTOCOL - logger.info(f"Saved ReplicaExchange to {chkfile}.") + remd.save() trajs_slurm_job_id = remd.run() # nonblocking, needs to return slurm jobID of submitted array slurm_script = f'remd_{os.path.splitext(args["input"])[0]}.sh' diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md new file mode 100644 index 0000000..a739ad2 --- /dev/null +++ b/scripts/remd_par_readme.md @@ -0,0 +1,87 @@ +# Parallelized replica exchange molecular dynamics (REMD) in _presto_ + +## Overview + +A challenge in conventional molecular dynamics (MD) is the propensity for the system to be trapped in local potential energy minima. This issue is even more pronounced in the context of _ab initio_ MD, because the cost of simulating each timestep is higher. [Replica exchange molecular dynamics](http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf) (REMD), also known as parallel tempering, is an established approach to accelerate exploration of the potential energy surface. + +In _presto_, REMD is implemented as a loop: + +1. Run _n\_trajs_ trajectories with temperatures uniformly spanning _mintemp_ and _maxtemp_, for time _swap\_interval_. +2. Collect all the trajectories and make a pass through them, exchanging configurations between adjacent trajectories based on the Metropolis criterion. +3. Repeat until _stop\_time_. + +The bottleneck in this loop is step (1), which is fortunately embarrassingly parallel. Huge gains in computation time can be realized by running the trajectories in parallel, subject to computational resources. More details about the parallel implementation can be found [below](#parallelizing-remd-with-Slurm). + +## Required files and input arguments + +This implementation of parallelized REMD requires the [Slurm](https://Slurm.schedmd.com/documentation.html) scheduling system to be installed, and assumes that jobs are submitted using `sbatch `. + +### Provided files + +1. `scripts/remd_par_manager.py`: manager script that handles the main REMD loop + - `--checkpoint_filename`: path to checkpoint file (default remd.chk) + - `--input`: path of input geometry (.xyz) + - `--template`: path to [config file](https://github.com/corinwagen/presto/blob/master/CONFIG.md) (default template.yaml) + - `--mintemp`: minimum trajectory temperature in K + - `--maxtemp`: maximum trajectory temperature in K + - `--trajs`: number of trajectories + - `--swap`: length of swap interval in fs (default 50) + + Run `$ python run_remd_par.py --help` for more details and options. +2. `scripts/run_traj_temp.py`: auxiliary script to run individual trajectories, not intended to be called alone +3. `presto/replica_exchange_par.py`: contains the ReplicaExchange class + + `ReplicaExchange.run()` writes and submits a Slurm script for a job array for trajectories every swap interval. The `#SBATCH` options and `module load` commands are (currently) hardcoded and may have to be changed depending on the resource requirements of the trajectories. The code also assumes that `run_traj_temp.py` is in the directory from which the job was submitted. + +### User-supplied files + +1. a template for the .yaml config file, with the `target_temp` field filled with \. The intended runtime of the trajectories is supplied here in the `stop_time` field, as with a usual single-trajectory run. +2. the geometry input file, in `.xyz` format +3. `remd_.sh`: Slurm submit script for `remd_par_manager.py`. Example: + + ```sh + #!/bin/bash + #SBATCH --job-name=remd_par_manager + #SBATCH --output=slurm-remd_par_manager.out + #SBATCH --open-mode=append + #SBATCH --ntasks=1 + #SBATCH --cpus-per-task=1 + #SBATCH --partition=day + #SBATCH -t 00:05:00 + #SBATCH --mem-per-cpu=4000mb + #SBATCH --mail-type=END,FAIL + + module purge + # load anaconda module + module load miniconda + # activate presto environment + conda activate presto + + python run_remd_par.py --input geom.xyz --mintemp 300 --maxtemp 400 --trajs 3 --template template.yaml + ``` + +## Instructions + +After setting up all the necessary files, initiate the run using `$ sbatch run_remd_par.py`. The only practical resource limitation is that the runtime of each trajectory for the swap interval (e.g. 25 fs) on one node cannot exceed the walltime of the cluster/partition. The total REMD runtime (`stop_time` in the config file) is restricted only by `sys.maxint` and the available storage for the trajectory checkpoint files; the number of trajectories is additionally restricted by the system-dependent Slurm `MaxArraySize` configuration parameter (usually 4E6). + +To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. + +## Parallelizing REMD with Slurm + +This implementation leverages the [Slurm job array](https://Slurm.schedmd.com/job_array.html) feature to run trajectories as individual Slurm jobs within a Slurm job array. + +In summary, for every _swap\_interval_ chunk, + +1. The manager script creates a `ReplicaExchange` object or loads one from the checkpoint file. +2. ReplicaExchange.run() is called, which writes a Slurm submit script for the job array consisting of _n\_trajs_ independent calls to the auxiliary script. +3. The manager script submits itself as a new job to the Slurm scheduler, with a dependency on completion of the job array. +4. Each instance of the auxiliary script runs one trajectory (`presto.trajectory.run()`) and saves the trajectory to its own checkpoint file (e.g. 300k.chk) +5. The new manager script instance is run, which assembles the newly completed trajectories into the `ReplicaExchange` object and exchanges the configurations, and saves the `ReplicaExchange` object to the checkpoint file. + +This approach + +- parallelizes the trajectory runs +- sidesteps limitations on the total REMD runtime due to cluster walltime limits +- sidesteps limitations on the number of trajectories due to the maximum number of nodes available + +The one notable tradeoff occurs in cases where each _swap\_interval_ chunk takes a short time to run, because the trajectory runs are resubmitted as new jobs after each _swap\_interval_ and therefore the usual cost of scheduling and waiting for new resources to become available. In any reasonable use case, this tradeoff pales in comparison to the computation time of serialized REMD, or in an MPI implementation, the time required for a large number of nodes and cores to become simultaneously available. diff --git a/scripts/run_traj_temp.py b/scripts/run_traj_temp.py index 34bd2bb..be48682 100644 --- a/scripts/run_traj_temp.py +++ b/scripts/run_traj_temp.py @@ -24,10 +24,7 @@ help="time interval between swaps (fs)") args = vars(parser.parse_args(sys.argv[1:])) - -chkfile = args["checkpoint_filename"] -with (open(chkfile, "rb")) as f: - remd = dill.load(f) +remd = presto.replica_exchange_par.ReplicaExchange.load(args["checkpoint_filename"]) traj = remd.trajectories[args["index"]] traj.run(time=args["swap"], checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, args["swap"])) From 623e3480d79775834d9fb2df2af9ae1907266a65 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 4 Jun 2021 08:47:59 -0400 Subject: [PATCH 17/30] update parallel remd documentation --- scripts/remd_par_readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md index a739ad2..5e16d69 100644 --- a/scripts/remd_par_readme.md +++ b/scripts/remd_par_readme.md @@ -84,4 +84,4 @@ This approach - sidesteps limitations on the total REMD runtime due to cluster walltime limits - sidesteps limitations on the number of trajectories due to the maximum number of nodes available -The one notable tradeoff occurs in cases where each _swap\_interval_ chunk takes a short time to run, because the trajectory runs are resubmitted as new jobs after each _swap\_interval_ and therefore the usual cost of scheduling and waiting for new resources to become available. In any reasonable use case, this tradeoff pales in comparison to the computation time of serialized REMD, or in an MPI implementation, the time required for a large number of nodes and cores to become simultaneously available. +The one notable drawback occurs in cases where each _swap\_interval_ chunk takes a short time to run, because the trajectory runs are resubmitted as new jobs after each _swap\_interval_—this incurs the usual cost of scheduling and waiting for new resources to become available. In any reasonable use case, this drawback pales in comparison to the computation time of serialized REMD, or in an MPI implementation, the time required for a large number of nodes and cores to become simultaneously available. From fe4851c72365f0fffbffdbf632c555517134da92 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 8 Jun 2021 00:16:28 -0400 Subject: [PATCH 18/30] require additional Slurm submit script --- presto/replica_exchange_par.py | 96 +++++++++++++++++++++------------- scripts/remd_par_readme.md | 62 +++++++++++++++++++--- 2 files changed, 114 insertions(+), 44 deletions(-) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index db8638b..9a7f86f 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -9,11 +9,18 @@ import subprocess import presto import dill +import re +import os logger = logging.getLogger(__name__) MIN_CHECKPOINT_INTERVAL = 50 + +class MissingSbatchFlags(Exception): + pass + + class ReplicaExchange(): """ Runs several trajectories and manages interconversions between them. @@ -82,10 +89,10 @@ def run(self, slurm=True): next_idx = self.current_idx + 1 target_time = next_idx * self.swap_interval - #time_remaining = max( + # time_remaining = max( # 0, target_time - self.trajectories[0].last_time_run()) - #if not time_remaining: + # if not time_remaining: # return #temps_str = ','.join([str(temp) for temp in self.temps]) @@ -99,42 +106,58 @@ def run(self, slurm=True): self.trajectories[0].calculator.link0["nprocshared"]) if slurm: - with open(f"traj_array.sh", 'w') as f: - f.write("#!/bin/bash\n") - f.write(f"#SBATCH --job-name=remd_traj_array_{target_time}fs\n") - f.write(f"#SBATCH --output=slurm-traj_arrays.out\n") - f.write(f"#SBATCH --open-mode=append\n") - f.write(f"#SBATCH --ntasks=1\n") - f.write(f"#SBATCH --cpus-per-task={n_threads}\n") - f.write(f"#SBATCH --array=0-{len(self.trajectories)-1}\n") - f.write(f"#SBATCH --partition=day\n") - # TODO: modifiable time and mem? - f.write(f"#SBATCH -t 00:15:00\n") - f.write(f"#SBATCH --mem-per-cpu=8000mb\n") - #f.write(f"#SBATCH --mail-type=END,FAIL\n") - f.write("\n") - f.write(f"module purge\n") - # TODO: needs to be modifiable, maybe use template file - # load anaconda module - f.write(f"module load miniconda\n") - #f.write(f"source /gpfs/loomis/apps/avx/software/miniconda/4.9.2/etc/profile.d/conda.sh\n") - # load gaussian module - if is_gaussian: - f.write(f"module load Gaussian\n") - #activate presto venv - f.write(f"conda activate presto-d\n") - f.write(f"python run_traj_temp.py -i $SLURM_ARRAY_TASK_ID -c {self.checkpoint_filename}\n") + slurm_script = 'traj_array.sh' + + assert os.path.exists(slurm_script), "The Slurm submit script traj.array.sh is required but not found" + + # dict to ensure that (some) necessary sbatch options are specified + sbatch_flags = {'-J': False, '-c': False, '--array': False} + with open(slurm_script, 'r') as f: + source = f.read().splitlines() # no newline in source + + with open(slurm_script, 'w') as f: + for line in source: + if "job-name" in line or '-J ' in line: + # modify job name appropriately + line = re.sub('array_(.*?)fs', f'array_{target_time}fs', line) + sbatch_flags['-J'] = True + elif "cpus-per-task" in line or '#SBATCH -c' in line: + # check if cpus-per-task is equal to n_threads + sbatch_flags['-c'] = True + thread_match = re.search('(\d+)$', line) + input_threads = int(thread_match.group()) + if input_threads != n_threads: + line = re.sub('(\d+)$', str(n_threads), line) + logger.warning( + "--cpus-per-task in traj_array.sh is not equal to number of processors specified in config file, automatically changing") + elif "--array" in line: + # check if array size is equal to num of trajs + input_trajs = int(re.search('(\d+)$', line).group()) + sbatch_flags['--array'] = True + if input_trajs != len(self.trajectories) - 1: + line = re.sub('(\d+)$', str(len(self.trajectories) - 1), line) + logger.warning( + "--array size in traj_array.sh is not equal to number of trajectories specified when calling remd_par_manager.py, automatically changing") + + f.write(line+'\n') + + for k, v in sbatch_flags.items(): + if not v: + logger.error( + f"did not specify sbatch option {k} in traj_array.sh, exiting now") + sys.exit(1) try: - sbatch_msg = subprocess.check_output(['sbatch', 'traj_array.sh']) + sbatch_msg = subprocess.check_output( + ['sbatch', slurm_script]) if 'Submitted' not in sbatch_msg.decode('utf-8'): raise subprocess.CalledProcessError except subprocess.CalledProcessError as e: logger.error("Could not submit slurm job array script") sys.exit(1) - - return int(sbatch_msg.split()[-1]) # slurm jobid of the + logger.info("Wrote and submitted traj_array.sh") + return int(sbatch_msg.split()[-1]) # slurm jobid of the def exchange(self): """ time is from 0 @@ -178,7 +201,6 @@ def exchange(self): def report(self): - counts = np.zeros(shape=len(self.trajectories)) # len of counts is no of temps possible = self.current_idx * (len(self.trajectories) - 1) @@ -193,7 +215,7 @@ def report(self): return text - def save(self): + def save(self): """ Saves ReplicaExchange object to chkfile (pickle), keeping only the last frame of each trajectory @@ -202,8 +224,8 @@ def save(self): traj.frames = [traj.frames[-1]] with (open(self.checkpoint_filename, "wb")) as f: - dill.dump(self, f, protocol=-1) # HIGHEST_PROTOCOL - + dill.dump(self, f, protocol=-1) # HIGHEST_PROTOCOL + logger.info(f"Saved ReplicaExchange to {self.checkpoint_filename}.") @classmethod @@ -218,8 +240,8 @@ def load(cls, checkpoint): with (open(checkpoint, "rb")) as f: remd = dill.load(f) except FileNotFoundError: - print("checkpoint file not found, do not call this script with --spawn on the first instance") + print( + "checkpoint file not found, do not call this script with --spawn on the first instance") logger.info(f"Loaded ReplicaExchange from {checkpoint}.") - - return remd + return remd diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md index 5e16d69..065378c 100644 --- a/scripts/remd_par_readme.md +++ b/scripts/remd_par_readme.md @@ -14,7 +14,7 @@ The bottleneck in this loop is step (1), which is fortunately embarrassingly par ## Required files and input arguments -This implementation of parallelized REMD requires the [Slurm](https://Slurm.schedmd.com/documentation.html) scheduling system to be installed, and assumes that jobs are submitted using `sbatch `. +This implementation of parallelized REMD requires the [Slurm](https://Slurm.schedmd.com/documentation.html) scheduling system, and assumes that jobs are submitted using `sbatch `. ### Provided files @@ -31,8 +31,6 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche 2. `scripts/run_traj_temp.py`: auxiliary script to run individual trajectories, not intended to be called alone 3. `presto/replica_exchange_par.py`: contains the ReplicaExchange class - `ReplicaExchange.run()` writes and submits a Slurm script for a job array for trajectories every swap interval. The `#SBATCH` options and `module load` commands are (currently) hardcoded and may have to be changed depending on the resource requirements of the trajectories. The code also assumes that `run_traj_temp.py` is in the directory from which the job was submitted. - ### User-supplied files 1. a template for the .yaml config file, with the `target_temp` field filled with \. The intended runtime of the trajectories is supplied here in the `stop_time` field, as with a usual single-trajectory run. @@ -56,18 +54,68 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche module load miniconda # activate presto environment conda activate presto - + # add the path to run_remd_par.py if necessary. Remove --spawn whenever calling manually python run_remd_par.py --input geom.xyz --mintemp 300 --maxtemp 400 --trajs 3 --template template.yaml ``` -## Instructions +4. `traj_array.sh`: Slurm submit script for `scripts/run_traj_temp.py`, not intended to be called by the user. Example: + + ``` sh + #!/bin/bash + ### this file is not intended to be sbatch'ed on its own + #SBATCH --job-name=remd_traj_array_fs + #SBATCH --output=slurm-traj_arrays.out + #SBATCH --open-mode=append + #SBATCH --ntasks=1 + ## do not modify above this line + # set array indices from 0 to (number of trajectories - 1) + #SBATCH --array=0-2 + # settings below are per-trajectory + #SBATCH --cpus-per-task=4 + #SBATCH --mem-per-cpu=8000mb + #SBATCH -t 00:15:00 + #SBATCH --partition=day + + # unload all modules + module purge + # load anaconda module + module load miniconda + # load gaussian if necessary + # module load Gaussian + # activate presto environment + conda activate presto-d + + # add the path to run_traj_temp.py and the name of your checkfile after -c + python run_traj_temp.py -i $SLURM_ARRAY_TASK_ID -c remd.chk + + ``` + +### Output files + +1. `k.chk`: checkpoint file for a trajectory at \ K. Examine the trajectory with `scripts/analyze.py`. +2. `remd_par.log`: log file for all running modules. Use this file to monitor trajectory progress and check for warnings. +3. `remd.chk`: checkpoint file for `ReplicaExchange` object. Contains a pickled `ReplicaExchange` object that is loadable with `presto.replica_exchange_par.ReplicaExchange.load()`. +4. `slurm-remd_par_manager.out`: Slurm output file from manager script. Contains tracebacks of critical unhandled exceptions (look at this file if the job unexpectedly terminates). +5. `slurm-traj_arrays.out`: Slurm output file from run_traj_temp.py submit script. Rarely useful. + +## Instructions for use -After setting up all the necessary files, initiate the run using `$ sbatch run_remd_par.py`. The only practical resource limitation is that the runtime of each trajectory for the swap interval (e.g. 25 fs) on one node cannot exceed the walltime of the cluster/partition. The total REMD runtime (`stop_time` in the config file) is restricted only by `sys.maxint` and the available storage for the trajectory checkpoint files; the number of trajectories is additionally restricted by the system-dependent Slurm `MaxArraySize` configuration parameter (usually 4E6). +1. After setting up all the necessary files, initiate the run using `$ sbatch remd_.sh`. -To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. + The only practical resource limitation is that the runtime of each trajectory for the swap interval (e.g. 50 fs) on one node cannot exceed the walltime of the cluster/partition. The total REMD runtime (`stop_time` in the config file) is restricted only by `sys.maxint` and the available storage for the trajectory checkpoint files; the number of trajectories is additionally restricted by the system-dependent Slurm `MaxArraySize` configuration parameter (usually 4E6). + +2. This slurm script will start a job named `remd_par_manager`, which will initiate a Slurm job array named `remd_traj_array_fs`. + +3. The manager script will spawn another instance of itself (`remd_par_manager`), which will start running when the job array is completed. + +4. When the REMD run ends, each trajectory can be examined by running `scripts/analyze.py` on its .chk file. + +5. To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. ## Parallelizing REMD with Slurm +_This is meant as a developer's note, i.e. not required reading._ + This implementation leverages the [Slurm job array](https://Slurm.schedmd.com/job_array.html) feature to run trajectories as individual Slurm jobs within a Slurm job array. In summary, for every _swap\_interval_ chunk, From c7818d886db2ccde355a62fd618facebc1d317ec Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Wed, 9 Jun 2021 00:55:23 -0400 Subject: [PATCH 19/30] change final remd report location --- presto/replica_exchange_par.py | 2 +- scripts/remd_par_manager.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index 9a7f86f..b331cff 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -108,7 +108,7 @@ def run(self, slurm=True): if slurm: slurm_script = 'traj_array.sh' - assert os.path.exists(slurm_script), "The Slurm submit script traj.array.sh is required but not found" + assert os.path.exists(slurm_script), "The Slurm submit script traj_array.sh is required but not found" # dict to ensure that (some) necessary sbatch options are specified sbatch_flags = {'-J': False, '-c': False, '--array': False} diff --git a/scripts/remd_par_manager.py b/scripts/remd_par_manager.py index 2254f1e..13a91ce 100644 --- a/scripts/remd_par_manager.py +++ b/scripts/remd_par_manager.py @@ -82,8 +82,9 @@ def sbatch_self(slurm_script, dependency): # exchannge will save trajectories into chkfile if remd.finished: remd.save() - print(remd.report()) logger.info(f"Replica exchange completed.") + logger.info("\n\n----------------REPORT----------------\n") + logger.info(remd.report()) sys.exit(0) remd.save() From 9193419e1a1c16b5ec4d2dfcff17243a55e230a9 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 11 Jun 2021 03:59:08 -0400 Subject: [PATCH 20/30] add feature: trajectory demux and cluster analysis --- presto/replica_exchange_par.py | 2 +- presto/trajectory.py | 16 +++--- scripts/remd_demux.py | 101 +++++++++++++++++++++++++++++++++ scripts/remd_par_manager.py | 2 +- scripts/run_traj_temp.py | 5 +- scripts/traj_cluster.py | 68 ++++++++++++++++++++++ 6 files changed, 181 insertions(+), 13 deletions(-) create mode 100644 scripts/remd_demux.py create mode 100644 scripts/traj_cluster.py diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index b331cff..b8c9251 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -194,7 +194,7 @@ def exchange(self): self.swaps.append({"time": time, "i": i, "j": j}) logger.info( - f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") + f"\nConfigurations from trajectories {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") for traj in self.trajectories: traj.save() diff --git a/presto/trajectory.py b/presto/trajectory.py index fe41805..7236b72 100644 --- a/presto/trajectory.py +++ b/presto/trajectory.py @@ -409,7 +409,7 @@ def write_movie(self, filename, solvents="all", idxs=None): raise ValueError("``solvents`` must be int, 'high', or 'all'!") ensemble = self.as_ensemble(idxs) - logger.info("Writing trajectory to {filename}") + logger.info(f"Writing trajectory to {filename}") if re.search("pdb$", filename): cctk.PDBFile.write_ensemble_to_trajectory(filename, ensemble) elif re.search("mol2$", filename): @@ -423,12 +423,13 @@ def write_movie(self, filename, solvents="all", idxs=None): def as_ensemble(self, idxs=None): ensemble = cctk.ConformationalEnsemble() - for frame in self.frames[:-1]: + # for frame in self.frames[:-1]: # why is this up to only the second last frame? + for frame in self.frames: ensemble.add_molecule(frame.molecule(idxs), {"bath_temperature": frame.bath_temperature, "energy": frame.energy}) return ensemble @classmethod - def new_from_checkpoint(cls, checkpoint, frame): # TODO: shouldn't frame be a slice? + def new_from_checkpoint(cls, checkpoint, frame=slice(None)): """ Creates new trajectory from the given checkpoint file. @@ -439,12 +440,13 @@ def new_from_checkpoint(cls, checkpoint, frame): # TODO: shouldn't frame be a sl Returns: new ``Trajectory`` object """ - assert isinstance(frame, int), "need an integer frame number" + assert isinstance(frame, slice), "frame needs to be a Slice object" - new_traj = cls(checkpoint_filename=checkpoint) - new_traj.load_from_checkpoint(idxs=frame) + new_traj = cls(checkpoint_filename=checkpoint, stop_time=10000, save_interval=1) + # added defaults here to avoid errors when creating new trajectory object + new_traj.load_from_checkpoint(frames=frame) - assert len(new_traj.frames) == 1, "got too many frames!" + #assert len(new_traj.frames) == 1, "got too many frames!" return new_traj def initialize_lock(self): diff --git a/scripts/remd_demux.py b/scripts/remd_demux.py new file mode 100644 index 0000000..bd8e14f --- /dev/null +++ b/scripts/remd_demux.py @@ -0,0 +1,101 @@ +# presto/scripts/remd_par_manager.py +# Marcus Sak, Jun 2021 +# Script to demux remd replicas + +import argparse +import sys +import numpy as np +import presto +import logging +import copy +import os +from tqdm import tqdm + +logging.basicConfig(level=logging.INFO, filename=f"demux.log", filemode='a', + format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') + +logger = logging.getLogger(__name__) + + +def exchange(array, i, j): + array[[i, j]] = array[[j, i]] + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser( + prog="remd_demux.py", description="Given a completed REMD run, reconstructs the continuous trajectories of each replica and outputs trajectory checkfiles and the temperature evolution for each replica. Run $ python remd_demux.py --help for options.") + parser.add_argument("--checkpoint_filename", "-c", type=str, default="remd.chk", + help="path to checkpoint file (usually ends in .chk)") + + args = vars(parser.parse_args(sys.argv[1:])) + chkfile = args["checkpoint_filename"] + + remd = presto.replica_exchange_par.ReplicaExchange.load(chkfile) + assert remd.finished, "REMD run from this checkpoint file is unfinished!" + + trajs = remd.trajectories + swap_int = int(remd.swap_interval) + stop_time = int(remd.stop_time) + + # list of lists of temp history + traj_hists = np.zeros( + (len(trajs), int(stop_time/swap_int) + 1), dtype=int) + # add 1 to shape[1] if we don't want to ignore the last swap + + for i, hist in enumerate(traj_hists): + hist[0] = i # starting arrangement + + curr_time = 0 + curr_arrangement = np.arange(len(trajs)) # one col of traj_hists + + for i, swap in enumerate(remd.swaps): + while int(swap["time"]) != curr_time: + # finished swapping or no swaps for this time, write final arrangement for curr_time + traj_hists[:, int(curr_time/swap_int)] = curr_arrangement + curr_time += swap_int + exchange(curr_arrangement, swap["i"], swap["j"]) + + # we ignore the final swap + assert curr_time/swap_int == traj_hists.shape[1] - 1 # last column + traj_hists[:, int(curr_time/swap_int)] = curr_arrangement # do the final one + + demux_trajs = copy.deepcopy(trajs) + for traj in demux_trajs: + traj.frames = [] # empty frames, to be filled in demuxed order + + n_frames = (traj_hists.shape[1] - 1) * swap_int / int(traj.save_interval) + 1 + # include zeroth frame + + print("loading trajectories...") + for traj in tqdm(trajs): + traj.load_from_checkpoint() # loads every frame + assert len( + traj.frames) == n_frames, "expected number of frames should be equal to number of frames in trajectory" + + #hist = np.repeat(hist, swap_int / traj.save_interval) + + print("demuxing trajectories...") + for i, hist in tqdm(enumerate(traj_hists)): # each replica + for j in np.arange(n_frames, dtype=int): # each timestep + demux_trajs[i].frames.append(trajs[traj_hists[i, int(j/swap_int)]].frames[j]) + + print("writing demuxed trajectories to pdb files...") + for i, traj in tqdm(enumerate(demux_trajs)): + traj.checkpoint_filename = traj.checkpoint_filename.replace('.chk', '_demux.chk') + pdb_filename = f'traj{i}.pdb' + traj.write_movie(pdb_filename) + logger.info(f"Wrote movie to {pdb_filename}.") + + traj.save() + + times = np.arange(0, stop_time + 1, swap_int) + assert traj_hists.shape[1] == times.size, "length of time array should be the same as number of swaps" + + print("writing temperature evolutions to csv files...") + for i, hist in tqdm(enumerate(traj_hists)): + time_hist = np.array([times, hist]) + csv_filename = f"traj{i}.csv" + np.savetxt(csv_filename, time_hist.transpose(), delimiter=',', header='time(fs), temperature index') + logger.info(f"Wrote temperature evolution to {csv_filename}") + diff --git a/scripts/remd_par_manager.py b/scripts/remd_par_manager.py index 13a91ce..6a4a1cb 100644 --- a/scripts/remd_par_manager.py +++ b/scripts/remd_par_manager.py @@ -51,7 +51,7 @@ def sbatch_self(slurm_script, dependency): type=int, help="maximum trajectory temperature (K)") parser.add_argument("--trajs", "-n", default=8, type=int, help="number of trajectories") - parser.add_argument("--swap", "-s", default=50, type=int, + parser.add_argument("--swap", "-s", default=2000, type=int, help="time interval between swaps (fs)") parser.add_argument('--spawn', action='store_true', help="add this flag when recursively called from remd_par_manager.py") diff --git a/scripts/run_traj_temp.py b/scripts/run_traj_temp.py index be48682..0fe89f9 100644 --- a/scripts/run_traj_temp.py +++ b/scripts/run_traj_temp.py @@ -6,7 +6,6 @@ import presto import logging import argparse -import dill logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') @@ -20,14 +19,12 @@ parser.add_argument("--checkpoint_filename", "-c", type=str, help="path to remd checkpoint file") parser.add_argument("--index", "-i", type=int, help="index of trajectory") -parser.add_argument("--swap", "-s", default=50, type=int, - help="time interval between swaps (fs)") args = vars(parser.parse_args(sys.argv[1:])) remd = presto.replica_exchange_par.ReplicaExchange.load(args["checkpoint_filename"]) traj = remd.trajectories[args["index"]] -traj.run(time=args["swap"], checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, args["swap"])) +traj.run(time=remd.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, remd.swap_interval)) traj.save() sys.exit(0) \ No newline at end of file diff --git a/scripts/traj_cluster.py b/scripts/traj_cluster.py new file mode 100644 index 0000000..4648241 --- /dev/null +++ b/scripts/traj_cluster.py @@ -0,0 +1,68 @@ +# presto/scripts/remd_par_manager.py +# Marcus Sak, Jun 2021 +# Script to demux remd replicas + +import argparse +import sys +import numpy as np +import presto +import pandas as pd +import seaborn as sns +import matplotlib.pyplot as plt + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="traj_cluster.py", description="Given checkpoint file for trajectory and up to two desired internal coordinates, plots their distribution over the frames of the trajectory. Atom indices start from 1. Run $ python traj_cluster.py --help for options.") + + parser.add_argument("--checkpoint_filename", "-c", type=str, + help="path to trajectory checkpoint file (usually ends in .chk) ", required=True) + parser.add_argument("--distance", "-l", type=int, nargs=2, action='append', + help="a pair of atom indices to track distance", required=False) + parser.add_argument("--angle", "-a", type=int, nargs=3, action='append', + help="three atom indices to track angle", required=False) + parser.add_argument("--dihedral", "-d", type=int, nargs=4, action='append', + help="four atom indices to track dihedral", required=False) + + args = vars(parser.parse_args(sys.argv[1:])) + chkfile = args['checkpoint_filename'] + del args['checkpoint_filename'] + + int_coords = [] + for v in args.values(): + while v: + int_coords.append(v.pop(0)) + + assert len(int_coords) > 0 and len(int_coords) < 3, "only one or two internal coordinates should be specified" + + traj = presto.trajectory.Trajectory.new_from_checkpoint(chkfile) + frames = traj.as_ensemble().molecules + + coord_values = [] # 2D array of internal coordinate values for whole trajectory + for coord in int_coords: + value = [] # array of int coord values for all frames + if len(coord) == 2: + for frame in frames: + value.append(frame.get_distance(atoms=coord)) + elif len(coord) == 3: + for frame in frames: + value.append(frame.get_angle(atoms=coord)) + elif len(coord) == 4: + for frame in frames: + value.append(frame.get_dihedral(atoms=coord)) + coord_values.append(value) + + label = {2: 'distance', 3: 'angle', 4: 'dihedral'} + + if len(coord_values) == 1: # only one internal coordinate + label1 = f"{label[len(int_coords[0])]} {int_coords[0]}" + df = pd.DataFrame(coord_values[0], columns=[label1]) + sns.displot(data=df, x=label1, kind="kde") + plt.savefig('cluster1d.png', dpi=300) + plt.show() + else: # two internal coordinates + label1 = f"{label[len(int_coords[0])]} {int_coords[0]}" + label2 = f"{label[len(int_coords[1])]} {int_coords[1]}" + df = pd.DataFrame(np.transpose(coord_values), columns=[label1, label2]) + sns.jointplot(data=df, x=label1, y=label2, kind="kde") + plt.savefig('cluster2d.png', dpi=300) + plt.show() \ No newline at end of file From 697e71942e44bf73ae5004c2839db4bba8a64b20 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 15 Jun 2021 03:11:09 -0400 Subject: [PATCH 21/30] update docs for demux, cluster analysis --- scripts/remd_demux.py | 1 - scripts/remd_par_readme.md | 87 ++++++++++++++++++++++++++++---------- scripts/traj_cluster.py | 19 +++++---- 3 files changed, 74 insertions(+), 33 deletions(-) diff --git a/scripts/remd_demux.py b/scripts/remd_demux.py index bd8e14f..172b484 100644 --- a/scripts/remd_demux.py +++ b/scripts/remd_demux.py @@ -8,7 +8,6 @@ import presto import logging import copy -import os from tqdm import tqdm logging.basicConfig(level=logging.INFO, filename=f"demux.log", filemode='a', diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md index 065378c..f81df3b 100644 --- a/scripts/remd_par_readme.md +++ b/scripts/remd_par_readme.md @@ -1,5 +1,13 @@ # Parallelized replica exchange molecular dynamics (REMD) in _presto_ +## Table of Contents + +1. [Overview](#overview) +2. [Input and Output](#input-and-output) +3. [Instructions](#instructions) +4. [Parallelizing REMD with Slurm](#parallelizing-remd-with-slurm) +5. [Analyzing the REMD run](#analyzing-the-remd-run) + ## Overview A challenge in conventional molecular dynamics (MD) is the propensity for the system to be trapped in local potential energy minima. This issue is even more pronounced in the context of _ab initio_ MD, because the cost of simulating each timestep is higher. [Replica exchange molecular dynamics](http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf) (REMD), also known as parallel tempering, is an established approach to accelerate exploration of the potential energy surface. @@ -10,9 +18,9 @@ In _presto_, REMD is implemented as a loop: 2. Collect all the trajectories and make a pass through them, exchanging configurations between adjacent trajectories based on the Metropolis criterion. 3. Repeat until _stop\_time_. -The bottleneck in this loop is step (1), which is fortunately embarrassingly parallel. Huge gains in computation time can be realized by running the trajectories in parallel, subject to computational resources. More details about the parallel implementation can be found [below](#parallelizing-remd-with-Slurm). +The bottleneck in this loop is step (1), which is fortunately embarrassingly parallel. Huge gains in computation time can be realized by running the trajectories in parallel, subject to computational resources. More details about the parallel implementation can be found [below](#parallelizing-remd-with-slurm). -## Required files and input arguments +## Input and Output This implementation of parallelized REMD requires the [Slurm](https://Slurm.schedmd.com/documentation.html) scheduling system, and assumes that jobs are submitted using `sbatch `. @@ -25,7 +33,7 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche - `--mintemp`: minimum trajectory temperature in K - `--maxtemp`: maximum trajectory temperature in K - `--trajs`: number of trajectories - - `--swap`: length of swap interval in fs (default 50) + - `--swap`: length of swap interval in fs (default 2000) Run `$ python run_remd_par.py --help` for more details and options. 2. `scripts/run_traj_temp.py`: auxiliary script to run individual trajectories, not intended to be called alone @@ -49,11 +57,6 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche #SBATCH --mem-per-cpu=4000mb #SBATCH --mail-type=END,FAIL - module purge - # load anaconda module - module load miniconda - # activate presto environment - conda activate presto # add the path to run_remd_par.py if necessary. Remove --spawn whenever calling manually python run_remd_par.py --input geom.xyz --mintemp 300 --maxtemp 400 --trajs 3 --template template.yaml ``` @@ -76,15 +79,6 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche #SBATCH -t 00:15:00 #SBATCH --partition=day - # unload all modules - module purge - # load anaconda module - module load miniconda - # load gaussian if necessary - # module load Gaussian - # activate presto environment - conda activate presto-d - # add the path to run_traj_temp.py and the name of your checkfile after -c python run_traj_temp.py -i $SLURM_ARRAY_TASK_ID -c remd.chk @@ -98,19 +92,21 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche 4. `slurm-remd_par_manager.out`: Slurm output file from manager script. Contains tracebacks of critical unhandled exceptions (look at this file if the job unexpectedly terminates). 5. `slurm-traj_arrays.out`: Slurm output file from run_traj_temp.py submit script. Rarely useful. -## Instructions for use +## Instructions + +1. If necessary, load the requisite software modules (Anaconda, Gaussian, xTB), e.g. `module load Gaussian`. Activate the presto virtual environment, e.g. `$ conda activate presto`. -1. After setting up all the necessary files, initiate the run using `$ sbatch remd_.sh`. +2. Ensure that After setting up all the necessary files, initiate the run using `$ sbatch remd_.sh`. The only practical resource limitation is that the runtime of each trajectory for the swap interval (e.g. 50 fs) on one node cannot exceed the walltime of the cluster/partition. The total REMD runtime (`stop_time` in the config file) is restricted only by `sys.maxint` and the available storage for the trajectory checkpoint files; the number of trajectories is additionally restricted by the system-dependent Slurm `MaxArraySize` configuration parameter (usually 4E6). -2. This slurm script will start a job named `remd_par_manager`, which will initiate a Slurm job array named `remd_traj_array_fs`. +3. This slurm script will start a job named `remd_par_manager`, which will initiate a Slurm job array named `remd_traj_array_fs`. -3. The manager script will spawn another instance of itself (`remd_par_manager`), which will start running when the job array is completed. +4. The manager script will spawn another instance of itself (`remd_par_manager`), which will start running when the job array is completed. -4. When the REMD run ends, each trajectory can be examined by running `scripts/analyze.py` on its .chk file. +5. When the REMD run ends, each trajectory can be examined by running `scripts/analyze.py` on its .chk file. -5. To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. +6. To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. ## Parallelizing REMD with Slurm @@ -133,3 +129,48 @@ This approach - sidesteps limitations on the number of trajectories due to the maximum number of nodes available The one notable drawback occurs in cases where each _swap\_interval_ chunk takes a short time to run, because the trajectory runs are resubmitted as new jobs after each _swap\_interval_—this incurs the usual cost of scheduling and waiting for new resources to become available. In any reasonable use case, this drawback pales in comparison to the computation time of serialized REMD, or in an MPI implementation, the time required for a large number of nodes and cores to become simultaneously available. + +## Analyzing the REMD run + +### Reconstructing the temperature evolution of each replica + +In REMD, efficient diffusion of configurations between temperatures is desired. _presto_ keeps tracks of the swaps performed after each _swap\_interval_ in the REMD checkpoint file, and provides a script (`scripts/remd_demux.py`) to demultiplex (or "demux") the trajectories, enabling the user to examine the walks taken by each replica through temperature space. + +**Required files**: + +1. checkpoint file to *completed* REMD run. +2. checkpoint files for all the trajectories (e.g. `300k.chk`). +3. `scripts/remd_demux.py` + +To use, execute `$ python remd_demux.py --checkpoint_filename `. + +**Output files**: + +1. checkpoint files for the demuxed trajectories (e.g. `300k_demux.chk`) +2. PDB files containing the demuxed trajectories (e.g. `300k_demux.pdb`) +3. CSV files containing the temperature evolutions of each trajectory (e.g. `traj0.csv`). The first column contains the _index_ of the temperature, not the temperature in K. These data can be visualized in your favorite program. + +### Cluster analysis + +We often want to visualize the (relative) distributions of internal coordinates throughout an MD trajectory, e.g. _phi_ and _psi_ angles in peptides. A script `scripts/traj_cluster.py` is provided to plot the kernel density-estimated distributions of up to two internal coordinates (distance, length, dihedral) given a trajectory checkpoint file. + +The `seaborn` package (`$ conda install seaborn`) is used for visualization. + +**Required files**: + +1. `scripts/traj_cluster.py` + - `--checkpoint_filename`: path to trajectory checkpoint file (e.g. `300k.chk`) + - `--distance`: a pair of atom indices (1-indexed) + - `--angle`: three atom indices (1-indexed) + - `--dihedral`: four atom indices (1-indexed) + + Specify up to two internal coordinates. Examples of acceptable combinations are: + - `$ python traj_cluster.py -c 300k.chk --distance 3 4` + - `$ python traj_cluster.py -c 300k.chk --distance 3 4 --angle 8 1 3` + - `$ python traj_cluster.py -c 300k.chk --dihedral 17 20 8 7 --angle 1 2 5` + +2. checkpoint file for the trajectory + +**Output files**: + +1. a PNG file containing the single distribution plot or joint distribution plot for the specified internal coordinates. diff --git a/scripts/traj_cluster.py b/scripts/traj_cluster.py index 4648241..c05f19f 100644 --- a/scripts/traj_cluster.py +++ b/scripts/traj_cluster.py @@ -1,6 +1,6 @@ -# presto/scripts/remd_par_manager.py +# presto/scripts/traj_cluster.py # Marcus Sak, Jun 2021 -# Script to demux remd replicas +# Script for cluster analysis import argparse import sys @@ -12,16 +12,16 @@ if __name__ == "__main__": parser = argparse.ArgumentParser( - prog="traj_cluster.py", description="Given checkpoint file for trajectory and up to two desired internal coordinates, plots their distribution over the frames of the trajectory. Atom indices start from 1. Run $ python traj_cluster.py --help for options.") + prog="traj_cluster.py", description="Given checkpoint file for trajectory and up to two desired internal coordinates, plots their distribution over the frames of the trajectory. Atom indices start from 1.") parser.add_argument("--checkpoint_filename", "-c", type=str, help="path to trajectory checkpoint file (usually ends in .chk) ", required=True) parser.add_argument("--distance", "-l", type=int, nargs=2, action='append', - help="a pair of atom indices to track distance", required=False) + help="a pair of atom indices to track distance", required=False) parser.add_argument("--angle", "-a", type=int, nargs=3, action='append', - help="three atom indices to track angle", required=False) + help="three atom indices to track angle", required=False) parser.add_argument("--dihedral", "-d", type=int, nargs=4, action='append', - help="four atom indices to track dihedral", required=False) + help="four atom indices to track dihedral", required=False) args = vars(parser.parse_args(sys.argv[1:])) chkfile = args['checkpoint_filename'] @@ -32,7 +32,8 @@ while v: int_coords.append(v.pop(0)) - assert len(int_coords) > 0 and len(int_coords) < 3, "only one or two internal coordinates should be specified" + assert len(int_coords) > 0 and len( + int_coords) < 3, "only one or two internal coordinates should be specified" traj = presto.trajectory.Trajectory.new_from_checkpoint(chkfile) frames = traj.as_ensemble().molecules @@ -50,7 +51,7 @@ for frame in frames: value.append(frame.get_dihedral(atoms=coord)) coord_values.append(value) - + label = {2: 'distance', 3: 'angle', 4: 'dihedral'} if len(coord_values) == 1: # only one internal coordinate @@ -65,4 +66,4 @@ df = pd.DataFrame(np.transpose(coord_values), columns=[label1, label2]) sns.jointplot(data=df, x=label1, y=label2, kind="kde") plt.savefig('cluster2d.png', dpi=300) - plt.show() \ No newline at end of file + plt.show() From 383f15cb018ed50ff9520904ad90ba67aa98d9a3 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Thu, 17 Jun 2021 02:13:06 -0400 Subject: [PATCH 22/30] load only last two frames during REMD restart --- presto/replica_exchange_par.py | 5 +++-- scripts/remd_par_readme.md | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index b8c9251..dd77f89 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -70,9 +70,10 @@ def update_trajs(self): self.current_idx += 1 for traj in self.trajectories: - traj.load_from_checkpoint() + traj.load_from_checkpoint(frames=slice(-2, None, None)) + # need last two frames to do exchange # ensure all the trajectories are run up to the same time - assert traj.last_time_run() == self.current_idx * self.swap_interval + assert traj.last_time_run() == self.current_idx * self.swap_interval, "ensure that trajectories all ended at the same time" if self.current_idx * self.swap_interval == self.stop_time: self.finished = True diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md index f81df3b..584d970 100644 --- a/scripts/remd_par_readme.md +++ b/scripts/remd_par_readme.md @@ -108,6 +108,8 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche 6. To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. +7. If the REMD run was prematurely stopped/failed during execution of the manager script, the run may be resumed by running the manager script with the additional flag `--spawn`, i.e. in `remd_.sh`, change the final line to `python run_remd_par.py --spawn`. + ## Parallelizing REMD with Slurm _This is meant as a developer's note, i.e. not required reading._ From cd8e6150ca8ca646778b1b0b0f85e7a96aeb6679 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Fri, 25 Jun 2021 02:15:00 -0400 Subject: [PATCH 23/30] update demuxing script to accept incomplete trajs --- presto/replica_exchange_par.py | 2 ++ scripts/remd_demux.py | 17 +++++++++++------ scripts/remd_par_readme.md | 25 +++++++++++++------------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py index dd77f89..b06f111 100644 --- a/presto/replica_exchange_par.py +++ b/presto/replica_exchange_par.py @@ -66,6 +66,7 @@ def update_trajs(self): """ Updates all trajectories from respective chk files on newly unpickled remd object Not run in the first iteration + Does not modify any files """ self.current_idx += 1 @@ -162,6 +163,7 @@ def run(self, slurm=True): def exchange(self): """ time is from 0 + Saves updates trajectories to trajectory chkfiles """ time = self.current_idx * self.swap_interval kB = presto.constants.BOLTZMANN_CONSTANT diff --git a/scripts/remd_demux.py b/scripts/remd_demux.py index 172b484..b03a863 100644 --- a/scripts/remd_demux.py +++ b/scripts/remd_demux.py @@ -23,7 +23,7 @@ def exchange(array, i, j): if __name__ == "__main__": parser = argparse.ArgumentParser( - prog="remd_demux.py", description="Given a completed REMD run, reconstructs the continuous trajectories of each replica and outputs trajectory checkfiles and the temperature evolution for each replica. Run $ python remd_demux.py --help for options.") + prog="remd_demux.py", description="Given a REMD run, reconstructs the continuous trajectories of each replica and outputs trajectory checkfiles and the temperature evolution for each replica. Run $ python remd_demux.py --help for options.") parser.add_argument("--checkpoint_filename", "-c", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") @@ -31,15 +31,19 @@ def exchange(array, i, j): chkfile = args["checkpoint_filename"] remd = presto.replica_exchange_par.ReplicaExchange.load(chkfile) - assert remd.finished, "REMD run from this checkpoint file is unfinished!" + # assert remd.finished, "REMD run from this checkpoint file is unfinished!" + if not remd.finished: + remd.update_trajs() # load each traj from chkfile and add 1 to current index + remd.exchange() # pass self.current_idx * self.swap_interval as current time trajs = remd.trajectories swap_int = int(remd.swap_interval) - stop_time = int(remd.stop_time) + end_time = int(remd.current_idx * remd.swap_interval) + assert trajs[0].last_time_run() == end_time, "End time recorded in trajectory checkpoint file does not agree with end time recorded in REMD checkpoint file." # list of lists of temp history traj_hists = np.zeros( - (len(trajs), int(stop_time/swap_int) + 1), dtype=int) + (len(trajs), int(end_time/swap_int) + 1), dtype=int) # add 1 to shape[1] if we don't want to ignore the last swap for i, hist in enumerate(traj_hists): @@ -56,6 +60,7 @@ def exchange(array, i, j): exchange(curr_arrangement, swap["i"], swap["j"]) # we ignore the final swap + print(f"{curr_time} fs have been run, and the swap interval is {swap_int} fs.") assert curr_time/swap_int == traj_hists.shape[1] - 1 # last column traj_hists[:, int(curr_time/swap_int)] = curr_arrangement # do the final one @@ -88,12 +93,12 @@ def exchange(array, i, j): traj.save() - times = np.arange(0, stop_time + 1, swap_int) + times = np.arange(0, end_time + 1, swap_int) assert traj_hists.shape[1] == times.size, "length of time array should be the same as number of swaps" print("writing temperature evolutions to csv files...") for i, hist in tqdm(enumerate(traj_hists)): - time_hist = np.array([times, hist]) + time_hist = np.array([times, hist]).astype(int) csv_filename = f"traj{i}.csv" np.savetxt(csv_filename, time_hist.transpose(), delimiter=',', header='time(fs), temperature index') logger.info(f"Wrote temperature evolution to {csv_filename}") diff --git a/scripts/remd_par_readme.md b/scripts/remd_par_readme.md index 584d970..3d0d4b7 100644 --- a/scripts/remd_par_readme.md +++ b/scripts/remd_par_readme.md @@ -34,6 +34,7 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche - `--maxtemp`: maximum trajectory temperature in K - `--trajs`: number of trajectories - `--swap`: length of swap interval in fs (default 2000) + - `--spawn`: initiate REMD run from REMD and trajectory checkpoint files Run `$ python run_remd_par.py --help` for more details and options. 2. `scripts/run_traj_temp.py`: auxiliary script to run individual trajectories, not intended to be called alone @@ -53,12 +54,12 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche #SBATCH --ntasks=1 #SBATCH --cpus-per-task=1 #SBATCH --partition=day - #SBATCH -t 00:05:00 - #SBATCH --mem-per-cpu=4000mb - #SBATCH --mail-type=END,FAIL + #SBATCH -t 00:10:00 + #SBATCH --mem-per-cpu=8000mb + #SBATCH --mail-type=FAIL # add the path to run_remd_par.py if necessary. Remove --spawn whenever calling manually - python run_remd_par.py --input geom.xyz --mintemp 300 --maxtemp 400 --trajs 3 --template template.yaml + python run_remd_par.py --input geom.xyz --mintemp 300 --maxtemp 400 --trajs 3 --swap 1000 --template template.yaml ``` 4. `traj_array.sh`: Slurm submit script for `scripts/run_traj_temp.py`, not intended to be called by the user. Example: @@ -70,10 +71,10 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche #SBATCH --output=slurm-traj_arrays.out #SBATCH --open-mode=append #SBATCH --ntasks=1 - ## do not modify above this line - # set array indices from 0 to (number of trajectories - 1) + ### do not modify above this line + ### set array indices from 0 to (number of trajectories - 1) #SBATCH --array=0-2 - # settings below are per-trajectory + ### each trajectory is one slurm task, adjust accordingly below: #SBATCH --cpus-per-task=4 #SBATCH --mem-per-cpu=8000mb #SBATCH -t 00:15:00 @@ -94,9 +95,9 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche ## Instructions -1. If necessary, load the requisite software modules (Anaconda, Gaussian, xTB), e.g. `module load Gaussian`. Activate the presto virtual environment, e.g. `$ conda activate presto`. +1. If necessary, load the requisite software modules (Anaconda, Gaussian, xTB), e.g. `$ module load Gaussian`. Activate the presto virtual environment, e.g. `$ conda activate presto`. -2. Ensure that After setting up all the necessary files, initiate the run using `$ sbatch remd_.sh`. +2. After setting up all the necessary files, initiate the run using `$ sbatch remd_.sh`. The only practical resource limitation is that the runtime of each trajectory for the swap interval (e.g. 50 fs) on one node cannot exceed the walltime of the cluster/partition. The total REMD runtime (`stop_time` in the config file) is restricted only by `sys.maxint` and the available storage for the trajectory checkpoint files; the number of trajectories is additionally restricted by the system-dependent Slurm `MaxArraySize` configuration parameter (usually 4E6). @@ -108,7 +109,7 @@ This implementation of parallelized REMD requires the [Slurm](https://Slurm.sche 6. To prematurely cancel the run, execute `$ scancel ` on the `remd_par_manager` job. -7. If the REMD run was prematurely stopped/failed during execution of the manager script, the run may be resumed by running the manager script with the additional flag `--spawn`, i.e. in `remd_.sh`, change the final line to `python run_remd_par.py --spawn`. +7. If the REMD run was prematurely stopped/failed during execution of the manager script, the run may be resumed by running the manager script with the additional flag `--spawn`, i.e. in `remd_.sh`, change the final line to `python run_remd_par.py --spawn`. ## Parallelizing REMD with Slurm @@ -136,11 +137,11 @@ The one notable drawback occurs in cases where each _swap\_interval_ chunk takes ### Reconstructing the temperature evolution of each replica -In REMD, efficient diffusion of configurations between temperatures is desired. _presto_ keeps tracks of the swaps performed after each _swap\_interval_ in the REMD checkpoint file, and provides a script (`scripts/remd_demux.py`) to demultiplex (or "demux") the trajectories, enabling the user to examine the walks taken by each replica through temperature space. +In REMD, efficient diffusion of configurations between temperatures is desired. _presto_ keeps tracks of the swaps performed after each _swap\_interval_ in the REMD checkpoint file, and provides a script (`scripts/remd_demux.py`) to demultiplex (or "demux") the trajectories, enabling the user to examine the (random) walks taken by each replica through temperature space. **Required files**: -1. checkpoint file to *completed* REMD run. +1. checkpoint file to a *completed* REMD run. 2. checkpoint files for all the trajectories (e.g. `300k.chk`). 3. `scripts/remd_demux.py` From 68e7b28eaf77611a1846bda6f60e5392b6194e0a Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 13 Jul 2021 04:53:29 -0400 Subject: [PATCH 24/30] allow demux to work on incomplete remd runs --- scripts/remd_demux.py | 13 ++++++++----- scripts/traj_cluster.py | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/remd_demux.py b/scripts/remd_demux.py index b03a863..323c2a4 100644 --- a/scripts/remd_demux.py +++ b/scripts/remd_demux.py @@ -1,4 +1,4 @@ -# presto/scripts/remd_par_manager.py +# presto/scripts/remd_demux.py # Marcus Sak, Jun 2021 # Script to demux remd replicas @@ -58,11 +58,14 @@ def exchange(array, i, j): traj_hists[:, int(curr_time/swap_int)] = curr_arrangement curr_time += swap_int exchange(curr_arrangement, swap["i"], swap["j"]) - - # we ignore the final swap - print(f"{curr_time} fs have been run, and the swap interval is {swap_int} fs.") + + #account for any final intervals without swaps + while curr_time != end_time: + traj_hists[:, int(curr_time/swap_int)] = curr_arrangement + curr_time += swap_int + + print(f"{end_time} fs have been run, and the swap interval is {swap_int} fs.") assert curr_time/swap_int == traj_hists.shape[1] - 1 # last column - traj_hists[:, int(curr_time/swap_int)] = curr_arrangement # do the final one demux_trajs = copy.deepcopy(trajs) for traj in demux_trajs: diff --git a/scripts/traj_cluster.py b/scripts/traj_cluster.py index c05f19f..a4c030f 100644 --- a/scripts/traj_cluster.py +++ b/scripts/traj_cluster.py @@ -39,6 +39,7 @@ frames = traj.as_ensemble().molecules coord_values = [] # 2D array of internal coordinate values for whole trajectory + for coord in int_coords: value = [] # array of int coord values for all frames if len(coord) == 2: @@ -64,6 +65,8 @@ label1 = f"{label[len(int_coords[0])]} {int_coords[0]}" label2 = f"{label[len(int_coords[1])]} {int_coords[1]}" df = pd.DataFrame(np.transpose(coord_values), columns=[label1, label2]) + #sns.jointplot(data=df, x=label1, y=label2) sns.jointplot(data=df, x=label1, y=label2, kind="kde") + plt.savefig('cluster2d.png', dpi=300) plt.show() From 4a85040e123cec94770a8f8fab19a1845701c110 Mon Sep 17 00:00:00 2001 From: msh-yi <46651385+msh-yi@users.noreply.github.com> Date: Tue, 20 Jul 2021 04:28:57 -0400 Subject: [PATCH 25/30] add remd tutorial --- presto/__init__.py | 4 +- presto/build.py | 2 +- presto/config.py | 5 +- presto/replica_exchange.py | 182 ++++++++++++- presto/replica_exchange_mpi.py | 210 --------------- presto/replica_exchange_par.py | 250 ------------------ scripts/remd_demux.py | 12 +- scripts/remd_par_manager.py | 24 +- scripts/run_remd_mpi.py | 51 ---- scripts/{run_traj_temp.py => traj_array.py} | 8 +- setup.py | 4 - tutorial/tutorialxx/300k_1ns_cluster.png | Bin 0 -> 334554 bytes .../tutorialxx/300k_demux_1ns_cluster.png | Bin 0 -> 342373 bytes tutorial/tutorialxx/README.md | 193 ++++++++++++++ tutorial/tutorialxx/ala2.xyz | 24 ++ tutorial/tutorialxx/csv0.png | Bin 0 -> 105454 bytes tutorial/tutorialxx/remd_ala2.sh | 16 ++ tutorial/tutorialxx/template.yaml | 25 ++ tutorial/tutorialxx/traj_array.sh | 17 ++ 19 files changed, 473 insertions(+), 554 deletions(-) delete mode 100644 presto/replica_exchange_mpi.py delete mode 100644 presto/replica_exchange_par.py delete mode 100644 scripts/run_remd_mpi.py rename scripts/{run_traj_temp.py => traj_array.py} (72%) create mode 100644 tutorial/tutorialxx/300k_1ns_cluster.png create mode 100644 tutorial/tutorialxx/300k_demux_1ns_cluster.png create mode 100644 tutorial/tutorialxx/README.md create mode 100644 tutorial/tutorialxx/ala2.xyz create mode 100644 tutorial/tutorialxx/csv0.png create mode 100644 tutorial/tutorialxx/remd_ala2.sh create mode 100644 tutorial/tutorialxx/template.yaml create mode 100644 tutorial/tutorialxx/traj_array.sh diff --git a/presto/__init__.py b/presto/__init__.py index ae78fcc..12225b2 100644 --- a/presto/__init__.py +++ b/presto/__init__.py @@ -1,4 +1,4 @@ -from presto.build import build +import presto.build import presto.config import presto.constants import presto.calculators @@ -8,8 +8,6 @@ import presto.analysis import presto.constraints import presto.replica_exchange -import presto.replica_exchange_mpi -import presto.replica_exchange_par import presto.controller import presto.checks import presto.reporters diff --git a/presto/build.py b/presto/build.py index 362677c..dd15373 100644 --- a/presto/build.py +++ b/presto/build.py @@ -1,4 +1,4 @@ -import configparser, os, re, pathlib, yaml, cctk, h5py, logging +import os, re, yaml, cctk, h5py, logging import numpy as np import presto diff --git a/presto/config.py b/presto/config.py index 677f0af..542f2e1 100644 --- a/presto/config.py +++ b/presto/config.py @@ -1,5 +1,4 @@ -import configparser, os, re, pathlib, yaml, cctk, h5py, logging -import numpy as np +import configparser, os, re, pathlib, logging import presto logger = logging.getLogger(__name__) @@ -46,4 +45,4 @@ def check_directory(field_name, directory): logger.info(f"Loaded configuration data from {CONFIGURATION_FILE}.") def build(*args, **kwargs): - return presto.build(*args, **kwargs) + return presto.build.build(*args, **kwargs) diff --git a/presto/replica_exchange.py b/presto/replica_exchange.py index 418f6e1..a942e94 100644 --- a/presto/replica_exchange.py +++ b/presto/replica_exchange.py @@ -1,13 +1,25 @@ -import numpy as np -import math, copy, cctk, os, re, logging, time, yaml, random -import multiprocessing as mp +# presto/presto/replica_exchange.py +# Jul 2021 +import numpy as np +import logging +import random +import sys +import subprocess import presto +import dill +import re +import os +import yaml +import multiprocessing as mp logger = logging.getLogger(__name__) MIN_CHECKPOINT_INTERVAL = 50 +class MissingSbatchFlags(Exception): + pass + class ReplicaExchange(): """ Runs several trajectories and manages interconversions between them. @@ -23,9 +35,8 @@ class ReplicaExchange(): finished (bool): current_idx (int): """ - def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): - temps = np.zeros(shape=len(trajectories)) - for idx, traj in enumerate(trajectories): + def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=100): + for traj in trajectories: assert isinstance(traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" @@ -46,7 +57,9 @@ def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=1 self.finished = False self.current_idx = 0 - self.load() + # prevent parallel class from loading + if not isinstance(self, ReplicaExchangeParallel): + self.load() def __str__(self): return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" @@ -116,15 +129,16 @@ def run(self): traj.load_from_checkpoint() assert traj.last_time_run() == target_time - self.exchange(next_idx * self.swap_interval) self.current_idx = next_idx + self.exchange() # TODO: make sure calling exchange without time is ok self.save() self.finished = True return self - def exchange(self, time): + def exchange(self): """ time is from 0 """ + time = self.current_idx * self.swap_interval kB = presto.constants.BOLTZMANN_CONSTANT # make one pass from low to high T @@ -159,7 +173,7 @@ def exchange(self, time): def report(self): counts = np.zeros(shape=len(self.trajectories)) - #len of counts is no of temps + # len of counts is no of temps possible = self.current_idx * (len(self.trajectories) - 1) for swap in self.swaps: @@ -171,3 +185,151 @@ def report(self): text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" return text + +class ReplicaExchangeParallel(ReplicaExchange): + """ + Runs several trajectories and manages interconversions between them. Slurm-parallelized version. + + Based on: + http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf + + Attributes: + stop_time (int): + swaps (list of dict): + swap_interval (int): + checkpoint_filename (int): + finished (bool): + current_idx (int): + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def update_trajs(self): + """ + Updates all trajectories from respective chk files on newly unpickled remd object + Not run in the first iteration + Does not modify any files + """ + self.current_idx += 1 + + for traj in self.trajectories: + traj.load_from_checkpoint(frames=slice(-2, None, None)) + # need last two frames to do exchange + # ensure all the trajectories are run up to the same time + assert traj.last_time_run() == self.current_idx * self.swap_interval, "ensure that trajectories all ended at the same time" + + if self.current_idx * self.swap_interval == self.stop_time: + self.finished = True + + def run(self, slurm=True): + """ generates a (slurm) job array for trajectories in each segment and submits it + """ + + # always self.update_trajs before self.run + if self.finished: + logger.info(f"Replica exchange already finished!") + return self + + next_idx = self.current_idx + 1 + target_time = next_idx * self.swap_interval + + if isinstance(self.trajectories[0].calculator, presto.calculators.XTBCalculator): + n_threads = self.trajectories[0].calculator.parallel + elif isinstance(self.trajectories[0].calculator, presto.calculators.GaussianCalculator): + n_threads = int( + self.trajectories[0].calculator.link0["nprocshared"]) + + if slurm: + slurm_script = 'traj_array.sh' + + assert os.path.exists(slurm_script), "The Slurm submit script traj_array.sh is required but not found" + + # dict to ensure that (some) necessary sbatch options are specified + sbatch_flags = {'-J': False, '-c': False, '--array': False} + with open(slurm_script, 'r') as f: + source = f.read().splitlines() # no newline in source + + with open(slurm_script, 'w') as f: + for line in source: + if "job-name" in line or '-J ' in line: + # modify job name appropriately + line = re.sub('array_(.*?)fs', f'array_{target_time}fs', line) + sbatch_flags['-J'] = True + elif "cpus-per-task" in line or '#SBATCH -c' in line: + # check if cpus-per-task is equal to n_threads + sbatch_flags['-c'] = True + thread_match = re.search('(\d+)$', line) + input_threads = int(thread_match.group()) + if input_threads != n_threads: + line = re.sub('(\d+)$', str(n_threads), line) + logger.warning( + "--cpus-per-task in traj_array.sh is not equal to number of processors specified in config file, automatically changing") + elif "--array" in line: + # check if array size is equal to num of trajs + input_trajs = int(re.search('(\d+)$', line).group()) + sbatch_flags['--array'] = True + if input_trajs != len(self.trajectories) - 1: + line = re.sub('(\d+)$', str(len(self.trajectories) - 1), line) + logger.warning( + "--array size in traj_array.sh is not equal to number of trajectories specified when calling remd_par_manager.py, automatically changing") + + f.write(line+'\n') + + for k, v in sbatch_flags.items(): + if not v: + logger.error( + f"did not specify sbatch option {k} in traj_array.sh, exiting now") + sys.exit(1) + + try: + sbatch_msg = subprocess.check_output( + ['sbatch', slurm_script]) + if 'Submitted' not in sbatch_msg.decode('utf-8'): + raise subprocess.CalledProcessError + + except subprocess.CalledProcessError as e: + logger.error("Could not submit slurm job array script") + sys.exit(1) + logger.info("Wrote and submitted traj_array.sh") + return int(sbatch_msg.split()[-1]) # slurm jobid of the + + def exchange(self): + """ time is from 0 + Saves updates trajectories to trajectory chkfiles + """ + super().exchange() + + for traj in self.trajectories: + traj.save() + + def save(self): + """ + Saves ReplicaExchange object to chkfile (pickle), keeping only the last frame of each trajectory + + """ + for traj in self.trajectories: + traj.frames = [traj.frames[-1]] + + with (open(self.checkpoint_filename, "wb")) as f: + dill.dump(self, f, protocol=-1) # HIGHEST_PROTOCOL + + logger.info(f"Saved ReplicaExchange to {self.checkpoint_filename}.") + + @classmethod + def load(cls, checkpoint): + """ Loads ReplicaExchange object from chkfile + + Returns: + ReplicaExchange object + """ + + try: + with (open(checkpoint, "rb")) as f: + remd = dill.load(f) + except FileNotFoundError: + print( + "checkpoint file not found, do not call this script with --spawn on the first instance") + logger.info(f"Loaded ReplicaExchange from {checkpoint}.") + + return remd diff --git a/presto/replica_exchange_mpi.py b/presto/replica_exchange_mpi.py deleted file mode 100644 index eedd692..0000000 --- a/presto/replica_exchange_mpi.py +++ /dev/null @@ -1,210 +0,0 @@ -from mpi4py import MPI -import numpy as np -import argparse -import copy -import cctk -import dill -import logging -import math -import os -import random -import re -import sys -import time -import yaml -import presto - -logger = logging.getLogger(__name__) - -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -MIN_CHECKPOINT_INTERVAL = 50 - -class ReplicaExchange(): - """Runs several trajectories and manages interconversions between them. - - Based on: - http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf - - Attributes: - stop_time (int): - swaps (list of dict): - swap_interval (int): - checkpoint_filename (int): - finished (bool): - current_idx (int): - - Assumes there are ranks from 0 to len(trajectories) - 1 - - """ - - def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): - if rank == 0: - # rank 0 does all the checking - for idx, traj in enumerate(trajectories): - assert isinstance( - traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" - assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" - assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" - assert np.array_equal( - traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" - assert np.array_equal( - traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" - - assert isinstance(swap_interval, (float, int)) - assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" - assert isinstance(checkpoint_filename, str) - - # these attributes are privately owned by all process - self.swaps = [] - self.trajs = sorted(trajectories, key=lambda x: x.bath_scheduler(0)) - self.temps = [traj.bath_scheduler(0) for traj in self.trajs] - self.traj = self.trajs[rank] - self.stop_time = trajectories[0].stop_time - self.swap_interval = swap_interval - - self.checkpoint_filename = checkpoint_filename - self.finished = False - self.current_idx = 0 - - self.load() - - def __str__(self): - return f"ReplicaExchange({len(self.trajs)}) trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename}" - - def __repr__(self): - return f"ReplicaExchange({len(self.trajs)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" - - def save(self): - file_dict = { - "stop_time": self.stop_time, - "swap_interval": self.swap_interval, - "swaps": self.swaps, - "finished": self.finished, - "current_idx": self.current_idx, - } - with open(self.checkpoint_filename, "w+") as f: - yaml.dump(file_dict, f) - logger.info(f"Saving ReplicaExchange to {self.checkpoint_filename}.") - return self - - def load(self): - if os.path.exists(self.checkpoint_filename): - with open(self.checkpoint_filename, "r+") as f: - file_dict = yaml.safe_load(f) - self.stop_time = file_dict["stop_time"] - self.swap_interval = file_dict["swap_interval"] - self.swaps = file_dict["swaps"] - self.finished = file_dict["finished"] - self.current_idx = file_dict["current_idx"] - logger.info( - f"Loaded ReplicaExchange from {self.checkpoint_filename}.") - return self - - def run(self): - if self.finished: - if rank == 0: - logger.info( - f"From rank {rank}: Replica exchange already finished!") - return self - - start_idx = self.current_idx - - # self.trajs is an array that everyone has privately - for current_idx in range(start_idx, int(self.stop_time/self.swap_interval)): - next_idx = current_idx + 1 - target_time = next_idx * self.swap_interval - - time_remaining = max( - 0, target_time - self.trajs[rank].last_time_run()) - - if time_remaining: - self.traj.run(time=self.swap_interval, checkpoint_interval=min( - MIN_CHECKPOINT_INTERVAL, self.swap_interval)) - self.traj.load_from_checkpoint() - assert self.traj.last_time_run() == target_time - - self.exchange(next_idx * self.swap_interval) - # barrier at exchange - - self.current_idx = next_idx - - if rank == 0: - self.save() - - # all done - self.finished = True - if rank == 0: - self.save() - return self - - def exchange(self, time): - """ time is from 0 - """ - # these two are only nonNone when rank == 0 - # indices of energies and frames are pegged: if we swap energies, swap frames too - # original version of code read energies from frames[-2] - # g_energies = comm.gather(self.traj.frames[-2].energy, root=0) - - # now, we read all properties from frames[-1] - g_frames = comm.gather(self.traj.frames[-1], root=0) - - if rank == 0: - kB = presto.constants.BOLTZMANN_CONSTANT - - # make one pass from low to high T - for i in range(len(self.trajs) - 1): - j = i+1 - - E_i = g_frames[i].energy - - E_j = g_frames[j].energy - - b_i = 1 / (kB * self.temps[i]) - - b_j = 1 / (kB * self.temps[j]) - - p = min(1, np.exp((E_i - E_j) * (b_i - b_j))) - logger.info(f"E{i} & E{j}\tp={p}") - - if p > random.random(): - # or momenta scaling - v_i_scaling = np.sqrt(self.temps[j] / self.temps[i]) - v_j_scaling = np.sqrt(self.temps[i] / self.temps[j]) - - frame_i = g_frames[i] - frame_j = g_frames[j] - frame_i.velocities *= v_i_scaling - frame_j.velocities *= v_j_scaling - - g_frames[i] = frame_j - g_frames[j] = frame_i - - self.swaps.append({"time": time, "i": i, "j": j}) - logger.info( - f"\nReplicas {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") - - # all together now: update own trajectory's last frame to g_frames[rank] - new_last_frame = comm.scatter(g_frames, root=0) - self.traj.frames[-1] = new_last_frame - # are we saving this last frame to chekpoint? - - return - - def report(self): - if rank == 0: - counts = np.zeros(shape=len(self.trajs)) - # len of counts is no of temps - possible = self.current_idx * (len(self.trajs) - 1) - for swap in self.swaps: - counts[swap["i"]] += 1 - - text = f"Time: {self.current_idx * self.swap_interval} fs\n" - text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" - for i in range(len(self.trajs) - 1): - text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" - - return text - return None diff --git a/presto/replica_exchange_par.py b/presto/replica_exchange_par.py deleted file mode 100644 index b06f111..0000000 --- a/presto/replica_exchange_par.py +++ /dev/null @@ -1,250 +0,0 @@ -# presto/presto/replica_exchange_par.py -# Marcus Sak, Jun 2021 -# parallel ReplicaExchange class - -import numpy as np -import logging -import random -import sys -import subprocess -import presto -import dill -import re -import os - -logger = logging.getLogger(__name__) - -MIN_CHECKPOINT_INTERVAL = 50 - - -class MissingSbatchFlags(Exception): - pass - - -class ReplicaExchange(): - """ - Runs several trajectories and manages interconversions between them. - - Based on: - http://www.math.pitt.edu/~cbsg/Materials/Earl_ParallelTempering.pdf - """ - - def __init__(self, trajectories, checkpoint_filename="remd.chk", swap_interval=10): - for idx, traj in enumerate(trajectories): - assert isinstance( - traj, presto.trajectory.EquilibrationTrajectory), "all trajectories must be EquilibrationTrajectories" - assert traj.timestep == trajectories[0].timestep, "all trajectories must have same ``timestep``" - assert traj.stop_time == trajectories[0].stop_time, "all trajectories must have same ``stop_time``" - assert np.array_equal( - traj.high_atoms, trajectories[0].high_atoms), "all trajectories must have same ``high_atoms``" - assert np.array_equal( - traj.active_atoms, trajectories[0].active_atoms), "all trajectories must have same ``active_atoms``" - - # sort by temp - self.trajectories = sorted( - trajectories, key=lambda x: x.bath_scheduler(0)) - self.stop_time = trajectories[0].stop_time - - self.swaps = list() - assert isinstance(swap_interval, (float, int)) - assert swap_interval % trajectories[0].timestep == 0, "swap_interval must be a multiple of timestep" - assert self.stop_time % swap_interval == 0, "stop time must a multiple of timestep" - self.swap_interval = swap_interval - - assert isinstance(checkpoint_filename, str) - self.checkpoint_filename = checkpoint_filename - self.finished = False - self.current_idx = 0 - - def __str__(self): - return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" - - def __repr__(self): - return f"ReplicaExchange({len(self.trajectories)} trajectories, swap_interval={self.swap_interval} fs, checkpoint_file={self.checkpoint_filename})" - - def update_trajs(self): - """ - Updates all trajectories from respective chk files on newly unpickled remd object - Not run in the first iteration - Does not modify any files - """ - self.current_idx += 1 - - for traj in self.trajectories: - traj.load_from_checkpoint(frames=slice(-2, None, None)) - # need last two frames to do exchange - # ensure all the trajectories are run up to the same time - assert traj.last_time_run() == self.current_idx * self.swap_interval, "ensure that trajectories all ended at the same time" - - if self.current_idx * self.swap_interval == self.stop_time: - self.finished = True - - def run(self, slurm=True): - """ generates a (slurm) job array for trajectories in each segment and submits it - """ - - # always self.update_trajs before self.run - if self.finished: - logger.info(f"Replica exchange already finished!") - return self - - next_idx = self.current_idx + 1 - target_time = next_idx * self.swap_interval - - # time_remaining = max( - # 0, target_time - self.trajectories[0].last_time_run()) - - # if not time_remaining: - # return - - #temps_str = ','.join([str(temp) for temp in self.temps]) - - is_gaussian = False - if isinstance(self.trajectories[0].calculator, presto.calculators.XTBCalculator): - n_threads = self.trajectories[0].calculator.parallel - elif isinstance(self.trajectories[0].calculator, presto.calculators.GaussianCalculator): - is_gaussian = True - n_threads = int( - self.trajectories[0].calculator.link0["nprocshared"]) - - if slurm: - slurm_script = 'traj_array.sh' - - assert os.path.exists(slurm_script), "The Slurm submit script traj_array.sh is required but not found" - - # dict to ensure that (some) necessary sbatch options are specified - sbatch_flags = {'-J': False, '-c': False, '--array': False} - with open(slurm_script, 'r') as f: - source = f.read().splitlines() # no newline in source - - with open(slurm_script, 'w') as f: - for line in source: - if "job-name" in line or '-J ' in line: - # modify job name appropriately - line = re.sub('array_(.*?)fs', f'array_{target_time}fs', line) - sbatch_flags['-J'] = True - elif "cpus-per-task" in line or '#SBATCH -c' in line: - # check if cpus-per-task is equal to n_threads - sbatch_flags['-c'] = True - thread_match = re.search('(\d+)$', line) - input_threads = int(thread_match.group()) - if input_threads != n_threads: - line = re.sub('(\d+)$', str(n_threads), line) - logger.warning( - "--cpus-per-task in traj_array.sh is not equal to number of processors specified in config file, automatically changing") - elif "--array" in line: - # check if array size is equal to num of trajs - input_trajs = int(re.search('(\d+)$', line).group()) - sbatch_flags['--array'] = True - if input_trajs != len(self.trajectories) - 1: - line = re.sub('(\d+)$', str(len(self.trajectories) - 1), line) - logger.warning( - "--array size in traj_array.sh is not equal to number of trajectories specified when calling remd_par_manager.py, automatically changing") - - f.write(line+'\n') - - for k, v in sbatch_flags.items(): - if not v: - logger.error( - f"did not specify sbatch option {k} in traj_array.sh, exiting now") - sys.exit(1) - - try: - sbatch_msg = subprocess.check_output( - ['sbatch', slurm_script]) - if 'Submitted' not in sbatch_msg.decode('utf-8'): - raise subprocess.CalledProcessError - - except subprocess.CalledProcessError as e: - logger.error("Could not submit slurm job array script") - sys.exit(1) - logger.info("Wrote and submitted traj_array.sh") - return int(sbatch_msg.split()[-1]) # slurm jobid of the - - def exchange(self): - """ time is from 0 - Saves updates trajectories to trajectory chkfiles - """ - time = self.current_idx * self.swap_interval - kB = presto.constants.BOLTZMANN_CONSTANT - - # make one pass from low to high T - for i in range(len(self.trajectories)-1): - j = i+1 - - E_i = self.trajectories[i].frames[-2].energy - E_j = self.trajectories[j].frames[-2].energy - T_i = self.trajectories[i].bath_scheduler(0) - T_j = self.trajectories[j].bath_scheduler(0) - b_i = 1 / (kB*T_i) - b_j = 1 / (kB*T_j) - - p = min(1, np.exp((E_i - E_j) * (b_i - b_j))) - logger.info(f"E{i} & E{j}\tp={p}") - - if p > random.random(): - # or momenta scaling - v_i_scaling = np.sqrt(T_j/T_i) - v_j_scaling = np.sqrt(T_i/T_j) - - frame_i = self.trajectories[i].frames[-1] - frame_j = self.trajectories[j].frames[-1] - frame_i.velocities *= v_i_scaling - frame_j.velocities *= v_j_scaling - - self.trajectories[i].frames[-1] = frame_j - self.trajectories[j].frames[-1] = frame_i - - self.swaps.append({"time": time, "i": i, "j": j}) - logger.info( - f"\nConfigurations from trajectories {i} & {j} swapped after {time} fs!\t{E_i} {E_j} p={p}") - - for traj in self.trajectories: - traj.save() - - def report(self): - - counts = np.zeros(shape=len(self.trajectories)) - # len of counts is no of temps - possible = self.current_idx * (len(self.trajectories) - 1) - - for swap in self.swaps: - counts[swap["i"]] += 1 - - text = f"Time: {self.current_idx * self.swap_interval} fs\n" - text += f"Exchange probability: {np.sum(counts)/possible:.2%}\n" - for i in range(len(self.trajectories) - 1): - text += f"\tReplica {i} <=> Replica {i+1} \t{counts[i]/self.current_idx:.2%}\n" - - return text - - def save(self): - """ - Saves ReplicaExchange object to chkfile (pickle), keeping only the last frame of each trajectory - - """ - for traj in self.trajectories: - traj.frames = [traj.frames[-1]] - - with (open(self.checkpoint_filename, "wb")) as f: - dill.dump(self, f, protocol=-1) # HIGHEST_PROTOCOL - - logger.info(f"Saved ReplicaExchange to {self.checkpoint_filename}.") - - @classmethod - def load(cls, checkpoint): - """ Loads ReplicaExchange object from chkfile - - Returns: - ReplicaExchange object - """ - - try: - with (open(checkpoint, "rb")) as f: - remd = dill.load(f) - except FileNotFoundError: - print( - "checkpoint file not found, do not call this script with --spawn on the first instance") - logger.info(f"Loaded ReplicaExchange from {checkpoint}.") - - return remd diff --git a/scripts/remd_demux.py b/scripts/remd_demux.py index 323c2a4..482ebe4 100644 --- a/scripts/remd_demux.py +++ b/scripts/remd_demux.py @@ -30,7 +30,7 @@ def exchange(array, i, j): args = vars(parser.parse_args(sys.argv[1:])) chkfile = args["checkpoint_filename"] - remd = presto.replica_exchange_par.ReplicaExchange.load(chkfile) + remd = presto.replica_exchange.ReplicaExchangeParallel.load(chkfile) # assert remd.finished, "REMD run from this checkpoint file is unfinished!" if not remd.finished: remd.update_trajs() # load each traj from chkfile and add 1 to current index @@ -87,10 +87,10 @@ def exchange(array, i, j): for j in np.arange(n_frames, dtype=int): # each timestep demux_trajs[i].frames.append(trajs[traj_hists[i, int(j/swap_int)]].frames[j]) - print("writing demuxed trajectories to pdb files...") + print("writing demuxed trajectories to PDB and .chk files:") for i, traj in tqdm(enumerate(demux_trajs)): - traj.checkpoint_filename = traj.checkpoint_filename.replace('.chk', '_demux.chk') - pdb_filename = f'traj{i}.pdb' + traj.checkpoint_filename = f"replica{i}.chk" + pdb_filename = f'replica{i}.pdb' traj.write_movie(pdb_filename) logger.info(f"Wrote movie to {pdb_filename}.") @@ -99,10 +99,10 @@ def exchange(array, i, j): times = np.arange(0, end_time + 1, swap_int) assert traj_hists.shape[1] == times.size, "length of time array should be the same as number of swaps" - print("writing temperature evolutions to csv files...") + print("writing temperature evolutions to CSV files...") for i, hist in tqdm(enumerate(traj_hists)): time_hist = np.array([times, hist]).astype(int) - csv_filename = f"traj{i}.csv" + csv_filename = f"replica{i}.csv" np.savetxt(csv_filename, time_hist.transpose(), delimiter=',', header='time(fs), temperature index') logger.info(f"Wrote temperature evolution to {csv_filename}") diff --git a/scripts/remd_par_manager.py b/scripts/remd_par_manager.py index 6a4a1cb..dbaed11 100644 --- a/scripts/remd_par_manager.py +++ b/scripts/remd_par_manager.py @@ -10,7 +10,7 @@ import presto import subprocess -logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', +logging.basicConfig(level=logging.INFO, filename=f"remd.log", filemode='a', format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') logger = logging.getLogger(__name__) @@ -29,7 +29,8 @@ def sbatch_self(slurm_script, dependency): try: subprocess.run( ['sbatch', f'--dependency=afterok:{dependency}', slurm_script]) - logger.info(f"Self-spawned with dependency on slurm job array {dependency}") + logger.info( + f"Self-spawned with dependency on slurm job array {dependency}") except subprocess.CalledProcessError as e: logger.error("Could not submit slurm script") sys.exit(1) @@ -38,7 +39,7 @@ def sbatch_self(slurm_script, dependency): if __name__ == "__main__": parser = argparse.ArgumentParser( - prog="remd_par_manager.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") + prog="remd_par_manager.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange.py --help for options.") parser.add_argument("--checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") parser.add_argument("--input", default=None, type=str, @@ -70,25 +71,26 @@ def sbatch_self(slurm_script, dependency): filedata = filedata.replace("", f"{temp:.2f}") with open(f"{name}.yaml", 'w') as file: file.write(filedata) - traj = presto.config.build( - f"{name}.yaml", f"{name}.chk", geometry=args["input"]) + traj = presto.build.build( + f"{name}.yaml", f"{name}.chk", geometry=args["input"], checkpoint_interval=min(50, args["swap"])) all_trajs.append(traj) - remd = presto.replica_exchange_par.ReplicaExchange(trajectories=all_trajs, checkpoint_filename=args["checkpoint_filename"], - swap_interval=args["swap"]) + remd = presto.replica_exchange.ReplicaExchangeParallel(trajectories=all_trajs, checkpoint_filename=args["checkpoint_filename"], swap_interval=args["swap"]) else: - remd = presto.replica_exchange_par.ReplicaExchange.load(args["checkpoint_filename"]) + remd = presto.replica_exchange.ReplicaExchangeParallel.load( + args["checkpoint_filename"]) remd.update_trajs() # load each traj from chkfile and add 1 to current index remd.exchange() # pass self.current_idx * self.swap_interval as current time - # exchannge will save trajectories into chkfile + # exchange will save trajectories into chkfile if remd.finished: remd.save() logger.info(f"Replica exchange completed.") logger.info("\n\n----------------REPORT----------------\n") logger.info(remd.report()) sys.exit(0) - + remd.save() - trajs_slurm_job_id = remd.run() # nonblocking, needs to return slurm jobID of submitted array + # nonblocking, needs to return slurm jobID of submitted array + trajs_slurm_job_id = remd.run() slurm_script = f'remd_{os.path.splitext(args["input"])[0]}.sh' sbatch_self(slurm_script, trajs_slurm_job_id) diff --git a/scripts/run_remd_mpi.py b/scripts/run_remd_mpi.py deleted file mode 100644 index 2980853..0000000 --- a/scripts/run_remd_mpi.py +++ /dev/null @@ -1,51 +0,0 @@ -from mpi4py import MPI -import argparse, copy, cctk, dill, logging, math, os, random, re, sys, time, yaml -import numpy as np -import presto - -logging.basicConfig(level=logging.INFO, filename=f"remd.log", - format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') - -logger = logging.getLogger(__name__) - -MPI.pickle.__init__(dill.dumps, dill.loads) -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -parser = argparse.ArgumentParser(prog="run_remd_mpi.py", description="Runs replica exchange MD for accelerated sampling of conformational space. Outputs chkfiles for all trajectories. Run > python replica_exchange_mpi.py --help for options.") -parser.add_argument("input", default=None, type=str, help="name of input geometry (.xyz)") -parser.add_argument("template", type=str, default="template.yaml", help="path to template file (usually ends in .yaml)") -parser.add_argument("checkpoint_filename", type=str, default="remd.chk", help="path to checkpoint file (usually ends in .chk)") -parser.add_argument("--mintemp", "-a", default=100, type=int, help="minimum trajectory temperature (K)") -parser.add_argument("--maxtemp", "-z", default=800, type=int, help="maximum trajectory temperature (K)") -parser.add_argument("--trajs", "-n", default=8, type=int, help="number of trajectories (equal to slurm --ntasks)") -parser.add_argument("--swap", "-s", default=50, type=int, help="time interval between swaps (fs)") - -args = vars(parser.parse_args(sys.argv[1:])) - -try: - all_trajs = [] - - if rank == 0: - for temp in np.geomspace(args["mintemp"], args["maxtemp"], num=args["trajs"]): - name = f"{int(temp)}k" - with open(args["template"], 'r') as file: - filedata = file.read() - filedata = filedata.replace("", f"{temp:.2f}") - with open(f"{name}.yaml", 'w') as file: - file.write(filedata) - traj = presto.config.build( - f"{name}.yaml", f"{name}.chk", geometry=args["input"]) - all_trajs.append(traj) - - trajs = comm.bcast(all_trajs, root=0) - remd = presto.replica_exchange_mpi.ReplicaExchange(trajectories=trajs, swap_interval=args["swap"], checkpoint_filename=args["checkpoint_filename"]) - remd.run() - - if rank == 0: - print(remd.report()) - -except Exception as e: - print(e) - sys.exit(1) diff --git a/scripts/run_traj_temp.py b/scripts/traj_array.py similarity index 72% rename from scripts/run_traj_temp.py rename to scripts/traj_array.py index 0fe89f9..6404b7a 100644 --- a/scripts/run_traj_temp.py +++ b/scripts/traj_array.py @@ -7,13 +7,11 @@ import logging import argparse -logging.basicConfig(level=logging.INFO, filename=f"remd_par.log", filemode='a', +logging.basicConfig(level=logging.INFO, filename=f"remd.log", filemode='a', format='%(asctime)s %(name)-12s %(message)s', datefmt='%m-%d %H:%M') logger = logging.getLogger(__name__) -MIN_CHECKPOINT_INTERVAL = 50 - parser = argparse.ArgumentParser( prog="run_traj_temp.py", description="Script to run single trajectory at specified temperature, usually called by replica_exchange_par.py") parser.add_argument("--checkpoint_filename", "-c", type=str, @@ -21,10 +19,10 @@ parser.add_argument("--index", "-i", type=int, help="index of trajectory") args = vars(parser.parse_args(sys.argv[1:])) -remd = presto.replica_exchange_par.ReplicaExchange.load(args["checkpoint_filename"]) +remd = presto.replica_exchange.ReplicaExchangeParallel.load(args["checkpoint_filename"]) traj = remd.trajectories[args["index"]] -traj.run(time=remd.swap_interval, checkpoint_interval=min(MIN_CHECKPOINT_INTERVAL, remd.swap_interval)) +traj.run(time=remd.swap_interval) traj.save() sys.exit(0) \ No newline at end of file diff --git a/setup.py b/setup.py index 8fa5ce8..9fef0ef 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,5 @@ import setuptools -<<<<<<< HEAD -setuptools.setup() -======= with open("README.md", "r") as fh: long_description = fh.read() @@ -28,4 +25,3 @@ ], python_requires='>=3.6', ) ->>>>>>> upstream/master diff --git a/tutorial/tutorialxx/300k_1ns_cluster.png b/tutorial/tutorialxx/300k_1ns_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..58668bf593c1b0e08e0c8b8126a345168ee17716 GIT binary patch literal 334554 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⁡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 MOP-5AbN$}`0q}!<_5c6? literal 0 HcmV?d00001 diff --git a/tutorial/tutorialxx/300k_demux_1ns_cluster.png b/tutorial/tutorialxx/300k_demux_1ns_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..06018544bd98f3a0483143914e62421b071468ea GIT binary patch literal 342373 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�PmwN_4JFFMWm9xdqLIsvt1jtS2I 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

EuH7b6E>W+zJRo1 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 ~%+lIQjwN$${Xec0rxCZnx8t&VU8#hoP zvWTXvYd}XsTqo7ZAnCv7zLh6gC?}-7&VnKRMpEja><^?Ws)sE+YJ5_kJKFFZzb9B? zddeUvy=1iBeOtdFhjbAfQP`$6N##t#5_+nsmTG+@80bBXla5BOtCOflH^{>Gt>2VP z#d5@&32AI^{RCS{I@9HyjG2vMS;1P zXY1cwi@o#ny;LE8@{9UAIdT!*EnVtWMwx!;MC;^7#;i`|b?tYlDe%_oGU8&=wWRO( zLZ1FDD1u?Kd0U_Ou~8ym*1iz(W=&fHq>)NKA92q|mnz zXxW4>txLm{0$opmtGVNA{uJ?%!qRe6Q$)a4CV|Sj?X*Dn`$OQCZ$P`w2gFYUmd$ z`~tkPIIk?*b%@yb(cklfZrJuxoE&+J=q>I5^5LPX-0jtQlkwjcYe!TVl>(uW^kn!> zJ*jI*h)JTgYu}O8lH}MY1!mRxd0y~%_Glc8|W9~PCYa5qsz6>hWCZF<>fn{?JBmnw+){BWRV-p3_-;JYR-w_ zA;Mg<_*a}$D4haGg%GqcIaIA=u{P*^@F=_?3rZ;-8uXyUv%tr#<A4_s%v#PwH_}ItHA%n zFsb}oE6mR3o$G$pme4TiP{|R=A~9q#9|%j0u-uhJgC-%C<}Lh*HM!F5M1S{ky@al8 ze0DYz?9Dx#+i|}MhdiXoP+c4nVlGB^cts!)Ybf)8oK*)8bzP1enX=Nf4gc8wk!IQ7e*c!_`v3jU__{;0V0;O2#J%8sl zDTfGq1Ff1#qST}$Wzw~?U@iB9kh4?D?IUPv;;wRUpMv?EhMFHi_iOdIMV%b2<3Z+a zg2z)EtK72Q)==(Nsa^#LCV@W8aqjx};Zo}VePI_P)2x{L)~8F;z#O6XCcRMxvA$H_ z5g|fss6>1g7moz*?V*79>iZwhCoJehL|<^(%zk^8|M$r`da2-$?J7PUT!zV8#w+{V z`#E?CoBQ~jk+zxga(ZzkV2Ju;lhLNbie;a~MbS7oRArTmYF0*~oQi~1+(b;KSq=hR z9LA_XJq89>g|W-z#WyrsM&>dBU4}&mxMtgQBH}|@%<@-}h+>`;`~}LWJ<;o{w>M}8 zG)4QZgqDllext_;M0{H!Y)(#~f zu&9^UJ#g9qxB{>41kgsSlMm!wb)cKButVE-rjJ109RJG$Y*ku`c=U11_j z%fQBV_1H)hsb?3UkRk=?@w}kbzAI>^kS3eNnpaEU>Iv-1$y_y|A!*zI>$*)X_7%&-?xF z{?nCC3KV%{4||P{UBmZrl0HQWjhpT4tIQAzeRT~eUy{3rSY>Sl*>d+1vQ^K_Ow-=O zS_~5i+tt143LjnlFw{{q`_aTWxFJ>U7gy+Beaa3}*~;gJ@GC!GJj#Tq7`Hoa0&3sB zp}Oii$#>%eahA6SsD&qf09C2au&_UyuT){peQ~zl{RqCnXha5h*DtYy#Ajl(6`m z)}OV9UoicPI&d}PXC0l3F`7y!cqoN0zty}6g8C|BorA?&nVcp)^k%3*5ooF?e-n@0 z;8-6el&(c&ussx!tZ0lL-lL)l|6X)2vn7iLLmeqMb-i^EsHW~Bb7pElR4As`?7s2m zu1FfRT<6V*mM=X3C2A{KCGsPuG3z zp9JsvM!H|mJ4i>43YURAg9)b%^!@A7KC(60+&W!8J&IGWx`znQ11scggO(_MlYOaF@-1!)uQhh_7A z9kF#E!ED7DEJE*-nrfDM!-@os2gwLG>q1GnZoD)~YRASxuR-t|C;>_L1wHE+e % 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

}crL&DeLe5VzW0Ol! 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

5>mC9!?p}}Aj3N<+y%vkue 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