def test_ExtendedDict(self): " ExtendedDict " # check ExtendedDict() and refill_buf p = BufferDict() p['a'] = 1. p['b'] = [2., 3.] p['log(c)'] = 0. p['sqrt(d)'] = [5., 6.] p['erfinv(e)'] = [[33.]] newp = ExtendedDict(p) for i in range(2): for k in p: assert np.all(p[k] == newp[k]) assert newp['c'] == np.exp(newp['log(c)']) assert np.all(newp['d'] == np.square(newp['sqrt(d)'])) assert np.all(newp['e'] == gv.erf(newp['erfinv(e)'])) assert np.all(p.buf == newp.stripped_buf) p.buf[:] = [10., 20., 30., 1., 2., 3., 4.] newp.buf = np.array(p.buf.tolist() + i * [114., 135., 4223., 0.7]) # trim redundant keys oldp = trim_redundant_keys(newp) assert 'c' not in oldp assert 'd' not in oldp assert np.all(oldp.buf == p.buf) # nonredundant keys assert set(nonredundant_keys(newp.keys())) == set(p.keys()) # stripkey for ks, f, k in [ ('aa', np.exp, 'log(aa)'), ('aa', np.square, 'sqrt(aa)'), ]: assert (ks, f) == ExtendedDict.stripkey(k) # addparentheses pvar = BufferDict() pvar['a'] = p['a'] pvar['b'] = p['b'] pvar['logc'] = p['log(c)'] pvar['sqrtd'] = p['sqrt(d)'] pvar['erfinv(e)'] = p['erfinv(e)'] pvar = add_parameter_parentheses(pvar) for k in p: assert k in pvar assert np.all(p[k] == pvar[k]) for k in pvar: assert k in p pvar = add_parameter_parentheses(pvar) for k in p: assert k in pvar assert np.all(p[k] == pvar[k]) for k in pvar: assert k in p pvar['log(c(23))'] = 1.2 pvar = ExtendedDict(pvar) assert 'c(23)' in pvar assert 'log(c(23))' in pvar
def assert_fitclose(self, fitp, p): """ GVars in fitp agree within NSIG sigma with parameters p. """ chi2 = 0 dof = 0 fitp = gv.trim_redundant_keys(fitp) for k in fitp: for fpi, pi in zip(fitp[k].flat, p[k].flat): delta_mean = abs(abs(fpi.mean) - abs(pi)) sdev = fpi.sdev self.assertLess(delta_mean, NSIG * sdev) dof += 1 chi2 += delta_mean ** 2 / sdev ** 2 if PRINT_FITS: print("param chi2/dof = %.2g [%d]\n" % (chi2 / dof, dof))
def assert_fitsagree(self, fitp1, fitp2): """ fit outputs fitp1 and fitp2 agree with each other (approximately)""" chi2 = 0 dof = 0 fitp1 = gv.trim_redundant_keys(fitp1) for k in fitp1: p1 = fitp1[k].flat p2 = fitp2[k].flat for p1i, p2i in zip(p1, p2): delta_mean = abs(abs(p1i.mean) - abs(p2i.mean)) sdev = p1i.sdev self.assertLess(delta_mean, NSIG * sdev) delta_sdev = abs(p1i.sdev - p2i.sdev) self.assertLess(delta_sdev, NSIG * sdev)
def test_extension_mapping(self): " BufferDict extension and mapping properties " p = BufferDict() p['a'] = 1. p['b'] = [2., 3.] p['log(c)'] = 0. p['sqrt(d)'] = [5., 6.] p['erfinv(e)'] = [[33.]] newp = BufferDict(p) for i in range(2): for k in p: assert np.all(p[k] == newp[k]) assert newp['c'] == np.exp(newp['log(c)']) assert np.all(newp['d'] == np.square(newp['sqrt(d)'])) assert np.all(newp['e'] == gv.erf(newp['erfinv(e)'])) assert np.all(p.buf == newp.buf) p.buf[:] = [10., 20., 30., 1., 2., 3., 4.] newp.buf = np.array(p.buf.tolist()) self.assertEqual(gv.get_dictkeys(p, ['c', 'a', 'log(c)', 'e', 'd']), ['log(c)', 'a', 'log(c)', 'erfinv(e)', 'sqrt(d)']) self.assertEqual( [gv.dictkey(p, k) for k in ['c', 'a', 'log(c)', 'e', 'd']], ['log(c)', 'a', 'log(c)', 'erfinv(e)', 'sqrt(d)']) self.assertTrue(gv.BufferDict.has_dictkey(p, 'a')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'b')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'c')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'd')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'e')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'log(c)')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'sqrt(d)')) self.assertTrue(gv.BufferDict.has_dictkey(p, 'erfinv(e)')) self.assertTrue(not gv.BufferDict.has_dictkey(p, 'log(a)')) self.assertTrue(not gv.BufferDict.has_dictkey(p, 'sqrt(b)')) self.assertEqual(list(p), ['a', 'b', 'log(c)', 'sqrt(d)', 'erfinv(e)']) np.testing.assert_equal(list(p.values()), [10.0, [20., 30.], 1.0, [2., 3.], [[4.]]]) self.assertEqual(p.get('c'), p['c']) # tracking? self.assertAlmostEqual(p['c'], np.exp(1)) self.assertAlmostEqual(p['log(c)'], 1.) p['log(c)'] = 2. self.assertAlmostEqual(p['c'], np.exp(2)) self.assertAlmostEqual(p['log(c)'], 2.) p['a'] = 12. self.assertAlmostEqual(p['c'], np.exp(2)) self.assertAlmostEqual(p['log(c)'], 2.) self.assertEqual( list(p), ['a', 'b', 'log(c)', 'sqrt(d)', 'erfinv(e)'], ) # the rest is not so important # trim redundant keys oldp = trim_redundant_keys(newp) assert 'c' not in oldp assert 'd' not in oldp assert np.all(oldp.buf == newp.buf) # nonredundant keys assert set(nonredundant_keys(newp.keys())) == set(p.keys()) # stripkey for ks, f, k in [ ('aa', np.exp, 'log(aa)'), ('aa', np.square, 'sqrt(aa)'), ]: assert (ks, f) == gv._bufferdict._stripkey(k) # addparentheses pvar = BufferDict() pvar['a'] = p['a'] pvar['b'] = p['b'] pvar['logc'] = p['log(c)'] pvar['sqrtd'] = p['sqrt(d)'] pvar['erfinv(e)'] = p['erfinv(e)'] pvar = add_parameter_parentheses(pvar) for k in p: assert k in pvar assert np.all(p[k] == pvar[k]) for k in pvar: assert k in p pvar = add_parameter_parentheses(pvar) for k in p: assert k in pvar assert np.all(p[k] == pvar[k]) for k in pvar: assert k in p pvar['log(c(23))'] = 1.2 pvar = BufferDict(pvar) assert 'c(23)' not in pvar assert 'log(c(23))' in pvar self.assertAlmostEqual(gv.exp(pvar['log(c(23))']), pvar['c(23)'])