def test_set_symtable(self): # test that we use Parameter.set(value=XXX) and have # that new value be used in constraint expressions pars = Parameters() pars.add('x', value=1.0) pars.add('y', expr='x + 1') assert_(isclose(pars['y'].value, 2.0)) pars['x'].set(value=3.0) assert_(isclose(pars['y'].value, 4.0))
def test_isclose(self): assert_(isclose(1., 1+1e-5, atol=1e-4, rtol=0)) assert_(not isclose(1., 1+1e-5, atol=1e-6, rtol=0)) assert_(isclose(1e10, 1.00001e10, rtol=1e-5, atol=1e-8)) assert_(not isclose(0, np.inf)) assert_(not isclose(-np.inf, np.inf)) assert_(isclose(np.inf, np.inf)) assert_(not isclose(np.nan, np.nan))
def test_expr_with_bounds(self): "test an expression with bounds, without value" pars = Parameters() pars.add('c1', value=0.2) pars.add('c2', value=0.2) pars.add('c3', value=0.2) pars.add('csum', value=0.8) # this should not raise TypeError: pars.add('c4', expr='csum-c1-c2-c3', min=0, max=1) assert_(isclose(pars['c4'].value, 0.2))
def test_dumps_loads_parameters(self): # test that we can dumps() and then loads() a Parameters pars = Parameters() pars.add('x', value=1.0) pars.add('y', value=2.0) pars['x'].expr = 'y / 2.0' dumps = pars.dumps() newpars = Parameters().loads(dumps) newpars['y'].value = 100.0 assert_(isclose(newpars['x'].value, 50.0))
def test_params_usersyms(self): # test passing usersymes to Parameters() def myfun(x): return x**3 params = Parameters(usersyms={"myfun": myfun}) params.add("a", value=2.3) params.add("b", expr="myfun(a)") xx = np.linspace(0, 1, 10) yy = 3 * xx + np.random.normal(scale=0.002, size=len(xx)) model = Model(lambda x, a: a * x) result = model.fit(yy, params=params, x=xx) assert_(isclose(result.params['a'].value, 3.0, rtol=0.025)) assert_(result.nfev > 3) assert_(result.nfev < 300)