From 54f02a55d22eba64e39b42d40e3447e83835a55d Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 14 May 2020 16:22:50 +0100 Subject: [PATCH 1/3] remove promises before saving metadata --- autofit/tools/phase.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/autofit/tools/phase.py b/autofit/tools/phase.py index 93e29241f..561aca4d6 100644 --- a/autofit/tools/phase.py +++ b/autofit/tools/phase.py @@ -2,6 +2,7 @@ import os import pickle from abc import ABC, abstractmethod +from copy import deepcopy from typing import Dict import dill @@ -105,7 +106,7 @@ def save_meta_dataset(self, meta_dataset): "wb+" ) as f: pickle.dump( - meta_dataset, f + break_promises(meta_dataset), f ) def save_phase_attributes(self, phase_attributes): @@ -355,3 +356,41 @@ def grid_priors(self): ) return GridSearchExtension + + +def break_promises( + obj +): + """ + metadata is flakier than Rich Taylor + + Remove promises recursively. + + Parameters + ---------- + obj + Some object + + Returns + ------- + That object, sans promises + """ + if isinstance( + obj, list + ): + return [ + break_promises(item) + for item in obj + ] + if isinstance( + obj, dict + ): + return { + key: break_promises(value) + for key, value + in obj.items() + } + try: + obj.__dict__ = break_promises(obj.__dict__) + except AttributeError: + return obj From c9c4fb6dd499b6bea63ee3934e5f5ad16684aad3 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 14 May 2020 16:25:18 +0100 Subject: [PATCH 2/3] import --- autofit/tools/phase.py | 1 - 1 file changed, 1 deletion(-) diff --git a/autofit/tools/phase.py b/autofit/tools/phase.py index 561aca4d6..deb078d30 100644 --- a/autofit/tools/phase.py +++ b/autofit/tools/phase.py @@ -2,7 +2,6 @@ import os import pickle from abc import ABC, abstractmethod -from copy import deepcopy from typing import Dict import dill From f4fc38d86d4f82deda6d4a49ab87a6cf0523ee5d Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 14 May 2020 16:32:46 +0100 Subject: [PATCH 3/3] tested working promise breaking --- autofit/tools/phase.py | 7 +++++-- test_autofit/unit/test_break_promises.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test_autofit/unit/test_break_promises.py diff --git a/autofit/tools/phase.py b/autofit/tools/phase.py index deb078d30..9be98b422 100644 --- a/autofit/tools/phase.py +++ b/autofit/tools/phase.py @@ -8,7 +8,7 @@ from autofit import conf, ModelMapper, convert_paths from autofit import exc -from autofit.mapper.prior.promise import PromiseResult +from autofit.mapper.prior.promise import PromiseResult, AbstractPromise from autofit.optimize import grid_search from autofit.optimize.non_linear.emcee import Emcee from autofit.optimize.non_linear.paths import Paths @@ -374,6 +374,8 @@ def break_promises( ------- That object, sans promises """ + if isinstance(obj, AbstractPromise): + return None if isinstance( obj, list ): @@ -392,4 +394,5 @@ def break_promises( try: obj.__dict__ = break_promises(obj.__dict__) except AttributeError: - return obj + pass + return obj diff --git a/test_autofit/unit/test_break_promises.py b/test_autofit/unit/test_break_promises.py new file mode 100644 index 000000000..939f37ca4 --- /dev/null +++ b/test_autofit/unit/test_break_promises.py @@ -0,0 +1,15 @@ +from autofit.mapper.prior import Promise +from autofit.tools.phase import break_promises + + +class SomeClass: + def __init__(self, a, b): + self.a = a + self.b = b + + +def test_break_promises(): + cls = SomeClass(Promise(None, result_path=(), assert_exists=False), "b") + cls = break_promises(cls) + assert cls.a is None + assert cls.b == "b"