Skip to content

Cryptic error when importing lmfit #314

@caenrigen

Description

@caenrigen

With the latest 0.12.0/0.12.1 release we run into a strange issue that seems totally unrelated that depends on the order of the imports of the lmfit and adaptive:

The following fails:

import adaptive  # >=0.12.0
import lmfit
import numpy as np

def cos_func(t, amplitude, frequency, phase, offset):
    """A simple cosine function"""
    return amplitude * np.cos(2 * np.pi * frequency * t + phase) + offset

mod = lmfit.Model(cos_func)
mod.set_param_hint('amplitude', value=1, vary=True)
mod.set_param_hint('frequency', value=0.2)
mod.set_param_hint('phase', value=0, vary=True)
mod.set_param_hint('offset', value=0, vary=False)
params = mod.make_params()
fit_res = mod.fit(np.cos(np.linspace(0, 5, 10)), t=np.linspace(0, 5, 10), params=mod.make_params())

fit_res.plot_fit(show_init=True)

lmfit.model.save_modelresult(fit_res, 'fit_res.json')

throwing

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-fb6b7cf4fb53> in <module>
     17 fit_res.plot_fit(show_init=True)
     18 
---> 19 lmfit.model.save_modelresult(fit_res, 'fit_res.json')
        global lmfit.model.save_modelresult = <function save_modelresult at 0x12be17830>
        global fit_res = <lmfit.model.ModelResult object at 0x12df5c610>

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/model.py in save_modelresult(modelresult=<lmfit.model.ModelResult object>, fname='fit_res.json')
   1258     """
   1259     with open(fname, 'w') as fout:
-> 1260         modelresult.dump(fout)
        modelresult.dump = <bound method ModelResult.dump of <lmfit.model.ModelResult object at 0x12df5c610>>
        fout = <_io.TextIOWrapper name='fit_res.json' mode='w' encoding='UTF-8'>
   1261 
   1262 

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/model.py in dump(self=<lmfit.model.ModelResult object>, fp=<_io.TextIOWrapper name='fit_res.json' mode='w' encoding='UTF-8'>, **kws={})
   1668 
   1669         """
-> 1670         return fp.write(self.dumps(**kws))
        fp.write = <built-in method write of _io.TextIOWrapper object at 0x12ae46210>
        self.dumps = <bound method ModelResult.dumps of <lmfit.model.ModelResult object at 0x12df5c610>>
        kws = {}
   1671 
   1672     def loads(self, s, funcdefs=None, **kws):

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/model.py in dumps(self=<lmfit.model.ModelResult object>, **kws={})
   1623         out['params'] = [p.__getstate__() for p in self.params.values()]
   1624         out['unique_symbols'] = {key: encode4js(pasteval.symtable[key])
-> 1625                                  for key in pasteval.user_defined_symbols()}
        global key = undefined
        global pasteval.user_defined_symbols = undefined
   1626 
   1627         for attr in ('aborted', 'aic', 'best_values', 'bic', 'chisqr',

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/model.py in <dictcomp>(.0=<set_iterator object>)
   1623         out['params'] = [p.__getstate__() for p in self.params.values()]
   1624         out['unique_symbols'] = {key: encode4js(pasteval.symtable[key])
-> 1625                                  for key in pasteval.user_defined_symbols()}
        key = 'wofz'
        global pasteval.user_defined_symbols = undefined
   1626 
   1627         for attr in ('aborted', 'aic', 'best_values', 'bic', 'chisqr',

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/jsonutils.py in encode4js(obj=<ufunc 'wofz'>)
     93         else:
     94             val = None
---> 95             importer = find_importer(obj)
        importer = None
        global find_importer = <function find_importer at 0x1083cf170>
        obj = <ufunc 'wofz'>
     96         return dict(__class__='Callable', __name__=obj.__name__,
     97                     pyversion=pyvers, value=val, importer=importer)

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/lmfit/jsonutils.py in find_importer(obj=<ufunc 'wofz'>)
     25         if modname.startswith('__main__'):
     26             continue
---> 27         t = getattr(module, oname, None)
        t = None
        global getattr = undefined
        module = <module 'adaptive.learner.integrator_coeffs' from '/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/adaptive/learner/integrator_coeffs.py'>
        oname = 'wofz'
     28         if t is obj:
     29             return modname

/usr/local/anaconda3/envs/dclab/lib/python3.7/site-packages/adaptive/learner/integrator_coeffs.py in __getattr__(attr='wofz')
    188 
    189 def __getattr__(attr):
--> 190     return _coefficients()[attr]
        global _coefficients = <functools._lru_cache_wrapper object at 0x1260d40f0>
        attr = 'wofz'

KeyError: 'wofz'

BUT this seems to work fine:

import lmfit
import adaptive  # >=0.12.0
import numpy as np

def cos_func(t, amplitude, frequency, phase, offset):
    """A simple cosine function"""
    return amplitude * np.cos(2 * np.pi * frequency * t + phase) + offset

mod = lmfit.Model(cos_func)
mod.set_param_hint('amplitude', value=1, vary=True)
mod.set_param_hint('frequency', value=0.2)
mod.set_param_hint('phase', value=0, vary=True)
mod.set_param_hint('offset', value=0, vary=False)
params = mod.make_params()
fit_res = mod.fit(np.cos(np.linspace(0, 5, 10)), t=np.linspace(0, 5, 10), params=mod.make_params())

fit_res.plot_fit(show_init=True)

lmfit.model.save_modelresult(fit_res, 'fit_res.json')

Any idea what is happening? This fails on python 3.7 and also on python 3.8 (on the readthedocs.com)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions