def test_data(): hp = gvar.BufferDict({'log(sdev)': gvar.log(gvar.gvar(1, 1))}) x = np.linspace(0, 5, 10) def gpfactory(hp): gp = lgp.GP(lgp.ExpQuad() * hp['sdev']**2) gp.addx(x, 'x') return gp truehp = gvar.sample(hp) truegp = gpfactory(truehp) trueprior = truegp.prior() def makeerr(bd, err): return gvar.BufferDict(bd, buf=np.full_like(bd.buf, err)) data_noerr = gvar.sample(trueprior) error = makeerr(data_noerr, 0.1) zeroerror = makeerr(data_noerr, 0) zerocov = gvar.evalcov(gvar.gvar(data_noerr, zeroerror)) data_err = gvar.make_fake_data(gvar.gvar(data_noerr, error)) datas = [ [ data_noerr, gvar.gvar(data_noerr), (data_noerr, ), (data_noerr, zerocov), lambda _: data_noerr, lambda _: gvar.gvar(data_noerr), lambda _: (data_noerr, ), lambda _: (data_noerr, zerocov), ], [ data_err, (data_err, ), (gvar.mean(data_err), gvar.evalcov(data_err)), lambda _: data_err, lambda _: (data_err, ), lambda _: (gvar.mean(data_err), gvar.evalcov(data_err)), ], ] for datasets in datas: fits = [] for data in datasets: fit = lgp.empbayes_fit(hp, gpfactory, data) fits.append(fit) p = fits[0].minresult.x for fit in fits[1:]: np.testing.assert_allclose(fit.minresult.x, p, atol=1e-6)
def setUp(self): gv.ranseed(1) a = gv.gvar('1.000(1)') b = gv.gvar('0.500(1)') self.x = np.array([0.1, 0.2, 0.3, 0.4]) def fcn(p, x=self.x): ans = gv.BufferDict() ans['l'] = p['a'] + p['b'] * x ans['c1'] = 4 * [p['a']] ans['c2'] = 4 * [p['a']] return ans self.prior = gv.BufferDict([('a', a), ('b', b)]) self.data = gv.make_fake_data(fcn(self.prior)) self.fcn = fcn # reference fit without using MultiFitter self.ref_fit = lsqfit.nonlinear_fit(prior=self.prior, fcn=self.fcn, data=self.data) # these data should be ignored self.data['dummy'] = gv.gvar(['1(1)', '2(2)'])
return prior #### FAKE DATA #### truehp = gvar.sample(hyperprior) truegp = makegp(truehp) trueprior = makeprior(truegp, plot=True) trueparams = gvar.sample(trueprior) truedata = fcn(trueparams) dataerr = { k: np.full_like(v, 0.1 * (np.max(v) - np.min(v))) for k, v in truedata.items() } data = gvar.make_fake_data(gvar.gvar(truedata, dataerr)) def check_constraints(y): # integrate approximately with trapezoid rule integ = np.sum((y[:, 1:] + y[:, :-1]) / 2 * np.diff(plotgrid), 1) print('int dx x (Sigma(x) + g(x)) =', integ[0] + integ[-1]) for i in range(1, 5): print(f'int dx {tpnames[i]}(x) =', integ[i]) for i, name in enumerate(tpnames): print(f'{name}(1) =', y[i, -1]) print('\ncheck constraints in fake data:') check_constraints(trueparams['plotgrid'])