def test_makecovblock_checks(): a = np.random.randn(10, 10) b = np.copy(a) b[0, 0] = np.inf m = b.T @ b gp = lgp.GP(checksym=False) gp.addcov(a, 0) gp._checksym = True with pytest.raises(RuntimeError): gp.prior(raw=True) gp = lgp.GP(checkfinite=False) gp.addcov(m, 0) gp._checkfinite = True with pytest.raises(RuntimeError): gp.prior(raw=True) gp = lgp.GP(checksym=False, checkpos=False) gp.addcov(a, 0) gp.prior(raw=True) gp = lgp.GP(checkfinite=False, checkpos=False) gp.addcov(m, 0) gp.prior(raw=True)
def test_incompatible_dtypes(): gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(TypeError): gp.addx(np.zeros(1, 'd,d'), 1) gp = lgp.GP(lgp.ExpQuad()) gp.addx(np.zeros(1, 'd,d'), 0) # gp.addx(np.zeros(1, 'i,i'), 1) # succeeds only if numpy >= 1.23 with pytest.raises(TypeError): gp.addx(np.zeros(1, 'd,d,d'), 2)
def test_partial_derivative(): gp = lgp.GP(lgp.ExpQuad()) x = np.arange(20) y = np.zeros(len(x), 'f8,f8') y['f0'] = x gp.addx(y, 0, deriv='f0') cov1 = gp.prior(0, raw=True) gp = lgp.GP(lgp.ExpQuad()) gp.addx(x, 0, deriv=1) cov2 = gp.prior(0, raw=True) util.assert_equal(cov1, cov2)
def test_none_key(): gp = lgp.GP(lgp.ExpQuad()) with pytest.raises(ValueError): gp.addx({None: 0}) gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(ValueError): gp.addtransf({0: 1}, None) gp = lgp.GP(lgp.ExpQuad()) with pytest.raises(ValueError): gp.addcov({None: 1})
def test_key_already_used(): gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(KeyError): gp.addx(0, 0) gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(KeyError): gp.addtransf({0: 1}, 0) gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(KeyError): gp.addcov(1, 0)
def makegp(params): kernel_time = lgp.ExpQuad(scale=params['time_scale'], dim='time') kernel_label = lgp.ExpQuad(scale=label_scale, dim='label') gp = lgp.GP(kernel_time * kernel_label) gp.addx(x, 'data', deriv=(data_deriv, 'time')) gp.addx(np.array([(0, 0)], dtype=x.dtype), 'fixed_point') return gp
def makegp(hp): gp = lgp.GP() kernel = makekernel(hp) gp.addproc(kernel, 'h') gp.addproctransf({'h': 1}, 'primitive', deriv='x' ) gp.addproctransf({'h': 1}, 'f' , deriv=(2, 'x')) gp.addproctransf({ 'primitive': lambda x: x['x'], 'h' : -1, }, 'primitive of xf(x)') # data gp.addx(xdata, 'xdata', proc='f') gp.addtransf({'xdata': M}, 'data', axes=2) # total momentum rule gp.addx(xinteg, 'xmomrule', proc='primitive of xf(x)') gp.addtransf({'xmomrule': suminteg}, 'momrule', axes=2) # quark sum rules for quark in 'ducs': idx = indices[quark] label = f'{quark}{quark}bar' # the one appearing in `constraints` xlabel = f'x{label}' gp.addx(xinteg[idx], xlabel, proc='primitive') gp.addtransf({xlabel: suminteg[idx] * qdiff}, label, axes=2) return gp
def makegp(x): gp = lgp.GP(lgp.ExpQuad(), checkfinite=False, checksym=False, checkpos=False) gp.addx(np.nan, 0) return gp
def makegp(params): kernel = lgp.Cauchy(scale=params['time_scale'], dim='time', beta=2) kernel *= lgp.ExpQuad(scale=params['label_scale'], dim='label') gp = lgp.GP(kernel) x['time'] = jnp.array([time, time - params['delay']]) gp.addx(x, 'A') return gp
def test_addcov_checks(): gp = lgp.GP() a = np.random.randn(10, 10) b = np.copy(a) b[0, 0] = np.inf m = b.T @ b with pytest.raises(ValueError): gp.addcov(a, 0) with pytest.raises(ValueError): gp.addcov(m, 0) gp = lgp.GP(checksym=False) gp.addcov(a, 0) gp = lgp.GP(checkfinite=False) gp.addcov(m, 0)
def test_cov(): A = np.random.randn(20, 20) M1 = A.T @ A gp = lgp.GP() gp.addcov(M1, 'M') M2 = gp.prior('M', raw=True) util.assert_equal(M1, M2)
def test_addcov_wrong_blocks(): gp = lgp.GP(lgp.ExpQuad()) with pytest.raises(ValueError): gp.addcov(np.zeros((1, 1, 1)), 0) with pytest.raises(ValueError): gp.addcov(np.zeros((1, 2, 2, 1)), 0) with pytest.raises(ValueError): gp.addcov(np.random.randn(10, 10), 0) with pytest.raises(KeyError): gp.addcov({ (0, 0): 1, (0, 1): 0, }) with pytest.raises(ValueError): gp.addcov({ (0, 0): np.ones((2, 2)), (1, 1): np.ones((3, 3)), (0, 1): np.ones((3, 2)), }) with pytest.raises(ValueError): gp.addcov({ (0, 0): np.ones((2, 2)), (1, 1): np.ones((3, 3)), (0, 1): np.ones((2, 3)), (1, 0): np.zeros((3, 2)), })
def test_fourier(self): for kw in self.kwargs_list: kernel = self.kernel_class(**kw) try: kernel.fourier(True, True) except NotImplementedError: pytest.skip() if isinstance(kernel, _kernels.Zeta) and kw['nu'] == 0: continue x = np.linspace(0, 1, 100) gp = lgp.GP(kernel, posepsfac=200) gp.addkernelop('fourier', True, 'F') gp.addx(x, 'x') gp.addx(1, 's1', proc='F') gp.addx(2, 'c1', proc='F') ms, cs = gp.predfromdata(dict(s1=1, c1=0), 'x', raw=True) mc, cc = gp.predfromdata(dict(c1=1, s1=0), 'x', raw=True) np.testing.assert_allclose(ms, np.sin(2 * np.pi * x), equal_nan=False) np.testing.assert_allclose(mc, np.cos(2 * np.pi * x), equal_nan=False) eps = np.finfo(cs.dtype).eps np.testing.assert_allclose(np.diag(cs), cs[0, 0], atol=eps, equal_nan=False) np.testing.assert_allclose(np.diag(cc), cc[0, 0], atol=eps, equal_nan=False)
def preparegp(): gp = lgp.GP() gp.addproc(lgp.ExpQuad(), 'a') gp.addproc(lgp.Cauchy(), 'b') gp.addx(x, 'ax', proc='a') gp.addx(x, 'bx', proc='b') return gp
def test_no_checksym(): covs = [] for checksym in [False, True]: gp = lgp.GP(lgp.ExpQuad(), checksym=checksym) gp.addx({'x': np.arange(20)}) covs.append(gp.prior('x', raw=True)) util.assert_equal(*covs)
def test_marginal_likelihood_separate(): gp = lgp.GP(lgp.ExpQuad()) x, y = np.random.randn(2, 20) gp.addx(x, 0) ml1 = gp.marginal_likelihood({0: y}) l, r = gp.marginal_likelihood({0: y}, separate=True) ml2 = -1 / 2 * (l + r @ r) np.testing.assert_allclose(ml2, ml1, rtol=1e-15)
def test_transf_vector(): gp = lgp.GP(lgp.ExpQuad()) gp.addx([0, 1], 'x') gp.addtransf({'x': [-1, 1]}, 'y') prior = gp.prior() y1 = prior['y'] y2 = prior['x'][1] - prior['x'][0] util.assert_same_gvars(y1, y2, atol=1e-12)
def test_zero_covblock(): gp = lgp.GP() a = np.random.randn(10, 10) m = a.T @ a gp.addcov(m, 0) gp.addcov(m, 1) prior = gp.prior(raw=True) util.assert_equal(prior[0, 1], np.zeros_like(m))
def test_addcov_no_checksym(): gp = lgp.GP(lgp.ExpQuad(), checksym=False) gp.addcov({ (0, 0): np.ones((2, 2)), (1, 1): np.ones((3, 3)), (0, 1): np.ones((2, 3)), (1, 0): np.zeros((3, 2)), })
def test_prior_raw_shape(): gp = lgp.GP(lgp.ExpQuad()) gp.addx(np.arange(20).reshape(2, 10), 'x') cov = gp.prior(raw=True) assert cov['x', 'x'].shape == (2, 10, 2, 10) cov = gp.prior('x', raw=True) assert cov.shape == (2, 10, 2, 10)
def test_priorpoints_cache(): gp = lgp.GP(lgp.ExpQuad()) x = np.arange(20) gp.addx(x, 0) gp.addx(x, 1) prior = gp.prior() cov = gvar.evalcov(prior) util.assert_equal(cov[0, 0], cov[1, 1]) util.assert_equal(cov[0, 0], cov[0, 1])
def test_addprocderiv(): gp = lgp.GP(lgp.ExpQuad()) gp.addprocderiv(1, 'a') x = np.arange(20) gp.addx(x, 0, proc='a') gp.addx(x, 1, deriv=1) prior = gp.prior(raw=True) util.assert_equal(prior[0, 0], prior[1, 1]) util.assert_equal(prior[0, 0], prior[0, 1])
def test_pred_all(): gp = lgp.GP(lgp.ExpQuad()) x, y, z = np.random.randn(3, 20) gp.addx(x, 0) gp.addx(y, 1) m1, c1 = gp.predfromdata({0: z}, raw=True) m2, c2 = gp.predfromdata({0: z}, [0, 1], raw=True) util.assert_equal(m1, m2) util.assert_equal(c1, c2)
def test_addcov_missing_block(): gp = lgp.GP(lgp.ExpQuad()) gp.addcov({ (0, 0): np.ones((2, 2)), (1, 1): np.ones((3, 3)), (0, 1): np.ones((2, 3)), }) prior = gp.prior(raw=True) util.assert_equal(prior[0, 1], prior[1, 0].T)
def test_default_kernel(): gp = lgp.GP(lgp.ExpQuad()) gp.addproc(key='a') x = np.arange(20) gp.addx(x, 'x1') gp.addx(x, 'x2', proc='a') prior = gp.prior(raw=True) util.assert_equal(prior['x1', 'x1'], prior['x2', 'x2']) util.assert_equal(prior['x1', 'x2'], np.zeros(2 * x.shape))
def test_marginal_likelihood_gvar(): gp = lgp.GP(lgp.ExpQuad()) x, y = np.random.randn(2, 20) gp.addx(x, 0) a = np.random.randn(20, 20) m = a.T @ a ml1 = gp.marginal_likelihood({0: gvar.gvar(y, m)}) ml2 = gp.marginal_likelihood({0: y}, {(0, 0): m}) np.testing.assert_allclose(ml2, ml1, rtol=1e-15)
def test_nonsense_tensors(): gp = lgp.GP(lgp.ExpQuad()) gp.addx(0, 0) with pytest.raises(TypeError): gp.addtransf({0: 'a'}, 1) with pytest.raises(ValueError): gp.addtransf({0: np.inf}, 1) gp.addx([0, 1], 1) with pytest.raises(ValueError): gp.addtransf({1: [1, 2, 3]}, 2)
def test_empty_proc(): gp = lgp.GP() gp.addproctransf({}, 'a') gp.addproclintransf(lambda: lambda x: 0, [], 'b') x = np.arange(20) gp.addx(x, 'ax', proc='a') gp.addx(x, 'bx', proc='b') cov = gp.prior(raw=True) util.assert_equal(cov['ax', 'ax'], np.zeros(2 * x.shape)) util.assert_equal(cov['bx', 'bx'], np.zeros(2 * x.shape))
def test_priortransf(): gp = lgp.GP(lgp.ExpQuad()) x, y = np.arange(40).reshape(2, -1) gp.addx(x, 0) gp.addx(y, 1) gp.addtransf({0: x, 1: y}, 2) cov1 = gp.prior(2, raw=True) u = gp.prior(2) cov2 = gvar.evalcov(u) np.testing.assert_allclose(cov1, cov2, rtol=1e-15)
def test_zero_givencov(): gp = lgp.GP(lgp.ExpQuad()) x, y, z = np.random.randn(3, 20) gp.addx(x, 0) gp.addx(y, 1) cov = np.zeros(2 * x.shape) m1, c1 = gp.predfromdata({0: z}, 1, {(0, 0): cov}, raw=True) m2, c2 = gp.predfromdata({0: z}, 1, raw=True) util.assert_equal(m1, m2) util.assert_equal(c1, c2)