From e943c4b78993d5761c32db5ad53eb6d9d1df42a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pulido?= Date: Thu, 28 Jul 2022 15:51:09 -0400 Subject: [PATCH 1/5] Restore velocities only if found in serialized nc file. Back compatibility for older nc files. --- openmmtools/multistate/multistatereporter.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openmmtools/multistate/multistatereporter.py b/openmmtools/multistate/multistatereporter.py index c27d0939..a7971023 100644 --- a/openmmtools/multistate/multistatereporter.py +++ b/openmmtools/multistate/multistatereporter.py @@ -1723,9 +1723,12 @@ def _read_sampler_states_from_given_file(self, iteration, storage_file='checkpoi x = storage.variables['positions'][read_iteration, replica_index, :, :].astype(np.float64) positions = unit.Quantity(x, unit.nanometers) - # Restore velocities. - x = storage.variables['velocities'][read_iteration, replica_index, :, :].astype(np.float64) - velocities = unit.Quantity(x, unit.nanometer/unit.picoseconds) + # Restore velocities for recent versions of openmmtools (>0.21.2) + try: + x = storage.variables['velocities'][read_iteration, replica_index, :, :].astype(np.float64) + velocities = unit.Quantity(x, unit.nanometer / unit.picoseconds) + except KeyError: # Velocities key/variable not found in serialization (openmmtools<=0.21.2) + pass if 'box_vectors' in storage.variables: # Restore box vectors. From 3a15ae281e802ca8ca7eb11b5a3c983196ee2a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pulido?= Date: Fri, 29 Jul 2022 16:25:19 -0400 Subject: [PATCH 2/5] Test resuming from legacy reporter files (no velocities). Adding test files. --- .../alanine_dipeptide_legacy.nc | Bin 0 -> 197213 bytes .../alanine_dipeptide_legacy_checkpoint.nc | Bin 0 -> 93625 bytes openmmtools/tests/test_sampling.py | 51 +++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 openmmtools/data/reporter-examples/alanine_dipeptide_legacy.nc create mode 100644 openmmtools/data/reporter-examples/alanine_dipeptide_legacy_checkpoint.nc diff --git a/openmmtools/data/reporter-examples/alanine_dipeptide_legacy.nc b/openmmtools/data/reporter-examples/alanine_dipeptide_legacy.nc new file mode 100644 index 0000000000000000000000000000000000000000..32d415e837e13093959e45db805548b3d108aace GIT binary patch literal 197213 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 literal 0 HcmV?d00001 diff --git a/openmmtools/data/reporter-examples/alanine_dipeptide_legacy_checkpoint.nc b/openmmtools/data/reporter-examples/alanine_dipeptide_legacy_checkpoint.nc new file mode 100644 index 0000000000000000000000000000000000000000..95175726777278bd5288acb577747a415640e160 GIT binary patch literal 93625 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%0AYw80hXu&;!sQYFygM(A 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 NmN){6{udNSJ^qCgoc{m- literal 0 HcmV?d00001 diff --git a/openmmtools/tests/test_sampling.py b/openmmtools/tests/test_sampling.py index b15d2616..d60587ba 100644 --- a/openmmtools/tests/test_sampling.py +++ b/openmmtools/tests/test_sampling.py @@ -16,14 +16,13 @@ import contextlib import copy import inspect -import math import os import pickle +import shutil import sys from io import StringIO import numpy as np -import scipy.integrate import yaml from nose.plugins.attrib import attr from nose.tools import assert_raises @@ -1307,6 +1306,54 @@ def test_resume_positions_velocities_from_storage(self): assert np.allclose(original_state.positions, restored_state.positions) assert np.allclose(original_state.velocities, restored_state.velocities) + def test_resume_velocities_from_legacy_storage(self): + """ + This tests simulations can be resumed even if velocities are not present in the serialized/reporter file. + + This emulates the behavior of reading older versions (previous to 0.21.3 release) of serialized simulations. + """ + import netCDF4 + origin_reporter_path = testsystems.get_data_filename( + os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy.nc") + ) + origin_checkpoint_path = testsystems.get_data_filename( + os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy_checkpoint.nc") + ) + # Assert no velocities in legacy dataset variables + netcdf_data = netCDF4.Dataset(origin_checkpoint_path) # open checkpoint for reading + assert 'velocities' not in netcdf_data.variables, "velocities variable should not exist in legacy reporter " \ + "netcdf file." + + with self.temporary_storage_path() as storage_path: + # copy files to temporary directory + temporary_checkpoint_path = f"{os.path.splitext(storage_path)[0]}_checkpoint.nc" + reporter_path = shutil.copy(origin_reporter_path, storage_path) # copy reporter file + checkpoint_path = shutil.copy(origin_checkpoint_path, temporary_checkpoint_path) # copy checkpoint file + # Load repex simulation + reporter = self.REPORTER(reporter_path, checkpoint_interval=1) + sampler = self.SAMPLER.from_storage(reporter) + # Assert velocities are initialized as zeros + for state in sampler.sampler_states: + assert np.all(state.velocities.value_in_unit_system(unit.md_unit_system) == 0), \ + "Velocities in sampler state from legacy checkpoint are expected to be all zeros." + + # Resume simulation + sampler.extend(n_iterations=1) + + # delete reporters and load again + del sampler + reporter.close() + # assert velocities variable exist + netcdf_data = netCDF4.Dataset(checkpoint_path) # open checkpoint for reading + assert 'velocities' in netcdf_data.variables, "velocities variable should exist in new reporter " \ + "netcdf file." + netcdf_data.close() # close or it errors in next line + # Load repex simulation from new reporter file + new_sampler = self.SAMPLER.from_storage(reporter) + # assert velocities in sampler states are non-zero + for state in new_sampler.sampler_states: + assert np.any(state.velocities.value_in_unit_system(unit.md_unit_system) != 0), \ + "At least some velocity in sampler state from new checkpoint is expected to different from zero." def test_last_iteration_functions(self): """Test that the last_iteration functions work right""" From 89202c90756ec7e70b320859d3d46a93bb2b3965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pulido?= Date: Fri, 29 Jul 2022 16:26:50 -0400 Subject: [PATCH 3/5] Add velocities variable to storage and initialize velocities to zeros if not found. --- openmmtools/multistate/multistatereporter.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openmmtools/multistate/multistatereporter.py b/openmmtools/multistate/multistatereporter.py index a7971023..45351b0a 100644 --- a/openmmtools/multistate/multistatereporter.py +++ b/openmmtools/multistate/multistatereporter.py @@ -1666,6 +1666,10 @@ def _write_sampler_states_to_given_file(self, sampler_states: list, iteration: i # Store velocites # TODO: This stores velocities as zeros if no velocities are present in the sampler state. Making restored # sampler_state different from origin. + if 'velocities' not in storage.variables: + # create variable with expected dimensions and shape + storage.createVariable('velocities', storage.variables['positions'].dtype, + dimensions=storage.variables['positions'].dimensions) storage.variables['velocities'][write_iteration, :, :, :] = velocities if is_periodic: @@ -1728,7 +1732,8 @@ def _read_sampler_states_from_given_file(self, iteration, storage_file='checkpoi x = storage.variables['velocities'][read_iteration, replica_index, :, :].astype(np.float64) velocities = unit.Quantity(x, unit.nanometer / unit.picoseconds) except KeyError: # Velocities key/variable not found in serialization (openmmtools<=0.21.2) - pass + # pass zeros as velocities when key is not found (<0.21.3 behavior) + velocities = np.zeros_like(positions) if 'box_vectors' in storage.variables: # Restore box vectors. From dcfa4373c0fc7ed7bf9d524d81dfaae05e6765fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pulido?= Date: Mon, 1 Aug 2022 19:47:31 -0400 Subject: [PATCH 4/5] Reworking class inheritance for resuming serialized objects test. --- openmmtools/tests/test_sampling.py | 201 +++++++++++++++-------------- 1 file changed, 106 insertions(+), 95 deletions(-) diff --git a/openmmtools/tests/test_sampling.py b/openmmtools/tests/test_sampling.py index d60587ba..f966cbac 100644 --- a/openmmtools/tests/test_sampling.py +++ b/openmmtools/tests/test_sampling.py @@ -551,9 +551,8 @@ def test_store_mixing_statistics(self): # TEST MULTISTATE SAMPLERS # ============================================================================== -class TestMultiStateSampler(object): - """Base test suite for the multi-state classes""" - +class TestBaseMultistateSampler(object): + """Minimal Base class to test sampler objects""" # ------------------------------------ # VARIABLES TO SET FOR EACH TEST CLASS # ------------------------------------ @@ -563,6 +562,54 @@ class TestMultiStateSampler(object): SAMPLER = MultiStateSampler REPORTER = MultiStateReporter + @staticmethod + @contextlib.contextmanager + def temporary_storage_path(): + """Generate a storage path in a temporary folder and share it. + + It makes it possible to run tests on multiple nodes with MPI. + + """ + mpicomm = mpiplus.get_mpicomm() + with temporary_directory() as tmp_dir_path: + storage_file_path = os.path.join(tmp_dir_path, 'test_storage.nc') + if mpicomm is not None: + storage_file_path = mpicomm.bcast(storage_file_path, root=0) + yield storage_file_path + + @staticmethod + @contextlib.contextmanager + def captured_output(): + new_out, new_err = StringIO(), StringIO() + old_out, old_err = sys.stdout, sys.stderr + try: + sys.stdout, sys.stderr = new_out, new_err + yield sys.stdout, sys.stderr + finally: + sys.stdout, sys.stderr = old_out, old_err + + @staticmethod + def property_creator(name, on_disk_name, value, on_disk_value): + """ + Helper to create additional properties to create for checking + + Makes a nested dict where the top key is the 'name', with one + value as a dict where the sub-dict is of the form: + {'value': value, + 'on_disk_name': on_disk_name, + 'on_disk_value': on_disk_value + } + """ + return {name: { + + 'value': value, + 'on_disk_value': on_disk_value, + 'on_disk_name': on_disk_name + }} + + +class TestMultiStateSampler(TestBaseMultistateSampler): + """Base test suite for the multi-state classes""" # -------------------------------------- # Optional helper function to overwrite. # -------------------------------------- @@ -678,21 +725,6 @@ def setup_class(cls): print(output_descr) print("#" * len_output) - @staticmethod - @contextlib.contextmanager - def temporary_storage_path(): - """Generate a storage path in a temporary folder and share it. - - It makes it possible to run tests on multiple nodes with MPI. - - """ - mpicomm = mpiplus.get_mpicomm() - with temporary_directory() as tmp_dir_path: - storage_file_path = os.path.join(tmp_dir_path, 'test_storage.nc') - if mpicomm is not None: - storage_file_path = mpicomm.bcast(storage_file_path, root=0) - yield storage_file_path - @staticmethod def get_node_replica_ids(tot_n_replicas): """Return the indices of the replicas that this node is responsible for.""" @@ -702,35 +734,6 @@ def get_node_replica_ids(tot_n_replicas): else: return set(range(mpicomm.rank, tot_n_replicas, mpicomm.size)) - @staticmethod - @contextlib.contextmanager - def captured_output(): - new_out, new_err = StringIO(), StringIO() - old_out, old_err = sys.stdout, sys.stderr - try: - sys.stdout, sys.stderr = new_out, new_err - yield sys.stdout, sys.stderr - finally: - sys.stdout, sys.stderr = old_out, old_err - - @staticmethod - def property_creator(name, on_disk_name, value, on_disk_value): - """ - Helper to create additional properties to create for checking - - Makes a nested dict where the top key is the 'name', with one - value as a dict where the sub-dict is of the form: - {'value': value, - 'on_disk_name': on_disk_name, - 'on_disk_value': on_disk_value - } - """ - return {name: { - - 'value': value, - 'on_disk_value': on_disk_value, - 'on_disk_name': on_disk_name - }} def test_create(self): """Test creation of a new MultiState simulation. @@ -1306,54 +1309,6 @@ def test_resume_positions_velocities_from_storage(self): assert np.allclose(original_state.positions, restored_state.positions) assert np.allclose(original_state.velocities, restored_state.velocities) - def test_resume_velocities_from_legacy_storage(self): - """ - This tests simulations can be resumed even if velocities are not present in the serialized/reporter file. - - This emulates the behavior of reading older versions (previous to 0.21.3 release) of serialized simulations. - """ - import netCDF4 - origin_reporter_path = testsystems.get_data_filename( - os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy.nc") - ) - origin_checkpoint_path = testsystems.get_data_filename( - os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy_checkpoint.nc") - ) - # Assert no velocities in legacy dataset variables - netcdf_data = netCDF4.Dataset(origin_checkpoint_path) # open checkpoint for reading - assert 'velocities' not in netcdf_data.variables, "velocities variable should not exist in legacy reporter " \ - "netcdf file." - - with self.temporary_storage_path() as storage_path: - # copy files to temporary directory - temporary_checkpoint_path = f"{os.path.splitext(storage_path)[0]}_checkpoint.nc" - reporter_path = shutil.copy(origin_reporter_path, storage_path) # copy reporter file - checkpoint_path = shutil.copy(origin_checkpoint_path, temporary_checkpoint_path) # copy checkpoint file - # Load repex simulation - reporter = self.REPORTER(reporter_path, checkpoint_interval=1) - sampler = self.SAMPLER.from_storage(reporter) - # Assert velocities are initialized as zeros - for state in sampler.sampler_states: - assert np.all(state.velocities.value_in_unit_system(unit.md_unit_system) == 0), \ - "Velocities in sampler state from legacy checkpoint are expected to be all zeros." - - # Resume simulation - sampler.extend(n_iterations=1) - - # delete reporters and load again - del sampler - reporter.close() - # assert velocities variable exist - netcdf_data = netCDF4.Dataset(checkpoint_path) # open checkpoint for reading - assert 'velocities' in netcdf_data.variables, "velocities variable should exist in new reporter " \ - "netcdf file." - netcdf_data.close() # close or it errors in next line - # Load repex simulation from new reporter file - new_sampler = self.SAMPLER.from_storage(reporter) - # assert velocities in sampler states are non-zero - for state in new_sampler.sampler_states: - assert np.any(state.velocities.value_in_unit_system(unit.md_unit_system) != 0), \ - "At least some velocity in sampler state from new checkpoint is expected to different from zero." def test_last_iteration_functions(self): """Test that the last_iteration functions work right""" @@ -1936,6 +1891,62 @@ def _compute_energies_independently(cls, sampler): return energy_thermodynamic_states, energy_unsampled_states +class TestSerializedMultiStateSampler(TestBaseMultistateSampler): + """ + Test suite for serialized MultiStateSampler objects. + + Requires a different class because serialized objects are not fully compatible between different classes. + """ + + def test_resume_velocities_from_legacy_storage(self): + """ + This tests simulations can be resumed even if velocities are not present in the serialized/reporter file. + + This emulates the behavior of reading older versions (previous to 0.21.3 release) of serialized simulations. + """ + import netCDF4 + origin_reporter_path = testsystems.get_data_filename( + os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy.nc") + ) + origin_checkpoint_path = testsystems.get_data_filename( + os.path.join("data", "reporter-examples", "alanine_dipeptide_legacy_checkpoint.nc") + ) + # Assert no velocities in legacy dataset variables + netcdf_data = netCDF4.Dataset(origin_checkpoint_path) # open checkpoint for reading + assert 'velocities' not in netcdf_data.variables, "velocities variable should not exist in legacy reporter " \ + "netcdf file." + + with self.temporary_storage_path() as storage_path: + # copy files to temporary directory + temporary_checkpoint_path = f"{os.path.splitext(storage_path)[0]}_checkpoint.nc" + reporter_path = shutil.copy(origin_reporter_path, storage_path) # copy reporter file + checkpoint_path = shutil.copy(origin_checkpoint_path, temporary_checkpoint_path) # copy checkpoint file + # Load repex simulation + reporter = self.REPORTER(reporter_path, checkpoint_interval=1) + sampler = self.SAMPLER.from_storage(reporter) + # Assert velocities are initialized as zeros + for state in sampler.sampler_states: + assert np.all(state.velocities.value_in_unit_system(unit.md_unit_system) == 0), \ + "Velocities in sampler state from legacy checkpoint are expected to be all zeros." + + # Resume simulation + sampler.extend(n_iterations=1) + + # delete reporters and load again + del sampler + reporter.close() + # assert velocities variable exist + netcdf_data = netCDF4.Dataset(checkpoint_path) # open checkpoint for reading + assert 'velocities' in netcdf_data.variables, "velocities variable should exist in new reporter " \ + "netcdf file." + netcdf_data.close() # close or it errors in next line + # Load repex simulation from new reporter file + new_sampler = self.SAMPLER.from_storage(reporter) + # assert velocities in sampler states are non-zero + for state in new_sampler.sampler_states: + assert np.any(state.velocities.value_in_unit_system(unit.md_unit_system) != 0), \ + "At least some velocity in sampler state from new checkpoint is expected to different from zero." + # ============================================================================== # MAIN AND TESTS # ============================================================================== From eac7b260241b4e3b13afecf20d53273d0b19afce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pulido?= Date: Mon, 1 Aug 2022 19:54:24 -0400 Subject: [PATCH 5/5] Comment on fix for enabling reading from older serialized objects. --- openmmtools/multistate/multistatereporter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmmtools/multistate/multistatereporter.py b/openmmtools/multistate/multistatereporter.py index 45351b0a..29edbc6a 100644 --- a/openmmtools/multistate/multistatereporter.py +++ b/openmmtools/multistate/multistatereporter.py @@ -1727,7 +1727,8 @@ def _read_sampler_states_from_given_file(self, iteration, storage_file='checkpoi x = storage.variables['positions'][read_iteration, replica_index, :, :].astype(np.float64) positions = unit.Quantity(x, unit.nanometers) - # Restore velocities for recent versions of openmmtools (>0.21.2) + # Restore velocities + # try-catch exception, enabling reading legacy/older serialized objects from openmmtools<0.21.3 try: x = storage.variables['velocities'][read_iteration, replica_index, :, :].astype(np.float64) velocities = unit.Quantity(x, unit.nanometer / unit.picoseconds)