diff --git a/bilby/core/result.py b/bilby/core/result.py index 072d1e52ddbc807d62f91aa70893595d4583dd1c..c265e7803c71d24a0ef7d376794929dc032d9af6 100644 --- a/bilby/core/result.py +++ b/bilby/core/result.py @@ -20,6 +20,7 @@ from .utils import ( decode_bilby_json, docstring, recursively_save_dict_contents_to_group, recursively_load_dict_contents_from_group, + recursively_decode_bilby_json, ) from .prior import Prior, PriorDict, DeltaFunction @@ -560,6 +561,17 @@ class Result(object): else: return '' + @property + def meta_data(self): + return self._meta_data + + @meta_data.setter + def meta_data(self, meta_data): + if meta_data is None: + meta_data = dict() + meta_data = recursively_decode_bilby_json(meta_data) + self._meta_data = meta_data + @property def priors(self): if self._priors is not None: diff --git a/bilby/core/utils.py b/bilby/core/utils.py index fd0c558ed160f56ebe75545897c923f57f1dabf1..53196de80e1ccc66753abc946c39b46a16c61a67 100644 --- a/bilby/core/utils.py +++ b/bilby/core/utils.py @@ -1108,6 +1108,28 @@ def decode_astropy_quantity(dct): return dct +def recursively_decode_bilby_json(dct): + """ + Recursively call `bilby_decode_json` + + Parameters + ---------- + dct: dict + The dictionary to decode + + Returns + ------- + dct: dict + The original dictionary with all the elements decode if possible + """ + dct = decode_bilby_json(dct) + if isinstance(dct, dict): + for key in dct: + if isinstance(dct[key], dict): + dct[key] = recursively_decode_bilby_json(dct[key]) + return dct + + def reflect(u): """ Iteratively reflect a number until it is contained in [0, 1]. @@ -1307,10 +1329,14 @@ def decode_from_hdf5(item): elif isinstance(item, (bytes, bytearray)): output = item.decode() elif isinstance(item, np.ndarray): - if "|S" in str(item.dtype) or isinstance(item[0], bytes): + if item.size == 0: + output = item + elif "|S" in str(item.dtype) or isinstance(item[0], bytes): output = [it.decode() for it in item] else: output = item + elif isinstance(item, np.bool_): + output = bool(item) else: output = item return output @@ -1364,9 +1390,11 @@ def encode_for_hdf5(item): elif isinstance(item, pd.Series): output = item.to_dict() elif inspect.isfunction(item) or inspect.isclass(item): - output = dict(__module__=item.__module__, __name__=item.__name__) + output = dict(__module__=item.__module__, __name__=item.__name__, __class__=True) elif isinstance(item, dict): output = item.copy() + elif isinstance(item, tuple): + output = {str(ii): elem for ii, elem in enumerate(item)} else: raise ValueError(f'Cannot save {type(item)} type') return output