From a57c9336792da3bae0dab989b0dff2705d3385b6 Mon Sep 17 00:00:00 2001 From: Gregory Ashton <gregory.ashton@ligo.org> Date: Mon, 25 Feb 2019 20:18:51 -0600 Subject: [PATCH] Converts dynesty checkpointing to use pickle instead of deepdish --- bilby/core/sampler/dynesty.py | 38 ++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/bilby/core/sampler/dynesty.py b/bilby/core/sampler/dynesty.py index eea417e28..c4046a5fb 100644 --- a/bilby/core/sampler/dynesty.py +++ b/bilby/core/sampler/dynesty.py @@ -2,10 +2,11 @@ from __future__ import absolute_import import os import sys +import pickle +import signal import numpy as np from pandas import DataFrame -from deepdish.io import load, save from ..utils import logger, check_directory_exists_and_if_not_mkdir from .base_sampler import Sampler, NestedSampler @@ -103,6 +104,9 @@ class Dynesty(NestedSampler): n_check_point_rnd = int(float("{:1.0g}".format(n_check_point_raw))) self.n_check_point = n_check_point_rnd + signal.signal(signal.SIGTERM, self.write_current_state_and_exit) + signal.signal(signal.SIGINT, self.write_current_state_and_exit) + @property def sampler_function_kwargs(self): keys = ['dlogz', 'print_progress', 'print_func', 'maxiter', @@ -258,10 +262,13 @@ class Dynesty(NestedSampler): Whether the run is continuing or terminating, if True, the loaded state is mostly written back to disk. """ - resume_file = '{}/{}_resume.h5'.format(self.outdir, self.label) + resume_file = '{}/{}_resume.pickle'.format(self.outdir, self.label) + logger.debug("Reading resume file {}".format(resume_file)) if os.path.isfile(resume_file): - saved = load(resume_file) + with open(resume_file, 'rb') as file: + saved = pickle.load(file) + logger.debug("Succesfuly read resume file {}".format(resume_file)) self.sampler.saved_u = list(saved['unit_cube_samples']) self.sampler.saved_v = list(saved['physical_samples']) @@ -294,6 +301,11 @@ class Dynesty(NestedSampler): else: return False + def write_current_state_and_exit(self, signum=None, frame=None): + self.write_current_state() + logger.warning("Run terminated") + sys.exit() + def write_current_state(self): """ Write the current state of the sampler to disk. @@ -311,10 +323,11 @@ class Dynesty(NestedSampler): NestedSampler to write to disk. """ check_directory_exists_and_if_not_mkdir(self.outdir) - resume_file = '{}/{}_resume.h5'.format(self.outdir, self.label) + resume_file = '{}/{}_resume.pickle'.format(self.outdir, self.label) if os.path.isfile(resume_file): - saved = load(resume_file) + with open(resume_file, 'rb') as file: + saved = pickle.load(file) current_state = dict( unit_cube_samples=np.vstack([ @@ -370,12 +383,17 @@ class Dynesty(NestedSampler): added_live=self.sampler.added_live ) - weights = np.exp(current_state['sample_log_weights'] - - current_state['cumulative_log_evidence'][-1]) - current_state['posterior'] = self.external_sampler.utils.resample_equal( - np.array(current_state['physical_samples']), weights) + try: + weights = np.exp(current_state['sample_log_weights'] - + current_state['cumulative_log_evidence'][-1]) + + current_state['posterior'] = self.external_sampler.utils.resample_equal( + np.array(current_state['physical_samples']), weights) + except ValueError: + logger.debug("Unable to create posterior") - save(resume_file, current_state) + with open(resume_file, 'wb') as file: + pickle.dump(current_state, file) self.sampler.saved_id = [self.sampler.saved_id[-1]] self.sampler.saved_u = [self.sampler.saved_u[-1]] -- GitLab