def test_smeared_reflectivity_fitter(self): # test smeared reflectivity calculation with values generated from # Motofit (quadrature precsion order = 13) theoretical = np.loadtxt(os.path.join(path, 'smeared_theoretical.txt')) qvals, rvals, dqvals = np.hsplit(theoretical, 3) ''' the order of the quadrature precision used to create these smeared values in Motofit was 13. Do the same here ''' params = curvefitter.to_parameters(self.coefs) fitfunc = RFF(quad_order=13) fitter = CurveFitter(fitfunc, (qvals, rvals), params, fcn_kws={'dqvals': dqvals}) model = fitter.model(params) assert_almost_equal(model, rvals)
class TestFitter(unittest.TestCase): def setUp(self): self.xdata = np.linspace(-4, 4, 100) self.p0 = np.array([0., 1., 0.0, 1.]) self.bounds = [(-1, 1), (0, 2), (-1, 1.), (0.001, 2)] self.params = curvefitter.to_parameters(self.p0 + 0.2, bounds=self.bounds) self.final_params = curvefitter.to_parameters(self.p0, bounds=self.bounds) self.ydata = gauss(self.xdata, self.final_params) self.f = CurveFitter(gauss, (self.xdata, self.ydata), self.params) def test_fitting(self): # the simplest test - a really simple gauss curve with perfect data res = self.f.fit() assert_almost_equal(values(res.params), self.p0) assert_almost_equal(res.chisqr, 0) def test_NIST(self): # Run all the NIST standard tests with leastsq for model in Models: try: NIST_runner(model) except Exception: print(model) raise def test_model_returns_function(self): ydata = gauss(self.xdata, self.final_params) model = self.f.model(self.final_params) assert_almost_equal(ydata, model) def test_residuals(self): resid = self.f.residuals(self.final_params) assert_almost_equal(np.sum(resid**2), 0) def test_cost(self): resid = self.f.residuals(self.final_params) assert_almost_equal(0, np.sum(resid**2)) def test_leastsq(self): # test that a custom method can be used with scipy.optimize.minimize res = self.f.fit() assert_almost_equal(values(res.params), self.p0) def test_resid_length(self): # the residuals length should be equal to the data length resid = self.f.residuals(self.params) assert_equal(resid.size, self.f.dataset.y.size) def test_scalar_minimize(self): assert_equal(values(self.params), self.p0 + 0.2) res = self.f.fit(method='differential_evolution') assert_almost_equal(values(res.params), self.p0, 3) def test_holding_parameter(self): # holding parameters means that those parameters shouldn't change # during a fit self.params['p0'].vary = False res = self.f.fit() assert_almost_equal(self.p0[0] + 0.2, self.params['p0'].value) assert_almost_equal(res.params['p0'].value, self.params['p0'].value) def test_fit_returns_MinimizerResult(self): self.params['p0'].vary = False res = self.f.fit() assert_(isinstance(res, MinimizerResult)) def test_costfun(self): # test user defined costfun res = self.f.fit('nelder') def costfun(params, generative, y, e): return np.sum((y - generative / e) ** 2) g = CurveFitter(gauss, (self.xdata, self.ydata), self.params, costfun=costfun) res2 = g.fit('nelder') assert_almost_equal(values(res.params), values(res2.params)) def test_args_kwds_are_used(self): # check that user defined args and kwds make their way into the user # function a = [1., 2.] x = np.linspace(0, 10, 11) y = a[0] + 1 + 2 * a[1] * x par = Parameters() par.add('p0', 1.5) par.add('p1', 2.5) def fun(x, p, *args, **kwds): assert_equal(args, a) return args[0] + p['p0'] + p['p1'] * a[1] * x g = CurveFitter(fun, (x, y), par, fcn_args=a) res = g.fit() assert_almost_equal(values(res.params), [1., 2.]) d = {'a': 1, 'b': 2} def fun(x, p, *args, **kwds): return kwds['a'] + p['p0'] + p['p1'] * kwds['b'] * x g = CurveFitter(fun, (x, y), par, fcn_kws=d) res = g.fit() assert_almost_equal(values(res.params), [1., 2.])
class TestFitter(unittest.TestCase): def setUp(self): self.xdata = np.linspace(-4, 4, 100) self.p0 = np.array([0., 1., 0.0, 1.]) self.bounds = [(-1, 1), (0, 2), (-1, 1.), (0.001, 2)] self.params = curvefitter.to_parameters(self.p0 + 0.2, bounds=self.bounds) self.final_params = curvefitter.to_parameters(self.p0, bounds=self.bounds) self.ydata = gauss(self.xdata, self.final_params) self.f = CurveFitter(gauss, (self.xdata, self.ydata), self.params) def pvals(self, params): return np.asfarray(list(params.valuesdict().values())) def test_fitting(self): # the simplest test - a really simple gauss curve with perfect data res = self.f.fit() assert_almost_equal(self.pvals(res.params), self.p0) assert_almost_equal(res.chisqr, 0) def test_NIST(self): # Run all the NIST standard tests with leastsq for model in Models.keys(): try: NIST_runner(model) except Exception: print(model) raise def test_model_returns_function(self): ydata = gauss(self.xdata, self.final_params) model = self.f.model(self.final_params) assert_almost_equal(ydata, model) def test_residuals(self): resid = self.f.residuals(self.final_params) assert_almost_equal(np.sum(resid**2), 0) def test_cost(self): resid = self.f.residuals(self.final_params) assert_almost_equal(0, np.sum(resid**2)) def test_leastsq(self): # test that a custom method can be used with scipy.optimize.minimize res = self.f.fit() assert_almost_equal(self.pvals(res.params), self.p0) def test_resid_length(self): # the residuals length should be equal to the data length resid = self.f.residuals(self.params) assert_equal(resid.size, self.f.ydata.size) def test_scalar_minimize(self): assert_equal(self.pvals(self.params), self.p0 + 0.2) res = self.f.fit(method='differential_evolution') assert_almost_equal(self.pvals(res.params), self.p0, 3) def test_holding_parameter(self): # holding parameters means that those parameters shouldn't change # during a fit self.params['p0'].vary = False res = self.f.fit() assert_almost_equal(self.p0[0] + 0.2, self.params['p0'].value) def test_fit_returns_MinimizerResult(self): self.params['p0'].vary = False res = self.f.fit() assert_(isinstance(res, MinimizerResult)) def test_costfun(self): # test user defined costfun res = self.f.fit('nelder') def costfun(params, generative, y, e): return np.sum((y - generative / e) ** 2) g = CurveFitter(gauss, (self.xdata, self.ydata), self.params, costfun=costfun) res2 = g.fit('nelder') assert_almost_equal(self.pvals(res.params), self.pvals(res2.params))