diff --git a/autofit/tools/phase.py b/autofit/tools/phase.py index 93e29241f..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 @@ -105,7 +105,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 +355,44 @@ 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, AbstractPromise): + return None + 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: + 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"