From 7984e17805731afbfe1882fcb167a596b7bcd674 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Tue, 5 Apr 2016 10:18:49 +0100 Subject: [PATCH 01/19] [statespace] changed tests to check model integrity with GP model --- GPy/testing/gpy_kernels_state_space_tests.py | 312 ++++++++++--------- 1 file changed, 160 insertions(+), 152 deletions(-) diff --git a/GPy/testing/gpy_kernels_state_space_tests.py b/GPy/testing/gpy_kernels_state_space_tests.py index 1d03233a..785ae92f 100644 --- a/GPy/testing/gpy_kernels_state_space_tests.py +++ b/GPy/testing/gpy_kernels_state_space_tests.py @@ -17,326 +17,334 @@ from .state_space_main_tests import generate_x_points, generate_sine_data, \ class StateSpaceKernelsTests(np.testing.TestCase): def setUp(self): pass - + def run_for_model(self, X, Y, ss_kernel, kalman_filter_type = 'regular', - use_cython=False, check_gradients=True, - optimize=True, optimize_max_iters=1000,predict_X=None, - compare_with_GP=True, gp_kernel=None, + use_cython=False, check_gradients=True, + optimize=True, optimize_max_iters=250, predict_X=None, + compare_with_GP=True, gp_kernel=None, mean_compare_decimal=10, var_compare_decimal=7): - - m1 = SS_model.StateSpace(X,Y, ss_kernel, + + m1 = SS_model.StateSpace(X,Y, ss_kernel, kalman_filter_type=kalman_filter_type, use_cython=use_cython) - + if check_gradients: self.assertTrue(m1.checkgrad()) - - if optimize: - m1.optimize(optimizer='lbfgsb',max_iters=optimize_max_iters) - + + if 1:#optimize: + m1.optimize(optimizer='lbfgsb',max_iters=2) + if compare_with_GP and (predict_X is None): predict_X = X - - if (predict_X is not None): - x_pred_reg_1 = m1.predict(predict_X) - x_quant_reg_1 = m1.predict_quantiles(predict_X) - + + self.assertTrue(compare_with_GP) if compare_with_GP: + np.random.seed(254856) m2 = GPy.models.GPRegression(X,Y, gp_kernel) - m2.optimize(optimizer='lbfgsb', max_iters=optimize_max_iters) - #print(m2) - + #m2.randomize() + m2.optimize(max_iters=optimize_max_iters) + + m1[:] = m2[:] + + if (predict_X is not None): + x_pred_reg_1 = m1.predict(predict_X) + x_quant_reg_1 = m1.predict_quantiles(predict_X) + x_pred_reg_2 = m2.predict(predict_X) x_quant_reg_2 = m2.predict_quantiles(predict_X) - - # Test values - #print np.max(np.abs(x_pred_reg_1[0]-x_pred_reg_2[0])) - np.testing.assert_almost_equal(np.max(np.abs(x_pred_reg_1[0]- \ - x_pred_reg_2[0])), 0, decimal=mean_compare_decimal) - - # Test variances - #print np.max(np.abs(x_pred_reg_1[1]-x_pred_reg_2[1])) - - np.testing.assert_almost_equal(np.max(np.abs(x_pred_reg_1[1]- \ - x_pred_reg_2[1])), 0, decimal=var_compare_decimal) - + + np.testing.assert_array_almost_equal(x_pred_reg_1[0], x_pred_reg_2[0], 3) + np.testing.assert_array_almost_equal(x_pred_reg_1[1], x_pred_reg_2[1], 3) + np.testing.assert_array_almost_equal(x_quant_reg_1[0], x_quant_reg_2[0], 3) + np.testing.assert_array_almost_equal(x_quant_reg_1[1], x_quant_reg_2[1], 3) + np.testing.assert_almost_equal(m1.log_likelihood(), m2.log_likelihood(), 3) + np.testing.assert_array_almost_equal(m1.gradient, m2.gradient, 2) + + def test_Matern32_kernel(self,): np.random.seed(234) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_Matern32(1,active_dims=[0,]) gp_kernel = GPy.kern.Matern32(1,active_dims=[0,]) - + self.run_for_model(X, Y, ss_kernel, check_gradients=True, predict_X=X, compare_with_GP=True, - gp_kernel=gp_kernel, - mean_compare_decimal=10, var_compare_decimal=7) - + gp_kernel=gp_kernel, + mean_compare_decimal=5, var_compare_decimal=5) + def test_Matern52_kernel(self,): np.random.seed(234) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_Matern52(1,active_dims=[0,]) gp_kernel = GPy.kern.Matern52(1,active_dims=[0,]) - - self.run_for_model(X, Y, ss_kernel, check_gradients=True, - optimize = True, predict_X=X, - compare_with_GP=True, gp_kernel=gp_kernel, - mean_compare_decimal=8, var_compare_decimal=7) - + + self.run_for_model(X, Y, ss_kernel, check_gradients=True, + optimize = True, predict_X=X, + compare_with_GP=True, gp_kernel=gp_kernel, + mean_compare_decimal=5, var_compare_decimal=5) + def test_RBF_kernel(self,): np.random.seed(234) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - - ss_kernel = GPy.kern.sde_RBF(1,active_dims=[0,]) - gp_kernel = GPy.kern.RBF(1,active_dims=[0,]) - + + ss_kernel = GPy.kern.sde_RBF(1, Y.var(), X.ptp()/2., active_dims=[0,]) + gp_kernel = GPy.kern.RBF(1, Y.var(), X.ptp()/2., active_dims=[0,]) + self.run_for_model(X, Y, ss_kernel, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=1, var_compare_decimal=1) - + predict_X=X, + gp_kernel=gp_kernel, + optimize_max_iters=1000, + mean_compare_decimal=2, var_compare_decimal=2) + def test_periodic_kernel(self,): np.random.seed(322) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_StdPeriodic(1,active_dims=[0,]) ss_kernel.lengthscale.constrain_bounded(0.27, 1000) ss_kernel.period.constrain_bounded(0.17, 100) - + gp_kernel = GPy.kern.StdPeriodic(1,active_dims=[0,]) gp_kernel.lengthscale.constrain_bounded(0.27, 1000) - gp_kernel.period.constrain_bounded(0.17, 100) - + gp_kernel.period.constrain_bounded(0.17, 100) + self.run_for_model(X, Y, ss_kernel, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=3, var_compare_decimal=3) - + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=3, var_compare_decimal=3) + def test_quasi_periodic_kernel(self,): np.random.seed(329) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_Matern32(1)*GPy.kern.sde_StdPeriodic(1,active_dims=[0,]) ss_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) ss_kernel.std_periodic.period.constrain_bounded(0.15, 100) - + gp_kernel = GPy.kern.Matern32(1)*GPy.kern.StdPeriodic(1,active_dims=[0,]) gp_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) - gp_kernel.std_periodic.period.constrain_bounded(0.15, 100) - + gp_kernel.std_periodic.period.constrain_bounded(0.15, 100) + self.run_for_model(X, Y, ss_kernel, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=1, var_compare_decimal=2) + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=1, var_compare_decimal=2) def test_linear_kernel(self,): - + np.random.seed(234) # seed the random number generator (X,Y) = generate_linear_data(x_points=None, tangent=2.0, add_term=20.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) - + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_Linear(1,X,active_dims=[0,]) + GPy.kern.sde_Bias(1, active_dims=[0,]) gp_kernel = GPy.kern.Linear(1, active_dims=[0,]) + GPy.kern.Bias(1, active_dims=[0,]) - - self.run_for_model(X, Y, ss_kernel, check_gradients= False, - predict_X=X, - gp_kernel=gp_kernel, + + self.run_for_model(X, Y, ss_kernel, check_gradients= False, + predict_X=X, + gp_kernel=gp_kernel, mean_compare_decimal=5, var_compare_decimal=5) def test_brownian_kernel(self,): np.random.seed(234) # seed the random number generator (X,Y) = generate_brownian_data(x_points=None, kernel_var=2.0, noise_var = 0.1, plot = False, points_num=50, x_interval = (0, 20), random=True) - + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + ss_kernel = GPy.kern.sde_Brownian() gp_kernel = GPy.kern.Brownian() - - self.run_for_model(X, Y, ss_kernel, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=10, var_compare_decimal=7) - + + self.run_for_model(X, Y, ss_kernel, check_gradients=True, + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=5, var_compare_decimal=5) + def test_exponential_kernel(self,): - np.random.seed(234) # seed the random number generator + np.random.seed(12345) # seed the random number generator (X,Y) = generate_linear_data(x_points=None, tangent=1.0, add_term=20.0, noise_var=2.0, - plot = False, points_num=50, x_interval = (0, 20), random=True) - + plot = False, points_num=10, x_interval = (0, 20), random=True) + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - - ss_kernel = GPy.kern.sde_Exponential(1, active_dims=[0,]) - gp_kernel = GPy.kern.Exponential(1, active_dims=[0,]) - - self.run_for_model(X, Y, ss_kernel, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=5, var_compare_decimal=6) + + ss_kernel = GPy.kern.sde_Exponential(1, Y.var(), X.ptp()/2., active_dims=[0,]) + gp_kernel = GPy.kern.Exponential(1, Y.var(), X.ptp()/2., active_dims=[0,]) + + Y -= Y.mean() + + self.run_for_model(X, Y, ss_kernel, check_gradients=True, + predict_X=X, + gp_kernel=gp_kernel, + optimize_max_iters=1000, + mean_compare_decimal=2, var_compare_decimal=2) def test_kernel_addition(self,): #np.random.seed(329) # seed the random number generator np.random.seed(333) (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=5.0, noise_var=2.0, plot = False, points_num=100, x_interval = (0, 40), random=True) - + (X1,Y1) = generate_linear_data(x_points=X, tangent=1.0, add_term=20.0, noise_var=0.0, plot = False, points_num=100, x_interval = (0, 40), random=True) - + # Sine data <- Y = Y + Y1 - + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + def get_new_kernels(): ss_kernel = GPy.kern.sde_Linear(1,X) + GPy.kern.sde_StdPeriodic(1,active_dims=[0,]) ss_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) ss_kernel.std_periodic.period.constrain_bounded(3, 8) - + gp_kernel = GPy.kern.Linear(1) + GPy.kern.StdPeriodic(1,active_dims=[0,]) gp_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) gp_kernel.std_periodic.period.constrain_bounded(3, 8) - + return ss_kernel, gp_kernel - + # Cython is available only with svd. ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'svd', use_cython=True, optimize_max_iters=10, check_gradients=False, - predict_X=X, - gp_kernel=gp_kernel, + predict_X=X, + gp_kernel=gp_kernel, mean_compare_decimal=5, var_compare_decimal=5) - + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'regular', use_cython=False, optimize_max_iters=10, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, + predict_X=X, + gp_kernel=gp_kernel, mean_compare_decimal=5, var_compare_decimal=5) - + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'svd', use_cython=False, optimize_max_iters=10, check_gradients=False, - predict_X=X, - gp_kernel=gp_kernel, + predict_X=X, + gp_kernel=gp_kernel, mean_compare_decimal=5, var_compare_decimal=5) - - + + def test_kernel_multiplication(self,): np.random.seed(329) # seed the random number generator (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=10.0, noise_var=2.0, plot = False, points_num=50, x_interval = (0, 20), random=True) - + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - + def get_new_kernels(): ss_kernel = GPy.kern.sde_Matern32(1)*GPy.kern.sde_Matern52(1) gp_kernel = GPy.kern.Matern32(1)*GPy.kern.sde_Matern52(1) - + return ss_kernel, gp_kernel - + ss_kernel, gp_kernel = get_new_kernels() + + #import ipdb;ipdb.set_trace() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'svd', use_cython=True, optimize_max_iters=10, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=-1, var_compare_decimal=-1) - + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'regular', use_cython=False, optimize_max_iters=10, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=-1, var_compare_decimal=-1) - + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X, Y, ss_kernel, kalman_filter_type = 'svd', use_cython=False, optimize_max_iters=10, check_gradients=True, - predict_X=X, - gp_kernel=gp_kernel, - mean_compare_decimal=-1, var_compare_decimal=0) + predict_X=X, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) def test_forecast(self,): """ Test time-series forecasting. """ - + # Generate data -> np.random.seed(339) # seed the random number generator #import pdb; pdb.set_trace() (X,Y) = generate_sine_data(x_points=None, sin_period=5.0, sin_ampl=5.0, noise_var=2.0, plot = False, points_num=100, x_interval = (0, 40), random=True) - + (X1,Y1) = generate_linear_data(x_points=X, tangent=1.0, add_term=20.0, noise_var=0.0, plot = False, points_num=100, x_interval = (0, 40), random=True) - + Y = Y + Y1 X_train = X[X <= 20] - Y_train = Y[X <= 20] + Y_train = Y[X <= 20] X_test = X[X > 20] Y_test = Y[X > 20] - - X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - X_train.shape = (X_train.shape[0],1); Y_train.shape = (Y_train.shape[0],1) - X_test.shape = (X_test.shape[0],1); Y_test.shape = (Y_test.shape[0],1) + + X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) + X_train.shape = (X_train.shape[0],1); Y_train.shape = (Y_train.shape[0],1) + X_test.shape = (X_test.shape[0],1); Y_test.shape = (Y_test.shape[0],1) # Generate data <- - + #import pdb; pdb.set_trace() - + def get_new_kernels(): periodic_kernel = GPy.kern.StdPeriodic(1,active_dims=[0,]) gp_kernel = GPy.kern.Linear(1, active_dims=[0,]) + GPy.kern.Bias(1, active_dims=[0,]) + periodic_kernel gp_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) gp_kernel.std_periodic.period.constrain_bounded(0.15, 100) - + periodic_kernel = GPy.kern.sde_StdPeriodic(1,active_dims=[0,]) ss_kernel = GPy.kern.sde_Linear(1,X,active_dims=[0,]) + \ GPy.kern.sde_Bias(1, active_dims=[0,]) + periodic_kernel - + ss_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) ss_kernel.std_periodic.period.constrain_bounded(0.15, 100) - + return ss_kernel, gp_kernel - + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X_train, Y_train, ss_kernel, kalman_filter_type = 'regular', use_cython=False, optimize_max_iters=30, check_gradients=True, - predict_X=X_test, - gp_kernel=gp_kernel, - mean_compare_decimal=0, var_compare_decimal=-1) - + predict_X=X_test, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) + + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X_train, Y_train, ss_kernel, kalman_filter_type = 'svd', use_cython=False, optimize_max_iters=30, check_gradients=False, - predict_X=X_test, - gp_kernel=gp_kernel, - mean_compare_decimal=-1, var_compare_decimal=-1) - + predict_X=X_test, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) + ss_kernel, gp_kernel = get_new_kernels() self.run_for_model(X_train, Y_train, ss_kernel, kalman_filter_type = 'svd', use_cython=True, optimize_max_iters=30, check_gradients=False, - predict_X=X_test, - gp_kernel=gp_kernel, - mean_compare_decimal=-1, var_compare_decimal=-1) - + predict_X=X_test, + gp_kernel=gp_kernel, + mean_compare_decimal=2, var_compare_decimal=2) + if __name__ == "__main__": print("Running state-space inference tests...") unittest.main() - + #tt = StateSpaceKernelsTests('test_periodic_kernel') #import pdb; pdb.set_trace() #tt.test_Matern32_kernel() @@ -350,4 +358,4 @@ if __name__ == "__main__": #tt.test_kernel_addition() #tt.test_kernel_multiplication() #tt.test_forecast() - + From c374311e8411274565171dc3ce704526a939365e Mon Sep 17 00:00:00 2001 From: Alexander Grigorievskiy Date: Wed, 6 Apr 2016 17:35:08 +0300 Subject: [PATCH 02/19] FIX: Fixing bugs and innacuracies in state-space inference. --- GPy/kern/src/sde_stationary.py | 4 ++-- GPy/models/state_space_main.py | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/GPy/kern/src/sde_stationary.py b/GPy/kern/src/sde_stationary.py index 3ac5f402..8e7ad6f5 100644 --- a/GPy/kern/src/sde_stationary.py +++ b/GPy/kern/src/sde_stationary.py @@ -129,14 +129,14 @@ class sde_Exponential(Exponential): """ self.variance.gradient = gradients[0] - self.lengthscale.gradient = gradients[1] + self.lengthscale.gradient = gradients[1] * 2.0 def sde(self): """ Return the state space representation of the covariance. """ variance = float(self.variance.values) - lengthscale = float(self.lengthscale) + lengthscale = float(self.lengthscale*2.0) F = np.array(((-1.0/lengthscale,),)) L = np.array(((1.0,),)) diff --git a/GPy/models/state_space_main.py b/GPy/models/state_space_main.py index d65364e5..891c0326 100644 --- a/GPy/models/state_space_main.py +++ b/GPy/models/state_space_main.py @@ -3237,6 +3237,7 @@ class ContDescrStateSpace(DescreteStateSpace): AB = np.dot(AB, np.vstack((np.zeros((n,n)),np.eye(n)))) Q_noise_1 = linalg.solve(AB[n:,:].T,AB[:n,:].T) + Q_noise_2 = P_inf - A.dot(P_inf).dot(A.T) # The covariance matrix Q by matrix fraction decomposition <- if compute_derivatives: @@ -3276,8 +3277,9 @@ class ContDescrStateSpace(DescreteStateSpace): else: dA = None dQ = None - Q_noise = Q_noise_1 - + Q_noise = Q_noise_2 + # Innacuracies have been observed when Q_noise_1 was used. + #Q_noise = Q_noise_1 # Return @@ -3484,4 +3486,4 @@ def balance_ss_model(F,L,Qc,H,Pinf,P0,dF=None,dQc=None,dPinf=None,dP0=None): # (F,L,Qc,H,Pinf,P0,dF,dQc,dPinf,dP0) - return bF, bL, bQc, bH, bPinf, bP0, bdF, bdQc, bdPinf, bdP0, T \ No newline at end of file + return bF, bL, bQc, bH, bPinf, bP0, bdF, bdQc, bdPinf, bdP0, T From bfd0ee0db244ed98d205aa8438324f7f03ccb425 Mon Sep 17 00:00:00 2001 From: mzwiessele Date: Thu, 7 Apr 2016 07:42:12 +0100 Subject: [PATCH 03/19] [exponential] fixed exponential *2 error --- GPy/kern/src/sde_stationary.py | 4 ++-- GPy/kern/src/stationary.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GPy/kern/src/sde_stationary.py b/GPy/kern/src/sde_stationary.py index 8e7ad6f5..3ac5f402 100644 --- a/GPy/kern/src/sde_stationary.py +++ b/GPy/kern/src/sde_stationary.py @@ -129,14 +129,14 @@ class sde_Exponential(Exponential): """ self.variance.gradient = gradients[0] - self.lengthscale.gradient = gradients[1] * 2.0 + self.lengthscale.gradient = gradients[1] def sde(self): """ Return the state space representation of the covariance. """ variance = float(self.variance.values) - lengthscale = float(self.lengthscale*2.0) + lengthscale = float(self.lengthscale) F = np.array(((-1.0/lengthscale,),)) L = np.array(((1.0,),)) diff --git a/GPy/kern/src/stationary.py b/GPy/kern/src/stationary.py index 30116519..5e137abb 100644 --- a/GPy/kern/src/stationary.py +++ b/GPy/kern/src/stationary.py @@ -315,10 +315,10 @@ class Exponential(Stationary): super(Exponential, self).__init__(input_dim, variance, lengthscale, ARD, active_dims, name) def K_of_r(self, r): - return self.variance * np.exp(-0.5 * r) + return self.variance * np.exp(-r) def dK_dr(self, r): - return -0.5*self.K_of_r(r) + return -self.K_of_r(r) # def sde(self): # """ From 754106e471c53eed35f92bc54e290982e3de7f49 Mon Sep 17 00:00:00 2001 From: mzwiessele Date: Thu, 7 Apr 2016 08:45:10 +0100 Subject: [PATCH 04/19] [statespace] tests mote thorough and numerically stable --- GPy/testing/gpy_kernels_state_space_tests.py | 25 ++++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/GPy/testing/gpy_kernels_state_space_tests.py b/GPy/testing/gpy_kernels_state_space_tests.py index 785ae92f..034b58bb 100644 --- a/GPy/testing/gpy_kernels_state_space_tests.py +++ b/GPy/testing/gpy_kernels_state_space_tests.py @@ -28,23 +28,22 @@ class StateSpaceKernelsTests(np.testing.TestCase): kalman_filter_type=kalman_filter_type, use_cython=use_cython) + m1.likelihood[:] = Y.var()/10. + if check_gradients: self.assertTrue(m1.checkgrad()) if 1:#optimize: - m1.optimize(optimizer='lbfgsb',max_iters=2) + m1.optimize(optimizer='lbfgsb', max_iters=1) if compare_with_GP and (predict_X is None): predict_X = X self.assertTrue(compare_with_GP) if compare_with_GP: - np.random.seed(254856) m2 = GPy.models.GPRegression(X,Y, gp_kernel) - #m2.randomize() - m2.optimize(max_iters=optimize_max_iters) - m1[:] = m2[:] + m2[:] = m1[:] if (predict_X is not None): x_pred_reg_1 = m1.predict(predict_X) @@ -53,12 +52,12 @@ class StateSpaceKernelsTests(np.testing.TestCase): x_pred_reg_2 = m2.predict(predict_X) x_quant_reg_2 = m2.predict_quantiles(predict_X) - np.testing.assert_array_almost_equal(x_pred_reg_1[0], x_pred_reg_2[0], 3) - np.testing.assert_array_almost_equal(x_pred_reg_1[1], x_pred_reg_2[1], 3) - np.testing.assert_array_almost_equal(x_quant_reg_1[0], x_quant_reg_2[0], 3) - np.testing.assert_array_almost_equal(x_quant_reg_1[1], x_quant_reg_2[1], 3) - np.testing.assert_almost_equal(m1.log_likelihood(), m2.log_likelihood(), 3) - np.testing.assert_array_almost_equal(m1.gradient, m2.gradient, 2) + np.testing.assert_array_almost_equal(x_pred_reg_1[0], x_pred_reg_2[0], mean_compare_decimal) + np.testing.assert_array_almost_equal(x_pred_reg_1[1], x_pred_reg_2[1], var_compare_decimal) + np.testing.assert_array_almost_equal(x_quant_reg_1[0], x_quant_reg_2[0], mean_compare_decimal) + np.testing.assert_array_almost_equal(x_quant_reg_1[1], x_quant_reg_2[1], mean_compare_decimal) + np.testing.assert_array_almost_equal(m1.gradient, m2.gradient, var_compare_decimal) + np.testing.assert_almost_equal(m1.log_likelihood(), m2.log_likelihood(), var_compare_decimal) def test_Matern32_kernel(self,): @@ -103,7 +102,7 @@ class StateSpaceKernelsTests(np.testing.TestCase): predict_X=X, gp_kernel=gp_kernel, optimize_max_iters=1000, - mean_compare_decimal=2, var_compare_decimal=2) + mean_compare_decimal=2, var_compare_decimal=1) def test_periodic_kernel(self,): np.random.seed(322) # seed the random number generator @@ -172,7 +171,7 @@ class StateSpaceKernelsTests(np.testing.TestCase): self.run_for_model(X, Y, ss_kernel, check_gradients=True, predict_X=X, gp_kernel=gp_kernel, - mean_compare_decimal=5, var_compare_decimal=5) + mean_compare_decimal=4, var_compare_decimal=4) def test_exponential_kernel(self,): np.random.seed(12345) # seed the random number generator From 7aff0eb3f8938201036aa52069596bd44fff2da4 Mon Sep 17 00:00:00 2001 From: mzwiessele Date: Thu, 7 Apr 2016 10:48:54 +0100 Subject: [PATCH 05/19] [statespace] tests even more reliable --- GPy/testing/baseline/coverage_3d_plot.png | Bin 52224 -> 0 bytes GPy/testing/gpy_kernels_state_space_tests.py | 21 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) delete mode 100644 GPy/testing/baseline/coverage_3d_plot.png diff --git a/GPy/testing/baseline/coverage_3d_plot.png b/GPy/testing/baseline/coverage_3d_plot.png deleted file mode 100644 index 62638b03ef24bd6d7455fab281ffe5894b2f9789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52224 zcmb@tg;!MV_da|Wx}>B*hHmK)X@)LALXegYB}Al$1`!xi8l!G__;5~kR z>-!(Pv(_x&aORx3_r2rV*R@aB8#Q@cED9_D0B{u*V447cgaF?h7--;;!`jUb@CS;E zw4xRU`0~Oq4+a0mbX3rD0RTMHe{ZCGiC;DV00k6bQd(bA54_z{4YZdY&zoIqe#LOm zqDbT7(=h}RDk(_stg7S7+CZdWUpHl=v$FhAH??7ivlf10DT3!xB7Oi8t6!ib1SLjN zy22)9_~;;RVdVO{_m$iB$iac-;1G#(#^|=!(NO*2P+HP?>L+GPx$k5=W?i9UhSm>a z@c;eFBTPV~@V}!w1ZI#h0($TiF=-X(ztae^p%|M!appujGO=m=q-zY2|z{~D=pO#Kl4+kuV=!Rv=X6xLR_ zw6L-s#&aSCvnuL;EPnRPbP8*f2zKG+E>B7?=h=m#DPH`o>BY>a>`Nv1tN2E-_rTFyYhsgxkY^X=KZFr{C<7_D7NI-HbRrVYi$SoeciziWu!~r=^ijXPTYmg#8CX&1&KJ7EmHA5T?N$I<^>(o+ zJ@(D|q6T%W6*8u_5khnDqVJV|Xz6Z;7<=dr8=bxatOORvkfj^8Q)Ec)@}2BAil&hP z_UiM#_|16Ojj<)ey}OE7cL}hJd_o6D13HnY&{s!cRj>J;gq;su05xQ8qP8=IC!D_i zBYe7w#5wH;dEn2KJMAOJY7wxkUB(C0pgXd_vyp~y@ffl`6`oc@ZeGK2fjs0oNE;@M zKO*Tp-ORHom@g_faT^gJ3jBi91%!$Mu|O*3>WZxaGg4h}sOFHD%tbr?SUqqAAW%iQTlyZl z2Q+1hZ!Z8x{swPe;I8`6&4(w|DoOLyIB~ly4$J~AG$uNSArE5d>Auen401-{sRq=* z<=6)#48S-1;;{5C9fA)C^HvgnB~ zL{p|Q@UiYQQN94wCw&FATzZ1x9*P+~166h0e zxz7jayu~*d93+(}$395-rAo>S`5TBCBft77JN1SS$N`#2j3An}E*dC9i_hIXnE;}; z;i118?LQ>|1d1aQK~m5UBu7-fTE#%y#dF&J|MV@5Natp7R(TX$Hxm0?UutGNjqjZ9 zrIJD!V~E1?3umo%@$kpE0b}%Xc#<#CQm-ak6GW5ZR$l^#s|PAw+`-0|cpB}zE{5l9 z)p=JvdC-^|Y6}eugkmy(n}F(e7za$A62UnL#86f}hnl3Qb$`|1QsYP*&}i1tvw6c- ziyT~-@3Y2-9IGFU(67-M+I8G2TFVF`Z-J?Aen>cE1*|=7u;PwAWbXC1Ky5*7Jn(|C zBh-gV)9us{kU>fv9O6s7)wF!%;WNfwC4cTFfs1KM0_OtAf>YP--TR17qWj3F&oKg% zs4ZI(lCA^ezP3D5G_sPU7?24hdf0i^V`S`TP(WZ*n~-$*EV+G%>&Nb+n3V7q@+Fdcc#P*4qeqzd=@l2xyi!7FV8@(G;RE=TDmtO%C=E zV~`Uw;Dfe1c4=jKC2|jMZsW8S6(St_DBELCIQG-9Nhf>$Xm*%~A40Y;6_Dgk4{rq$ zrC|~bSzpcpf(YiUw1!uaWD8_wlnONd5TLt|sq$OMn)nRa%RH zci1*J;uLKGh*OGgZql}HKu(&X1N&MvBu-_E{gqENg+k_{ly@8|+6Ocoy3rl(n ze*X-@v0Mbv?E>rqn$vhl06Yth^DjLZ`*j3Kyp|Ih3GkF z1=Qp}p5lWA?xL3Fv}P6%rzfN&1VkHKd#f&a)}eigQF02@cglcTU}`=xAi?IWM!m7O zi0-Hqy^m_U@>$E!G6LsyKNP`4})C&48_iDk1QjPnb zf@?S8`X5NU!J;(0p*+ZnWTTKel<2Q1b=@WJ=(k3kYr9!ULr;`9bb5w?XXZU255hVB z5XBA&=%vi~QphLjeb32(6LNTV;;GbA1lvE1(GZy^c}D=t_tT;|C~6Qy5)Q7nhA#+) znDg4)wY1s^rc6OE&r|mI_hrHQ4Ss--$M1qKl$%h~t+jPe2_hU#&ULkte@EJHt{L*3 zTVlj@si1U!4US)z`C}p_RVmFANavYoeJF}vU<*FgJ2`WQDVAuF_Wp*C3 zI8q)z9DMwr5Z;cvuT#W;a0WQU-D54b^&QNbP9O(g)um}!2_er`Ronf>~t~2ym1OA`A1*Tl3&3GnH$ra4> zkQF&_qt69rW@dVQ13@c?B}$@^#koy$0xiV5j|A`xJ~w?X&o{J5D$~fqSiF(u7;u5~ zZAOEcwC_$Cdu)95|9JitDy?{75&|dygb= zMc56m%lqMPQUT_?dg!kdM}t*<{N};%*N$ALq76($$?WDImggAMSAiWgl){ImNMJAN z--wKymqdBIo`({?}~uYBVu)~0#$m*;&lXt`1y+izaygNb8gI?sr-3qT3EL^6)$3}JF=9u_ii4bn3keBMW=be!NJ6RwI%kUx$$Hfq+KYy7;WE$ z!nn!XR-obBcTc*%k2$7Me)#gfPif*c11B{okPB|o@Ui33c$pjd00x}cOiUWZK6fh1lh zE8XOG72$_JV9O!}v9xFCuH)y3@wOJVvM{p#29S55n2|uczfraJG(f3?IPE4^-WU3i@ z-R*3`+i@l9_co}1Cja~?ry3s?X2^M`AI6gjS{w@D^8$VlnIf6*ohbD^X92goXy|Kc zS#OR%a2?DL`9N#fDRCTb6r-T zDq_5cMd54_xxxs%+v%8*z8=!O|x znDcTAO7%)->d*#0?qD~D(nT8n%<4s&9cmglZ_-HLPU{~6_t@KBZ(1hUw0Qrott^3u zfh;4!xuD!5{EzlmB8K)uq}6MLU|fC8y^l zdb!l$f7BmN{+S%hvPnJ=8H$ZbjrYpw0jtdvCLBdhIpBJ1&Rb8<;8Z0W<(aO#-f+Y^ z)I>y3QsZ!MG{Ntgt-~Hd&|F49VtvOj{)?8mBrxX;6%ep(#nWr&rogGE(mcb=jgJPt zNcWB_T`Yp@)DQ&SDzyDOCrlW#O#m^q2k2d08q#?MkgLa?`ShDR^TV?%<_@lLI;{n9 zK13hi+swE|5lbIP!6-p9xA6~Kz?zAkhbjPnCS9{oc<~t#EH#4SNChMF7TH?g>4HZrCXQTTf1t2(eQmxqV>lxwjq#fc&NRXQWU4pq$>!YjoQ28nGxM{Y z*0H5+MDWFsKKbqh@LjTndDdJ(Mii=OCI)^B0dpLcpH+n7wft~%^qTlBaP4E%T_|U- zkoeLWI$#Rx9*JYubbvhJ+WyeH*(E!s*na)Kozv{-@E68NlGy&MZvfT_ewtbiJ5woq z6V^8>h5}?-?{ec1C^;fUZ>aTxyfn$Ncc+NOQv9`dW4h2a@8Jw^7gmjmL- zL>w0=;b0)kg3H~;7@Cy~BtkO4SQSFBjxYmX(=a4ZPADzyU9;4gV&f5G>%EX!0?Ak` zh^R1_NB}ZeRYgU`84}&uz=hMdZa#tyw9 zcO(~wH)HGQQiQ#wfPRvD(z@_luazeeKxXE0#vhuPZ!@3F8-tE;S&x_(>%e3`pb6dK zqEv;aRuRYwIFAolE9kEE_eGrVBTm_9d5VMLboe)N;=_Qvd=~=+GtBG*nFS?|68nHq z%ncVTOE1a503@)FzDM{z?gAu4Ytoi~IYny%c21)VW|n%-o8AIidkv2X7J6K}4a><& zxlB;2MNU$YSV=TqKOFul$j!TIe6*bHnNvheH-2A`OwjysrnmlIby|m)f;m;ZSiBa> zJD55wC9u(m-1t#eGsrEKOs-FB42C+=4N*?17Y4kQaP5Zr3;qud!{m9?`W>hCp+Uo$ zrQ!1?YyfA1|Il!u#`uqGGpn-=%_cKKFyPguK|_b4b*85o(x$fQC5d>BE-BOjYHA7B z-|+O02r+mUcq*I{t&U>{oie6ye$~!Y=mM~oR6(r2E3l8T+&e3k^V|VEe)h;FJ)(3f z5Jz@+S>X}id;Oh2bQ*q=^e@S+VM!8~qMyERyRVpRX(Z=yR&wl1b#hOW)|WTm2|_p+WQI^rT4U6SQw3WP88<#r&>d3X&v49 z`0aK$X)Os#qEhY%Q`Yprz(B~Lz%mHx1o`j+w2A^T)+tFO)wuVehHubg#LRsGX2^|= zFP=I3EP5L&qW_h$#f@Ne28qNX3CZcVdEJhfPB6q{l(qB~rIh5tqt!WnSB;PUbGT<< z62Tsai{rE{ULwPAsh@66x|49|aw9!a1nFasMbs+eOls6LBxScf3EzYN~(v2bonRdf8ad9v$0H z1#%(_NOVr;B9`F@u9CoopSHg5x{Cf-uY60b;w5SOL3=2m+Na2#0yRvUksDbdQ)c%L zc^7o~N|rZ?D%jxS<_j>5Dpfx2y3`o}oz1`~I3K-!^!_8YySZ|w(|tV3X_+ z;fYn*{!o7Dlu@_G<`$;YHJ|B^rfiFBYB}MQ8sN1e@!WZ{oa8g zp?&B8Eu7|QHvMxi^%l<@2V;lbVWs-X8nv4_O@^?>#?-OGuZdqgmD<|cuEw8w2ZxgP z8;nmxKZ(HE3};rV9PV@N1wEC# zOtFGM*FVZZ{fOH>v<4Jj)C&EL>IX3dMhBfyP!})k5br#c*pgd~p1DM;h=k&nI=_y1 z10!G6n?#wtS%$;UOD!|2_m@<|#t}*;7=53qtO}3sCjje)(pKArtD@w*%>p-m+`1!? z?X(H?>jYy*ssHM_!!I#`lV#7l7krjlNBmZi*B7HcTO8jN=*69Rki{T;o##zUVxuYD zL-Ycwo})E~+w?~rV+QX+FOaA`O=aKuHWBUOX|tGyPfOt;27M^C{Vsc6a+B#;AoC38ivC_JG6zmO6`3{>x%5h<A`+skD(aTzw=lAnciq|z+3!SMd zKGk=N>?T=Vcz39zE{?+l7=QH-@bE8V3opWXqpF)G7U7|4Dl6 z1x*#theWrOSC}ZUT_V2tAyPXML#+3e7`xk7Y0>(^s#0sBoL4zBIeA#5<}a}9N>tw7 zXV?7B_jE$L9Ut&PNX1F2>Cfdm`v=v;{~;RUT9Kzr4aGD^NXtg4`^5=gK~^znsVqyC zay3^VZ+_X#n}OJMx1lBX^-Rl|lH0D$FL(Csp#tHpVWCTJB$GK_@4q~~T0Zwfe9hZF zSCuM~T}w57H!Tv2u1iVMp_pu!_r@v{f9sIT%FGBA_~R8nX%tsvMjBi#yulU3edVe^ zaj3{>uq($yrc;Kj0olb^6D8Ib;@PPD1oP=%!>YPQ37_wY0h^NY4Q`p2Y=uywkfY#5 zKCE>e9jTZ%le4X=U`y$T!<#?99t*vkaTr@q-;O}$j!9Bgoe(eQ*!St=7QDI;U+;CX zJX*Yv_|!7zb*$T3p>A#SQ-75H{HU?y!_#?&X^GHsUANck1?`V* z@)mu91?RHT-nI4KRSOma4kCpti>;itPuK4dS5F1Ij|-@N_R9M~veyLEFgiVS8Q?hc zTsZs+HjGMau~4Gm;F%@(6=O&xVwCkW=gT-9eOecP;>r?xqH!gA7!AW4MssFKC8}6j z-`Nb0bRjU|=nXX?!*K{o$_fkbKCm7)f8m^S*4DO}eD0Cf9IilHc6WDInlFh?Y=&tLmm%o=+DBM{F8%1Jd*5PwC_M5b(Vdje7Bu~6 z`Zl#BjPXgWb|pQnmuB?u{j%q3! z<9t@V+j%L%{vR=8`~x%$g0QWUwy}7X10z&oe+{`2)LI)xjuM8 zen$*Cj!FK`=^P^K3od-rYvmuX)yMcPL?8h6=$SUj$3z4m`hxH=i?rH~I*q(q{`D(; zZ^>uL^={^(hwyPo6mUE*( zpv_`9L7$|67CJ)Y3))G}9(|RrpKL_4_!+i@fTY@+%`aS2++Q)eV7D3aq4~@!jnR+X z$W97uAE0~`A>m1!ecn-PE{0f{zY7X%8cO#Ax|b(8!Il94854P_ZwK;pq+-h(pwmi+ zJ^&1=6JC=Q#co=MC-~ydcmGvnHc+&y`zGtVZzYvnZl}NYQYC}eeJ*IZ4`bFj`Z8yM zJjICU) zd8Z-lPns)t=D)r!2L!;@(>wK(C@Rh2wR>w4`R@Z(!>8SG8LGJ?H0zL|yaS?=2HE^rP=L?9{i)nmYUNM5Ez-lf zMz5+)jh`xd_=p^4Gb5UIvc7#YAWiL#%mE z1#;HN{>q8(Jhrbu6$yZS#)j7-8K6O#5TleJPlLJvbHp*fxFNChS#e5z(8knzpL_LH zZ=$MHr9*t+ZyFY@J#AMhZ~?`*;>B4{y7RanmU!sLeY{oI@V%V6!nB*VUO;XuDx1PL-wm4(ZxY$4|Goy)?%w?%l*! zarZ}jRwB>ll5n*DK3-4vM~PV;xOL*r`HrSje-;pARDuQ+WNI1HMqG)wBiBP4%4Lb3 z2TOh4hvrh?9#Rvd(SaLLM883xU}slkqoq~o88D6X zBc$L&K;2N&(0S8o`nF-)5Iw)@dt1F}?_g8=y>?Eemww!Q&wmf2aBEFe$%0_v()&qR zbz=UZfD_wmJz^wfJ8iq!_q01Kd&TGd3Ob-uI{D@A*$?&>0XvTf_WuNebPODye+E-dD+Xi`~IvYv%7c2)*BHfxX*U9E~#FgK@xTRYNRAw%7E! z)Z8k+jPoJ;YEY+Po`O~srnjxj%?oVfLU=J+L5$abhUx`S#4 zVWro?Urq0mjiLnGbs2*hv4|u$rYwOPho^r2;rKM8Vml1oi01K6_bshyU{(&qZzLGg z2bXD`yu}~EOT)KZ9viM^$&x=--o3t`qmmXG<9 zq*0hTT?$OGuO;Q8XwWisFibIM4?c^C$*2x-8mchO65YUyk3v4ieI}M>&}uIT0P2EG zMJ*Pt-cv`v$!UF0?*2=S`2E(X`qSa``(eY6b?qWGzcnaFR4)Dt??FO;@veIG)%MrX zhrin+(z(-w085%$#=wvabRr-S?Pdw8JG#%qt(zAh1=%f(qwx6b068(rX{7*(TWolN zt?|2?fAK3|682O>?%S z-FXw{8e05#hZLX)*;S=dV24L(W1IeL#c^l&5Ie?vQjz6Ug|mBmkkQ@fM z<~}tuHdl+^t1LWz=PP_#vH4}Q9OV<&HTyfP*L!7!6~iAD5xdNwkapy;kyX7PeO%gr zdK)+n_lw7LgJx1WL0`g0wXlDJ%PHnuLf?SBS74*W?hz!@e)kN(puJFG`VdJY(ZXyL zztm0*)52b5R3P54{-@ES!v_;RpAR)^ccF~`OQM~$Q`#Sp?9H}vZDoDQfVVT3LWxO1 z_(b<`(FO)TuqiT%k1m6GYk?BXm z6MttT{_q)Mm9}~4J*8b@(--gkxtofxOZrlLaw;T{mqPQ9nCS=31e_nHUyqX#AQd#F z8@=;W#E$+fmS`H9q4gzTNRT?6sN}bqnWN|gz5~kmu$Y)tsX5gY~xb=8n z(n%F^uw{uWv|>*K)&t6Z<(G&j3g$%QzR}-hzn(4ihf0JX11W+Ih2;(llsslI zy{W>Xzfd^(pnH^AC}vLhKT1-XP@YWev1Qx6(KFqRmJe@+-ysYn2FZfQ$kOFuFM%Sh z-{fhudqKokAYrvFJc2{p)dHN2w_g7z-kcx_@`>H&O>;v{X?Zrs^EG0+GnZQ_ADvH2 zKHY|ww#lIb?kyeN?^94> z6c`LXcNSQ1gS37LG)ZL-EE&hBN#%}7+wLF4Mqld|_>0#ZKAZT_i13}RD7&Gn!F-FM zLD2tSih%05(_qE&ONFQ9w-z2$OzsLouC_b;1djarR^`d+I2(*T#v$(zn+hl81DFxU*kZ}=*|a)g zhivBtJLcd zyVg2{gB$q1JFYujmrZE3@aS@x;hOIXO9N92VxlHnLrEdPzba4g^8VGaIfq+w}re4lpt_y z9g*dT3fGpx--%ow(h&^&Kgq-p7osJIKu9V*vkV4fifyz|127@$2@iw)*X_KBx06g+ z#*0wbQY0(VHoW-Jph0RFID-TSsq&GB>rXy=op=!sFB^+r);siysyyecTPos3{2YT*Z*T; z-vT+fonJd@4r?1JQOIZ!F~9V#y<3-^QnR(xO0;VnRzMadiKVqgz#xs75g#P9>PtPV zD)5>=EnK-Yl)AAa3fpuh62`rw#Jo;tKSW@EYOc1OaH!R$S(?njwO~q?SV`yo(9`Fw zCMNLEQ9V<`p}=tW*_B%LoiJ65iVt$Zuc!v%<8T977Sh9|Z=RKBhcD5Tr3#J|pi5Gf zwi=B}5U@`=j5faZ;sgCI==a-0j4u9RamCGLn%O)|P%4fL{Qe>X^S0NRJ#cnac!ZX% zL>{z1c8x>pvc~jW2`vNuh89(`96pK+Rc{h&;A}{!AgChiPVh@G&M!FJ=7)j_3*}a4s*#6blJ&_sXpQ%G8}jD6tt9yqqP%A;HWs zK+(j}12PIp=!!jGxRxgdQ)%QxtFy>xwPFJWS_6WrE;4iS%j&aC|JL?Q>ZOMlKm4+g za8)a}Na(Yn?{LkbF2Cx2{L>d!?RV0lN{qzR0MsIR>jQ`>+1{1hd+SZ>L=<&6rP5E< z#Vl!`yTV0@NzTHR2!P2+N5}Kw;d8Dg?#mHv-Kk-N^0s6YfKq6W9$eQ^aqHjQvw)1J zrrV@~x6LghGLv)LYBCTdJ4+2@g8)NQp*mvGM6!PXr}uRA5-dkmgJ%^n{x z>hrEuwf>~LJAxuG+gyG}Y3enG9^Hb~C%d~04smcQ|9DB=YSxX_dHp~R#K5X>+8l6wN%b7=<#2~kNf56Z0VA$d+u_oort$IdzF`05zwK@e z;Z{MdY|h;GD9|lhGoN>WXaw(YeNA^`V5n~{z!^*1tUlGqtEh=~LIV7u!YGo`pmFRM z(sh-h%0jiYg=s@vrRUe;-d1F!c{yK=82`<(9M5<%c*Pz+Ug!_M_?50iCFt8yy`pE8 zo6&eSU~VN_j7IoPn-mA!$)#_2vTA8DFwffm%%bOmF168k(b)W+%g9wvBjbsl__?2N ztxdjF7vqZUA9`QsxOR@XiYra{eDur*dG+&_fx&YEF^r_>H6_3*ek~oSp@sPAkMW#~ zSiVS8`?bw|&Z0Vz0LEITDcPnYGVUR&ksAa4re1a9SusU{&AcZ_h_A>xpEqjm6#N3^ zitqak@-h@uLd=9=o;aN>y%||Dlo%pUr#jKhg)*uHDv$3jpe|IGdZhcFcB z)kwSKoum{`!DkVNgSz!dn%0M_h3mNe;Gw_z(JfJ7)|feNdUNHR1Pa;P?&WuNA1^ajR7Ib(}Z~*#k z8*Fg?qrhj!3+uJNr%|e-&1c^(uLNc$M|_^VUGRW+l|5wV#!mtpO`b;uUe`Zb?R`G3 zct2?NT3@&_h{zOHCL=N`UaRPkDY0o#d)Fmrpu9o{^%-=!pNV8SNnerlRM?^wE_7Q; zHTufdG@b4FP-4`6F=Nw?1Q~cc$;x(%>4!-tHUe&TgrR39$zbMFMrC^hr-z~%Q!16_ zXq2v+L24+Ta1#oUgIatwhnks$!TU)xtqo# z6HqGjoq^JW;CY7UN008AmV_1%f0m^ET@4_Xx8&6iI*tV^6!CoMWg?kg(n>n{sQt`Q`yl1G`fj=}>|pQ9>mT7@l1gGa-KKUyH#M zQo}fp>u>CPd962D0`W=txw1tMOUJfqx4jZdH z?JynKgHRi>0-%H1<#vBaV*QKdte??{H;rNhhRPv*rP9p3wRk3GG!Wpl>hD@xqF==kvA&&aMlGz z&&2~i`v^lS(t9!ca`o}DYbl{iMnaj`MboS{4HN{Kh%cv!=?NUSeYv@0by*a$Q)Nwu7yy|SK<%WmZa z3Z??maYbM-V2qb)V>St)B>n{?8UsX`j6Q(Q>xxK zYv1UpLI~64rzIXWc+PLP5BpuVa?)={-1JwDgT2kml|g8h_?C_0jc$;aBBOp$r@Z)D znap;egb4^qfJo$$YHdDE*75i6`|}G-8-Hu?&6G^Y3-OzHb_x$jtOa6*6zc~8n);RW z?;EkbF{_y2EUYXC$R<)ZTahnuB$yB{pp=9d&h5Gu0mt|B;DBfUP~*R8fxAjjejjjG zw~*P@3L?gQlZsRz=c!sS))4!GUNX!_!dCRY=rl3dvgRT(hLa691MK^eUYo>rynJH`obw3EkNK|-e}=G$ z->%`kPZz&>XJywVfr!|l^`P_njLurcHEV(GHzu9AeEqu_pZ_HW_uRFVlw`;GpB>>U zo|N2(Bpe5Ohuq;vnf8;ltbuDdXCBlkaI>Q}eoHl^50 z*NWHP*6GZ(d(B7pIjBgVS3*coZoQ?T_x?cgu?(rdmhpmk=k?E`5(1PzN#WmiLk0z( zw@tjO#(H9za5-|bw?i3cCRD&jnJV2^)9sGc549%ei((OSXZf5w(B-;xS{Qf0LYygF z8)93P`F!-xc~crlugXPO{T^6M!P)QQ<0H-=7vamgw>EB-2~okU5OdDqjV5ovUxl{i zK_vsW$2>+m8({uI%Z@VV=Ugq;T(`rY3Zt->e02YHE5}WyD^wE8#_p%xCFgPxgh^1~ zR$Kvt?iH0>l6UGJGp+f#_jn+H>L<#Kfw(qm*71f79j=7*_Icm-=G$4< ze_&|>XII{A$6D$cR4;vjfU<sgE~Z+FvgxzJymX!! zRP<_vS+#U|!^dzN=HO5sV6iL1n>6tGLv{;Y>=+KMV`?(A`mm<*w|k`%86Xy4xIE)Z zFgbOqFxr{V`MwGpo2lGUGhD^-xtdpU>fa8<=gEZ6G2Um?ot2vf{XVz&fjd`^9g;pV zWp_pYW&aon$DaE$wO^i;H3h_QyN!F5Qm!t(OqHm`wA@&)f4XVTCB z0gd;?Ua0xm;)?XVY=teQw_$Oaqc0YGa538U;-o@6Xr#P^Kp{WNNr~0(d6&vNkoWqy zaP?P#Y2_LHSP&4SNT#Z4{&7y)(uFUHlhd3jmK%(9dk03owBRJQK?f!oOD5zAr#?qR zGTU)M(WuX(0j7FkAmo)cZk`wJy;j77yvt*?MPjJXBP@9Ss#JLa6=~$un@nt`uIlvo zhsReW*w<3RwwsP-WGgK$-Y6VU($LfHo~pr};3rQ;`$5hr zZK8~C5`O$P7T;P>6(z5~qe7Tl6=PwmtwOlGxMrrKhCoZp(PV*x5c3%!W_?NVMq5RL z!ypB&2`Mm&Y+ZLg(n@o>E%7w>$>!B{Z|>6zG_)E4NIwLw`Qb8DG7v~kG3DpC4#TB1 zvEpq{ms(X-{S`5Pxqqn5t~<}3oXoGrw0rWI;tQK>O&((nAC9T-Rg$~ke#eC<@1{=8 zc;WEE!Th?jxBi7}#w)xy?1m9wqbrxG!qNFZ$FqUv1fuum9YoH9Yrjo>7f#ollF?=b zL5km=nK0GbVXAQXYbV>?UnZ54>8Tm?j0h^$9xdH-gu28O>7K`tQF3rOWO!x+S|#L@!ye7iaBiGR5!Ca?}5EKv(nx_>0!(_&1&MFn{h3 z>}a1kQYWo1X((-w5Y84(xS4 zQlo!iZdjz&W|v&ZS=O~J7R*=dns7yFh?FJ}<;JBzSmsNffC%FRXRe$V;1Yzvt}g+$)0Ep2gZcC=|ahh5YBl&Oj<~c>psl%M8C65m-Z0qd$?~^AUP^#b$mN$ zJU!$EBKWVf_4Y|TcbNf;V=MPYesnvK%NUr#-R@iz+J#F<)5fy)!a&kcd_wvk3DaHs{p=OUBgH*XHaG z{?L3Es%;k9u4P!&bOlFzQ_L7K-uSc*Nigj!|7Dv~Xpl*;fm8w?+{tcLuQK)8YRGZ< z>F`t0b<6okVYa@0RRa{d=%P;i!l$mI;qO_F@cqGsY4BKHjlEopvJ9IJ+FOz9 zqlVKwq~bT6fk6gqzodU0bGI<=CDlF?Q=S3I#Efg(z&0oYKAo0iOo#A>f|)_iA^e&6 zOrEM(Y^y+otSoA3gUC-jN~YogrK=qIWHRE(XJAjV2RaenaKo{)R!j`ZZS% zvxru8JV3J`?$*6DD$AQH(;|`G?0|}>s7Bbr@#S_Lrb>rMQdt(Od=m&>zACEPY)mDom;iHOhuB zO(abv@i7SGfJA?Gwm7KFx}A`-Mk5g4>qkPro8ruiaAQq3PR) zng6}&u}-d;tU0t&M&vOnksvEUSi8jUZ~A***!|reT6Wl`(Jkg5gR@<2{M2xpJC-f`uJME7#szI(w31lPNQ?9#HggHf?~5;*|0poy85u5}a%@Bn zO?45tV2fz_xSt4fc|bT`DM>&;fX6S60`>=rx&995MG^)K-)nyiR!PEV46WgG+3qKZ zRs6&Oj93=P2pLs>TV6PCN&@!4Q3LCRt0uZR>&EX0$v?^kk`@DLs|`mQK=4k(BgnUN z!Ib;uDsB_BA%1iSD26R{ZxUl*q5^E+exYTCe^_1lGai!U+rl!VT$f{ZsxOHPcU?pg zsx!vMd{4`s>{cLeA|Q>pT677MdG>l}{(6XS!lkT5hZHOBGa$`YcArK;r*q z0TefZ4Ncv^FzoD{@w6=209gn*%ci}|xUa;xZp2^vZXzftVCLYT3KwCbUdqnaVnQa)u~{uDQ+t`t$9&lyuRBeBH^g^E zD<$c{maDzu<9P{=kR&8JPiglvw_fBPB&(GYZ6$tF)Bm|(tH3c9??`c5SSEd`^jri@ z+#Ns;k^J_PxZ<5|mB|b%Py^1i$AY@Y5-F#?R_({72Ji`ToHqKb^Fi+4QNRg(U(f|z zp9q(Ca0Ll(}l0?COk~o&rp$g!X%_<1eKENcsp0}W?KBse*U*5Cqnj|89Mch_?E$-7MY)^s3{e@G@L!9jbZsr%wj$m zj>O>y<8jV$JZ>o3y%k#KCVgB*cdh)v!E=pbuD2A<^}^$k=4q$J<>7L8)Ro@Bi>G#q zVk35d0SGDdCa+?SXX@J)`ZJ{~`O$|W6y&Ex;0bz_mSV5$ri+<>siobm{7U!ObEEOt z`N;@eA)i>1AJvnzSz9hk!eR$MM?KRJgwRS0z>k4CDov`WEaJ9GARXm|!No|r$(fEq zAry)sS6Av8if{J+(R7tTU3_1E>27I|ZUO0Tq>+{`=`QK+25IRoDM7j$q`SMjJD>eM zGyfMmI+9w`XoCPf0OgYrvHxHJ}rZMR?PeAxuc2m zy4Q5t4{!{p&hT>FD+EF8-MTb_vwsC2lPh&`4kLf7*N6TPOf9-IAuGg2VGTakl2XPG z!w>5DGT}GUuMN%V$Rgyyo5?8=O;DGW`VO@rwA)C==J~Vw(`!HtSfz>}9^i~$zQDtE z>H;4jFA$xw)u61! z@xr9h17BtQLHhFVVab0vK=}cW^}-)PMziI4S{{FNLwG;9IEq-HQvj$m8DmIa+&4Ej z|AW%QJ#qh<3glQU<$-{l9P^4?OCajCA%qR=)v9XI3PxH{TfWRcm*Ge;X<89FN_10B z(2}=s|Jnn%6_cwbs>kY)@Nc3HGhgCv}_mZ0QOPGi^G$?_Z(7f=M0p3tUw#-r^sHX)wcT zx`--d{`u4-Dc9)whw4d@MvUA!>bi3J5t!_|(Zv&CD)Qbq&VMo68?xr)`vOl!3MFO5 z@&}8zLe~DuzT!Md2e;8B*Q#rP>_XuC^)O2p!2I z>;03REX%k-0AqDh(yn!%tD|)7xw7TAX+y1f9e4!1T!#mu39bD95itI`0e8CM;~6>D z`iIp#8E zlUoKq#Xr}SGm>M%v!#PpRdA4I|M54`8h4Y$seuxmOk9mKJ+pMsI^RU|UNgC_H9=*F z+@F@Y${XAuh{9AD9N=DuiP^42BolciesKKn|m|Jx@WFxj_Tkb3-=pN zr_8MA!p}>z-1~W^pAPWCK8s5io(q0w2}1_t=mDxq4YOhjl$cD4ICfLuTVV|z|167* z15D9#Bbvsqo_}DY?x5-1!1;5>U?s;_oEXwAR)|W&=|0)2sXmLepOc_!LLW;n*W>>1 zAL&LYG43E+zdt4(;7Lv$07Z_f@GMbb;GBVT+d3rd<7?<)C(0xswSX!)wpNP|>dnT9 zxtjwFdlsHM-j`YJx*(k<(R>uSo>yH*L0iP4SwAYS&gY!~F*Ik~mH*(E?S7cHq}uM6 z?`{5pI>L5gpDhff=(kCY)Znk~m7`R7DOjQ6qu|6wWF9=7APk0+8Oi*S2iLVq6_p_k zLllA}ff4^ii8tvWm3kbqwShr;Y$Y6TZNeVoJz~&f0TuvEwdT5=aBOT|Mk}P+MV>oV zml!f|`nOoVXae#hbN;4n+^=P6)EB8H-9D1t3J9t2U$fVH*x}XM@Yl|@8lzp7qkVI zn@E5jMfc*!FZHA6TcE8{W&s^I1Ie+0i2Fbd}Ru+857I z^4IxUc&8MLVV>e(zZ~tPd#_>ovCv|vTb!JQD{Y#Ah}F@yHQ0MK*iUEG)=%yc7_5#3 zKgUVr3UmtuDA?mjlKrQo*4HJ^#nHhF3QJbceLHOL^4`bSJVOW6Ru8w&c^XDbv_`+g zGd8Jz?(c8xP5N#GC2gKA?Dq#rlQaFLW|5MTENE4J-PqsjF9L$BG%17L%`3QzVm-TCtws~NzQ z4)S@St9J+acXuGM=2_9$C}~n*Y(l#F<%4i(v-`v(XGxUuyBTmMZl!oxwuxGFLa7HF zR$aYvO@g;4NSBIWZieg2 zY*f7cAT@t`n`~l(652BygwCVeE)1FDLCT09cH}gocGNcE?47xEcyEGniFYo5NGjuX ziAlGM+^>-e_O1jWlaoxmAF%}D_|g5pLFE!32@*4f{zIaDTdh_fxQCR%Uy7~1YYbl_ z9{IJ&UaqNfJ7N@DXx*`&RjbC7o@sb(YIS$D>porCA$YU2>ND^@W%Z$V>=|C+C((yHOf%XuOr`? zcN-BX!|QzJ;Wa9f@{PdxGW6H$U{HihAhDBNnUxKMpVfh=5%8v;GQhqloT;`GwT~u4{u|kKQ zUzLaRxK=;#dYsnfuCKbA?FEku66z2{v$7GHc1eDeZu2@_>U?xv)9ffhijy$dVEcI{ z8p_9Bz3Q3`%hmae@RM!AgV^IN;H`6tM8ssU2?J6ZM}@Lmy8jQ*84dU#-}lS`Uih8S zQJX1%k7Ur=jDshVT{)Ymcn{`fz@+()TIC_ejSSxf2-iFnYL9?TbfwQ95WPhZ#FI5Z zWr*%Pmb-{6pWi~gz`y#_B!Cs0&OwZeW?ZWVWlqbC5S}gpe4F=PC5R(R?};IXM?TA`(Lk#09xkxtB$Lra_#qrfx)r=mZS3u_vEC+rZuKY z6r&14FIT{oOq|cRwuW}KTyI6`8#kL4WKiD{TZaojfo9n%jt;za;=LhmtV4Lg**bk9 zu0+0c#qVLWPd`7uQL1d?GgsO=8#%Iim`2&Ll)^IL| z4}N9LNpR}Cz04?>BA#1D*+myc3a$it9;HW%10-m+?|sZu>Y0KSC~$tR>vg8OUJh%C z>2|hS_pj$%ClUD-g@zYgg%DiV$7Aju(>lc)^d3+)q0}$s9#x2n(RU(+%o$`zwtpx9 zb8G7v`Dr4#>0)V-jz@oVGUyG-s7*599bw~JBW?}q2FZ*Km(c@t2V?5v@v6(rnUf!dF)s}4uF6raBmR)1+C8p>^zOy901<%J5x5!7J&KT4H2Nj0J#J1 z0?%(1VNB*Fi&S7pnDzDZkLy_ALL?)Iu2dwC;seAB5~t(w`2FUn ztz`iv?;NKOk^CjcPuieUWg4z-&6sO4!GD3;gKg5F%`xj?nxI5d@ZK*>Mqh9 zkn~zj*0!@*dXBa;u3TuE&Ya`*P-TAV#;tkZtr_knJZ~yKJB>niw0FUmp{l_+jkZ$n z<|u>G;t_j0tomZk$Tgo^k+UOBdbU>|P2xfOVamzT(PInK{oD6W{>dcPbKR)TP@odx z0=qV%9wo5M`NkO_VGZd39*~p>-H+DtM)8<2a?3KSV}H0J_%Q;&Oe{6)Gb1=EYvRV5qKq>TZvyUFMCi89gMOBp*yPC?ZZ&R{eed(N< zY~V~1l49FL^`qXH^tJ2#!YSmg`+_+J zQKNW&fGrUoG(pr2hyKrSogI)5{8~cgbif-@r!Py$DQN%S_$T;F(VfH*6g%UKgsKqu zFlhEKkPX*lotUsSkJs0K{4QgD>k##)**K2|J|GNobab=~JMtxJfLvkX*tHi5BA%To z9k{t`CD`BvElOnq`ajM&Nh(zI*2Wf?C#RHcn{MYOHmxcx+TYjTy%)BekIRFVS@l$U z{&w8AjSx0iv!uUY3msdHLB`(*vrHn`Znq)Y%%apxxI7KNyK@64_iLVZvt5C3V6KKn zm%(RE8LTq|7E{OvGC$@LCr^@2UGW>sVg)%OM_7Kp2a%wAV5J+c9brSO(cifGob2!H zDQ?uJ4WIx#q|-+_<6;0iO_;wWJX!$E0hxLRhpw-2@cKWp7iSy+(As8Kf~l3RtMv(u z5}%YD)(?RUr)zdX%S>}_4m#b@eNn<10g2o5=)qfrU;jp9wMrq^`L7z3z9K$n)K|eP zsnO%AHq+C`wR_e|ZXX>I6o9!E9l8B7gyYpI+e&awQaaJt=(BX{1C^8D#p*dsQY6GL ztNF@I=l9q9W59l+)BpJ+h(cLyI!1k@&J&Lu7DU{j2kyIW-5<&QIHIZx#cS!h1}x#o zmpa2>kL$JrSUz;y{PF#0dl42|0q7|<+_xO1va_>$aS=p+jS?qsfQIy6f1nBU`c`ud z{Ku)UvX5qZXJ%lE8gp`Sy=$vy?Gbm?pE~>=XUTACAFe5%=cUj6LLQeoX@0|2T3RY3 z7c%^voq*VA`Hr5PpbM`I9yZW7qKEvPEiFA=U6u|>Sw)45or_CbH0*wpGq);$4@VG> zCR`AS%jrQ(hlj4#1&2)N#Jr;<_UAIxXbAR(~p_{_R_gUyCgxO`d>mt3*Q= zUOJKilAj&=r1y~^l5PKwh%mvV5+mo3u9YZg06jMm{vO>Bb%mw%9av&n-0zm(b%EgS z$MfmI`^Gv)R?3hU7IZ;f&97UeNPDA3)(g%FoP`AiFGDru#Nl`?w@Lpz62XC?Ml5$? z9|R~dgnPk}Rz+Dk>p1UytGX8}Ef}6`3jEL6IH?^R=P1~*$6RA*wBTgSZ^&rSc&+oc zzV~LWj>8{;s!r$k7dpS^&3HF7sKF_A9ncLQjnrT(V594-<}`fkb@EGaZ!i6??fZc5 zh?buAFs#}a$W@YUV&p%7IQRZ9PMf9Dt1HJ>+>VDng)nm}ovrOPrmS@p9jN;@_lXuT z26Fl0F{(NsChM0Jay?R!3i>9gA4y67vs|Oy7PkFuB!5(htm+G^A9eqqkG7^)m>6G6 z2ZGu#lM|{`?YrnjF4C@HGMcATPtHpr(nUctp#nwtY01;*gK%>##5Cu?l9OB=H;Fc1vCj3{?zV2Em zHDQ*a2GJWxuXL*1(1It1;WxYqn_yzTx?2qS5Y_C@asqvEbl+}f*|3U(Q-r`B;}lNc zM}z_m={xN#p!vHC@(j0S8W0r+0ZGl@zh4sxCEnsZnVl*onEv0s2o zu~c;dqz%pfoUYSY9SHSBr{w!a^Tg_CLPqNq^HhKd1=eD6=U>fEH&S0*S*2slNH%jk zOAoO+8kj!z2{T;hH>J|h(-HpG@HdYPe_EVJ@;-9AC^qtyy%{VU3#3|F0_H^JF<1bM zhJz=w3`VE2CybBWh*5aTgcC5CW35dSN9o;S(_ljvS_-3M(#9!WX{^551Y6gP_Yt

0}{pn8H_!6e4>2qK#4WX%pKj+9HsG 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 B3*!I) diff --git a/GPy/testing/gpy_kernels_state_space_tests.py b/GPy/testing/gpy_kernels_state_space_tests.py index 034b58bb..fb5fa228 100644 --- a/GPy/testing/gpy_kernels_state_space_tests.py +++ b/GPy/testing/gpy_kernels_state_space_tests.py @@ -28,7 +28,7 @@ class StateSpaceKernelsTests(np.testing.TestCase): kalman_filter_type=kalman_filter_type, use_cython=use_cython) - m1.likelihood[:] = Y.var()/10. + m1.likelihood[:] = Y.var()/100. if check_gradients: self.assertTrue(m1.checkgrad()) @@ -95,9 +95,9 @@ class StateSpaceKernelsTests(np.testing.TestCase): plot = False, points_num=50, x_interval = (0, 20), random=True) X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) - ss_kernel = GPy.kern.sde_RBF(1, Y.var(), X.ptp()/2., active_dims=[0,]) - gp_kernel = GPy.kern.RBF(1, Y.var(), X.ptp()/2., active_dims=[0,]) - + ss_kernel = GPy.kern.sde_RBF(1, 110., 1.5, active_dims=[0,]) + gp_kernel = GPy.kern.RBF(1, 110., 1.5, active_dims=[0,]) + self.run_for_model(X, Y, ss_kernel, check_gradients=True, predict_X=X, gp_kernel=gp_kernel, @@ -202,17 +202,18 @@ class StateSpaceKernelsTests(np.testing.TestCase): # Sine data <- Y = Y + Y1 + Y -= Y.mean() X.shape = (X.shape[0],1); Y.shape = (Y.shape[0],1) def get_new_kernels(): - ss_kernel = GPy.kern.sde_Linear(1,X) + GPy.kern.sde_StdPeriodic(1,active_dims=[0,]) - ss_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) - ss_kernel.std_periodic.period.constrain_bounded(3, 8) + ss_kernel = GPy.kern.sde_Linear(1,X,variances=1) + GPy.kern.sde_StdPeriodic(1,period=5.0, variance=300, lengthscale=3., active_dims=[0,]) + #ss_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) + #ss_kernel.std_periodic.period.constrain_bounded(3, 8) - gp_kernel = GPy.kern.Linear(1) + GPy.kern.StdPeriodic(1,active_dims=[0,]) - gp_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) - gp_kernel.std_periodic.period.constrain_bounded(3, 8) + gp_kernel = GPy.kern.Linear(1,variances=1) + GPy.kern.StdPeriodic(1,period=5.0, variance=300, lengthscale=3., active_dims=[0,]) + #gp_kernel.std_periodic.lengthscale.constrain_bounded(0.25, 1000) + #gp_kernel.std_periodic.period.constrain_bounded(3, 8) return ss_kernel, gp_kernel From 91fc0b163bf5bc1d4d53be2a41179c4ec8e62e5f Mon Sep 17 00:00:00 2001 From: mzwiessele Date: Thu, 7 Apr 2016 11:07:33 +0100 Subject: [PATCH 06/19] [plotting] lost a baselinge plot --- GPy/testing/baseline/coverage_3d_plot.png | Bin 0 -> 50708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 GPy/testing/baseline/coverage_3d_plot.png diff --git a/GPy/testing/baseline/coverage_3d_plot.png b/GPy/testing/baseline/coverage_3d_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..43f165e63f273acd13cbcf45278ede1b1728a532 GIT binary patch literal 50708 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

N%FLv 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 literal 0 HcmV?d00001 From 61286a10ee8181d40ad5cf387ed7befdd2dd83a9 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 07:37:51 +0100 Subject: [PATCH 07/19] [optimize] optional parameters taken over to GPy --- GPy/core/gp.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/GPy/core/gp.py b/GPy/core/gp.py index 0701935b..1434573a 100644 --- a/GPy/core/gp.py +++ b/GPy/core/gp.py @@ -532,21 +532,23 @@ class GP(Model): def get_most_significant_input_dimensions(self, which_indices=None): return self.kern.get_most_significant_input_dimensions(which_indices) - def optimize(self, optimizer=None, start=None, **kwargs): + def optimize(self, optimizer=None, start=None, messages=False, max_iters=1000, ipython_notebook=True, clear_after_finish=False, **kwargs): """ Optimize the model using self.log_likelihood and self.log_likelihood_gradient, as well as self.priors. kwargs are passed to the optimizer. They can be: - :param max_f_eval: maximum number of function evaluations - :type max_f_eval: int + :param max_iters: maximum number of function evaluations + :type max_iters: int :messages: whether to display during optimisation :type messages: bool :param optimizer: which optimizer to use (defaults to self.preferred optimizer), a range of optimisers can be found in :module:`~GPy.inference.optimization`, they include 'scg', 'lbfgs', 'tnc'. :type optimizer: string + :param bool ipython_notebook: whether to use ipython notebook widgets or not. + :param bool clear_after_finish: if in ipython notebook, we can clear the widgets after optimization. """ self.inference_method.on_optimization_start() try: - super(GP, self).optimize(optimizer, start, **kwargs) + super(GP, self).optimize(optimizer, start, messages, max_iters, ipython_notebook, clear_after_finish, **kwargs) except KeyboardInterrupt: print("KeyboardInterrupt caught, calling on_optimization_end() to round things up") self.inference_method.on_optimization_end() From 77777cf2aa27dc9b14eebbe60ff9e3777786e9df Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 07:38:09 +0100 Subject: [PATCH 08/19] [kern] commented out skip tests --- GPy/testing/kernel_tests.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/GPy/testing/kernel_tests.py b/GPy/testing/kernel_tests.py index eafde0ec..6b620406 100644 --- a/GPy/testing/kernel_tests.py +++ b/GPy/testing/kernel_tests.py @@ -395,14 +395,12 @@ class KernelTestsNonContinuous(unittest.TestCase): self.X2[:(N0*2), -1] = 0 self.X2[(N0*2):, -1] = 1 - #@unittest.expectedFailure def test_IndependentOutputs(self): k = [GPy.kern.RBF(1, active_dims=[1], name='rbf1'), GPy.kern.RBF(self.D, active_dims=range(self.D), name='rbf012'), GPy.kern.RBF(2, active_dims=[0,2], name='rbf02')] kern = GPy.kern.IndependentOutputs(k, -1, name='ind_split') np.testing.assert_array_equal(kern.active_dims, [-1,0,1,2]) np.testing.assert_array_equal(kern._all_dims_active, [0,1,2,-1]) - #@skip('Gradients for independend outputs with different X do not work correctly') def testIndependendGradients(self): k = GPy.kern.RBF(self.D, active_dims=range(self.D)) kern = GPy.kern.IndependentOutputs(k, -1, 'ind_single') @@ -411,14 +409,12 @@ class KernelTestsNonContinuous(unittest.TestCase): kern = GPy.kern.IndependentOutputs(k, -1, name='ind_split') self.assertTrue(check_kernel_gradient_functions(kern, X=self.X, X2=self.X2, verbose=verbose, fixed_X_dims=-1)) - #@unittest.expectedFailure def test_Hierarchical(self): k = [GPy.kern.RBF(2, active_dims=[0,2], name='rbf1'), GPy.kern.RBF(2, active_dims=[0,2], name='rbf2')] kern = GPy.kern.IndependentOutputs(k, -1, name='ind_split') np.testing.assert_array_equal(kern.active_dims, [-1,0,2]) np.testing.assert_array_equal(kern._all_dims_active, [0,1,2,-1]) - #@skip('Gradients for independend outputs with different X do not work correctly') def test_Hierarchical_gradients(self): k = [GPy.kern.RBF(2, active_dims=[0,2], name='rbf1'), GPy.kern.RBF(2, active_dims=[0,2], name='rbf2')] kern = GPy.kern.IndependentOutputs(k, -1, name='ind_split') From b6f4072717f36e850d917abfbc82cf2608d295ab Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 07:38:27 +0100 Subject: [PATCH 09/19] =?UTF-8?q?Bump=20version:=201.0.3=20=E2=86=92=201.0?= =?UTF-8?q?.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GPy/__version__.py | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GPy/__version__.py b/GPy/__version__.py index 976498ab..92192eed 100644 --- a/GPy/__version__.py +++ b/GPy/__version__.py @@ -1 +1 @@ -__version__ = "1.0.3" +__version__ = "1.0.4" diff --git a/setup.cfg b/setup.cfg index 0d66c052..bf387efe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.0.3 +current_version = 1.0.4 tag = False commit = True From e54b94485a3f4c47cfaa5ad431d168df75b4d706 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 07:58:16 +0100 Subject: [PATCH 10/19] [doc] readthedocs strangeness --- AUTHORS.txt | 2 +- README.rst | 20 ++++++++++++-------- doc/source/conf.py | 2 +- setup.py | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 08ee8401..5a2a154c 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1 +1 @@ -[GPy Authors](https://github.com/SheffieldML/GPy/graphs/contributors) \ No newline at end of file +GPy Authors: https://github.com/SheffieldML/GPy/graphs/contributors \ No newline at end of file diff --git a/README.rst b/README.rst index 9436b462..ffd47a40 100644 --- a/README.rst +++ b/README.rst @@ -1,12 +1,16 @@ -# GPy +=== +GPy +=== The Gaussian processes framework in Python. +------------------------------------------- -* GPy [homepage](http://sheffieldml.github.io/GPy/) -* Tutorial [notebooks](http://nbviewer.ipython.org/github/SheffieldML/notebook/blob/master/GPy/index.ipynb) -* User [mailing-list](https://lists.shef.ac.uk/sympa/subscribe/gpy-users) -* Developer [documentation](http://gpy.readthedocs.org/en/devel/) -* Travis-CI [unit-tests](https://travis-ci.org/SheffieldML/GPy) -* [![licence](https://img.shields.io/badge/licence-BSD-blue.svg)](http://opensource.org/licenses/BSD-3-Clause) +- `GPy homepage `_ +- `Tutorial notebooks `_ +- `User mailing-list `_ +- `Developer documentation `_ +- `Travis-CI unit-tests `_ +- .. image:: https://img.shields.io/badge/licence-BSD-blue.svg + :target: https://opensource.org/licenses/BSD-3-Clause -For full description please refer to the [github page](http://sheffieldml.github.io/GPy/) +For full description and installation instructions please refer to the github page. diff --git a/doc/source/conf.py b/doc/source/conf.py index 0885c380..35c71635 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -21,7 +21,7 @@ import shlex # documentation root, use os.path.abspath to make it absolute, like shown here. #for p in os.walk('../../GPy'): # sys.path.append(p[0]) -sys.path.insert(0, os.path.abspath('../../')) +#sys.path.insert(0, os.path.abspath('../../')) sys.path.insert(0, os.path.abspath('../../GPy/')) on_rtd = os.environ.get('READTHEDOCS', None) == 'True' diff --git a/setup.py b/setup.py index 6ad99e9c..e1c5e23d 100644 --- a/setup.py +++ b/setup.py @@ -57,7 +57,7 @@ def read_to_rst(fname): except ImportError: return read(fname) -#desc = read_to_rst('README.md') +desc = read('README.rst') version_dummy = {} exec(read('GPy/__version__.py'), version_dummy) @@ -143,7 +143,7 @@ setup(name = 'GPy', include_package_data = True, py_modules = ['GPy.__init__'], test_suite = 'GPy.testing', - #long_description=desc, + long_description=desc, install_requires=['numpy>=1.7', 'scipy>=0.16', 'six', 'paramz'], extras_require = {'docs':['sphinx'], 'optional':['mpi4py', From db30fd28b862c3972c8a0e14a992f5b8b5b4bba6 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 08:00:05 +0100 Subject: [PATCH 11/19] [doc] readthedocs strangeness --- doc/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 35c71635..d489c7a9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -21,8 +21,8 @@ import shlex # documentation root, use os.path.abspath to make it absolute, like shown here. #for p in os.walk('../../GPy'): # sys.path.append(p[0]) -#sys.path.insert(0, os.path.abspath('../../')) -sys.path.insert(0, os.path.abspath('../../GPy/')) +sys.path.insert(0, os.path.abspath('../../')) +#sys.path.insert(0, os.path.abspath('../../GPy/')) on_rtd = os.environ.get('READTHEDOCS', None) == 'True' From afe56b7bf299e1b6ff1c68cf18d8b196e9654c23 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 08:02:05 +0100 Subject: [PATCH 12/19] [doc] readthedocs strangeness --- doc/source/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index d5f47c6b..b3a8a67a 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1 +1,2 @@ paramz +decorator \ No newline at end of file From f95233ff84b02cee926236b61e129337a0c63ada Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 08:15:54 +0100 Subject: [PATCH 13/19] [doc] readthedocs strangeness --- doc/source/requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index b3a8a67a..dd3ba36f 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1,2 +1 @@ -paramz -decorator \ No newline at end of file +paramz \ No newline at end of file From d16b4ddc602ed2d0e47782e58cd7b14b5ceba208 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 08:18:37 +0100 Subject: [PATCH 14/19] [rtfd] weirdness --- doc/source/GPy.core.parameterization.rst | 118 --------- doc/source/GPy.core.rst | 85 ------- doc/source/GPy.examples.rst | 54 ---- ...Py.inference.latent_function_inference.rst | 102 -------- doc/source/GPy.inference.mcmc.rst | 30 --- doc/source/GPy.inference.optimization.rst | 54 ---- doc/source/GPy.inference.rst | 19 -- doc/source/GPy.kern.rst | 17 -- doc/source/GPy.kern.src.psi_comp.rst | 70 ------ doc/source/GPy.kern.src.rst | 237 ----------------- doc/source/GPy.likelihoods.rst | 94 ------- doc/source/GPy.mappings.rst | 78 ------ doc/source/GPy.models.rst | 198 --------------- doc/source/GPy.plotting.gpy_plot.rst | 62 ----- .../GPy.plotting.matplot_dep.controllers.rst | 30 --- doc/source/GPy.plotting.matplot_dep.rst | 117 --------- doc/source/GPy.plotting.plotly_dep.rst | 30 --- doc/source/GPy.plotting.rst | 39 --- doc/source/GPy.rst | 26 -- doc/source/GPy.testing.rst | 206 --------------- doc/source/GPy.util.rst | 238 ------------------ 21 files changed, 1904 deletions(-) delete mode 100644 doc/source/GPy.core.parameterization.rst delete mode 100644 doc/source/GPy.core.rst delete mode 100644 doc/source/GPy.examples.rst delete mode 100644 doc/source/GPy.inference.latent_function_inference.rst delete mode 100644 doc/source/GPy.inference.mcmc.rst delete mode 100644 doc/source/GPy.inference.optimization.rst delete mode 100644 doc/source/GPy.inference.rst delete mode 100644 doc/source/GPy.kern.rst delete mode 100644 doc/source/GPy.kern.src.psi_comp.rst delete mode 100644 doc/source/GPy.kern.src.rst delete mode 100644 doc/source/GPy.likelihoods.rst delete mode 100644 doc/source/GPy.mappings.rst delete mode 100644 doc/source/GPy.models.rst delete mode 100644 doc/source/GPy.plotting.gpy_plot.rst delete mode 100644 doc/source/GPy.plotting.matplot_dep.controllers.rst delete mode 100644 doc/source/GPy.plotting.matplot_dep.rst delete mode 100644 doc/source/GPy.plotting.plotly_dep.rst delete mode 100644 doc/source/GPy.plotting.rst delete mode 100644 doc/source/GPy.rst delete mode 100644 doc/source/GPy.testing.rst delete mode 100644 doc/source/GPy.util.rst diff --git a/doc/source/GPy.core.parameterization.rst b/doc/source/GPy.core.parameterization.rst deleted file mode 100644 index 788e3af8..00000000 --- a/doc/source/GPy.core.parameterization.rst +++ /dev/null @@ -1,118 +0,0 @@ -GPy.core.parameterization package -================================= - -Submodules ----------- - -GPy.core.parameterization.domains module ----------------------------------------- - -.. automodule:: GPy.core.parameterization.domains - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.index_operations module -------------------------------------------------- - -.. automodule:: GPy.core.parameterization.index_operations - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.lists_and_dicts module ------------------------------------------------- - -.. automodule:: GPy.core.parameterization.lists_and_dicts - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.observable module -------------------------------------------- - -.. automodule:: GPy.core.parameterization.observable - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.observable_array module -------------------------------------------------- - -.. automodule:: GPy.core.parameterization.observable_array - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.param module --------------------------------------- - -.. automodule:: GPy.core.parameterization.param - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.parameter_core module ------------------------------------------------ - -.. automodule:: GPy.core.parameterization.parameter_core - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.parameterized module ----------------------------------------------- - -.. automodule:: GPy.core.parameterization.parameterized - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.priors module ---------------------------------------- - -.. automodule:: GPy.core.parameterization.priors - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.ties_and_remappings module ----------------------------------------------------- - -.. automodule:: GPy.core.parameterization.ties_and_remappings - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.transformations module ------------------------------------------------- - -.. automodule:: GPy.core.parameterization.transformations - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.updateable module -------------------------------------------- - -.. automodule:: GPy.core.parameterization.updateable - :members: - :undoc-members: - :show-inheritance: - -GPy.core.parameterization.variational module --------------------------------------------- - -.. automodule:: GPy.core.parameterization.variational - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.core.parameterization - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.core.rst b/doc/source/GPy.core.rst deleted file mode 100644 index 66878101..00000000 --- a/doc/source/GPy.core.rst +++ /dev/null @@ -1,85 +0,0 @@ -GPy.core package -================ - -Subpackages ------------ - -.. toctree:: - - GPy.core.parameterization - -Submodules ----------- - -GPy.core.gp module ------------------- - -.. automodule:: GPy.core.gp - :members: - :undoc-members: - :show-inheritance: - -GPy.core.mapping module ------------------------ - -.. automodule:: GPy.core.mapping - :members: - :undoc-members: - :show-inheritance: - -GPy.core.model module ---------------------- - -.. automodule:: GPy.core.model - :members: - :undoc-members: - :show-inheritance: - -GPy.core.sparse_gp module -------------------------- - -.. automodule:: GPy.core.sparse_gp - :members: - :undoc-members: - :show-inheritance: - -GPy.core.sparse_gp_mpi module ------------------------------ - -.. automodule:: GPy.core.sparse_gp_mpi - :members: - :undoc-members: - :show-inheritance: - -GPy.core.svgp module --------------------- - -.. automodule:: GPy.core.svgp - :members: - :undoc-members: - :show-inheritance: - -GPy.core.symbolic module ------------------------- - -.. automodule:: GPy.core.symbolic - :members: - :undoc-members: - :show-inheritance: - -GPy.core.verbose_optimization module ------------------------------------- - -.. automodule:: GPy.core.verbose_optimization - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.core - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.examples.rst b/doc/source/GPy.examples.rst deleted file mode 100644 index a2919eab..00000000 --- a/doc/source/GPy.examples.rst +++ /dev/null @@ -1,54 +0,0 @@ -GPy.examples package -==================== - -Submodules ----------- - -GPy.examples.classification module ----------------------------------- - -.. automodule:: GPy.examples.classification - :members: - :undoc-members: - :show-inheritance: - -GPy.examples.coreg_example module ---------------------------------- - -.. automodule:: GPy.examples.coreg_example - :members: - :undoc-members: - :show-inheritance: - -GPy.examples.dimensionality_reduction module --------------------------------------------- - -.. automodule:: GPy.examples.dimensionality_reduction - :members: - :undoc-members: - :show-inheritance: - -GPy.examples.non_gaussian module --------------------------------- - -.. automodule:: GPy.examples.non_gaussian - :members: - :undoc-members: - :show-inheritance: - -GPy.examples.regression module ------------------------------- - -.. automodule:: GPy.examples.regression - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.examples - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.inference.latent_function_inference.rst b/doc/source/GPy.inference.latent_function_inference.rst deleted file mode 100644 index c374e73b..00000000 --- a/doc/source/GPy.inference.latent_function_inference.rst +++ /dev/null @@ -1,102 +0,0 @@ -GPy.inference.latent_function_inference package -=============================================== - -Submodules ----------- - -GPy.inference.latent_function_inference.dtc module --------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.dtc - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.exact_gaussian_inference module ------------------------------------------------------------------------ - -.. automodule:: GPy.inference.latent_function_inference.exact_gaussian_inference - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.expectation_propagation module ----------------------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.expectation_propagation - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.fitc module ---------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.fitc - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.inferenceX module ---------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.inferenceX - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.laplace module ------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.laplace - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.posterior module --------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.posterior - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.svgp module ---------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.svgp - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.var_dtc module ------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.var_dtc - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.var_dtc_parallel module ---------------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.var_dtc_parallel - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.latent_function_inference.var_gauss module --------------------------------------------------------- - -.. automodule:: GPy.inference.latent_function_inference.var_gauss - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.inference.latent_function_inference - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.inference.mcmc.rst b/doc/source/GPy.inference.mcmc.rst deleted file mode 100644 index 273658b7..00000000 --- a/doc/source/GPy.inference.mcmc.rst +++ /dev/null @@ -1,30 +0,0 @@ -GPy.inference.mcmc package -========================== - -Submodules ----------- - -GPy.inference.mcmc.hmc module ------------------------------ - -.. automodule:: GPy.inference.mcmc.hmc - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.mcmc.samplers module ----------------------------------- - -.. automodule:: GPy.inference.mcmc.samplers - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.inference.mcmc - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.inference.optimization.rst b/doc/source/GPy.inference.optimization.rst deleted file mode 100644 index f5f2a930..00000000 --- a/doc/source/GPy.inference.optimization.rst +++ /dev/null @@ -1,54 +0,0 @@ -GPy.inference.optimization package -================================== - -Submodules ----------- - -GPy.inference.optimization.conjugate_gradient_descent module ------------------------------------------------------------- - -.. automodule:: GPy.inference.optimization.conjugate_gradient_descent - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.optimization.gradient_descent_update_rules module ---------------------------------------------------------------- - -.. automodule:: GPy.inference.optimization.gradient_descent_update_rules - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.optimization.optimization module ----------------------------------------------- - -.. automodule:: GPy.inference.optimization.optimization - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.optimization.scg module -------------------------------------- - -.. automodule:: GPy.inference.optimization.scg - :members: - :undoc-members: - :show-inheritance: - -GPy.inference.optimization.stochastics module ---------------------------------------------- - -.. automodule:: GPy.inference.optimization.stochastics - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.inference.optimization - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.inference.rst b/doc/source/GPy.inference.rst deleted file mode 100644 index 235f804b..00000000 --- a/doc/source/GPy.inference.rst +++ /dev/null @@ -1,19 +0,0 @@ -GPy.inference package -===================== - -Subpackages ------------ - -.. toctree:: - - GPy.inference.latent_function_inference - GPy.inference.mcmc - GPy.inference.optimization - -Module contents ---------------- - -.. automodule:: GPy.inference - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.kern.rst b/doc/source/GPy.kern.rst deleted file mode 100644 index bb61443b..00000000 --- a/doc/source/GPy.kern.rst +++ /dev/null @@ -1,17 +0,0 @@ -GPy.kern package -================ - -Subpackages ------------ - -.. toctree:: - - GPy.kern.src - -Module contents ---------------- - -.. automodule:: GPy.kern - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.kern.src.psi_comp.rst b/doc/source/GPy.kern.src.psi_comp.rst deleted file mode 100644 index dfa3c270..00000000 --- a/doc/source/GPy.kern.src.psi_comp.rst +++ /dev/null @@ -1,70 +0,0 @@ -GPy.kern.src.psi_comp package -============================= - -Submodules ----------- - -GPy.kern.src.psi_comp.gaussherm module --------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.gaussherm - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.linear_psi_comp module --------------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.linear_psi_comp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.rbf_psi_comp module ------------------------------------------ - -.. automodule:: GPy.kern.src.psi_comp.rbf_psi_comp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.rbf_psi_gpucomp module --------------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.rbf_psi_gpucomp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.sslinear_psi_comp module ----------------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.sslinear_psi_comp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.ssrbf_psi_comp module -------------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.ssrbf_psi_comp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.psi_comp.ssrbf_psi_gpucomp module ----------------------------------------------- - -.. automodule:: GPy.kern.src.psi_comp.ssrbf_psi_gpucomp - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.kern.src.psi_comp - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.kern.src.rst b/doc/source/GPy.kern.src.rst deleted file mode 100644 index ccbc3f99..00000000 --- a/doc/source/GPy.kern.src.rst +++ /dev/null @@ -1,237 +0,0 @@ -GPy.kern.src package -==================== - -Subpackages ------------ - -.. toctree:: - - GPy.kern.src.psi_comp - -Submodules ----------- - -GPy.kern.src.ODE_UY module --------------------------- - -.. automodule:: GPy.kern.src.ODE_UY - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.ODE_UYC module ---------------------------- - -.. automodule:: GPy.kern.src.ODE_UYC - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.ODE_st module --------------------------- - -.. automodule:: GPy.kern.src.ODE_st - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.ODE_t module -------------------------- - -.. automodule:: GPy.kern.src.ODE_t - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.add module ------------------------ - -.. automodule:: GPy.kern.src.add - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.basis_funcs module -------------------------------- - -.. automodule:: GPy.kern.src.basis_funcs - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.brownian module ----------------------------- - -.. automodule:: GPy.kern.src.brownian - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.coregionalize module ---------------------------------- - -.. automodule:: GPy.kern.src.coregionalize - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.coregionalize_cython module ----------------------------------------- - -.. automodule:: GPy.kern.src.coregionalize_cython - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.eq_ode2 module ---------------------------- - -.. automodule:: GPy.kern.src.eq_ode2 - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.independent_outputs module ---------------------------------------- - -.. automodule:: GPy.kern.src.independent_outputs - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.kern module ------------------------- - -.. automodule:: GPy.kern.src.kern - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.kernel_slice_operations module -------------------------------------------- - -.. automodule:: GPy.kern.src.kernel_slice_operations - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.linear module --------------------------- - -.. automodule:: GPy.kern.src.linear - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.mlp module ------------------------ - -.. automodule:: GPy.kern.src.mlp - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.periodic module ----------------------------- - -.. automodule:: GPy.kern.src.periodic - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.poly module ------------------------- - -.. automodule:: GPy.kern.src.poly - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.prod module ------------------------- - -.. automodule:: GPy.kern.src.prod - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.rbf module ------------------------ - -.. automodule:: GPy.kern.src.rbf - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.spline module --------------------------- - -.. automodule:: GPy.kern.src.spline - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.splitKern module ------------------------------ - -.. automodule:: GPy.kern.src.splitKern - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.standard_periodic module -------------------------------------- - -.. automodule:: GPy.kern.src.standard_periodic - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.static module --------------------------- - -.. automodule:: GPy.kern.src.static - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.stationary module ------------------------------- - -.. automodule:: GPy.kern.src.stationary - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.stationary_cython module -------------------------------------- - -.. automodule:: GPy.kern.src.stationary_cython - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.symbolic module ----------------------------- - -.. automodule:: GPy.kern.src.symbolic - :members: - :undoc-members: - :show-inheritance: - -GPy.kern.src.trunclinear module -------------------------------- - -.. automodule:: GPy.kern.src.trunclinear - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.kern.src - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.likelihoods.rst b/doc/source/GPy.likelihoods.rst deleted file mode 100644 index 15d1952b..00000000 --- a/doc/source/GPy.likelihoods.rst +++ /dev/null @@ -1,94 +0,0 @@ -GPy.likelihoods package -======================= - -Submodules ----------- - -GPy.likelihoods.bernoulli module --------------------------------- - -.. automodule:: GPy.likelihoods.bernoulli - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.binomial module -------------------------------- - -.. automodule:: GPy.likelihoods.binomial - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.exponential module ----------------------------------- - -.. automodule:: GPy.likelihoods.exponential - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.gamma module ----------------------------- - -.. automodule:: GPy.likelihoods.gamma - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.gaussian module -------------------------------- - -.. automodule:: GPy.likelihoods.gaussian - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.likelihood module ---------------------------------- - -.. automodule:: GPy.likelihoods.likelihood - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.link_functions module -------------------------------------- - -.. automodule:: GPy.likelihoods.link_functions - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.mixed_noise module ----------------------------------- - -.. automodule:: GPy.likelihoods.mixed_noise - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.poisson module ------------------------------- - -.. automodule:: GPy.likelihoods.poisson - :members: - :undoc-members: - :show-inheritance: - -GPy.likelihoods.student_t module --------------------------------- - -.. automodule:: GPy.likelihoods.student_t - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.likelihoods - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.mappings.rst b/doc/source/GPy.mappings.rst deleted file mode 100644 index dad16d34..00000000 --- a/doc/source/GPy.mappings.rst +++ /dev/null @@ -1,78 +0,0 @@ -GPy.mappings package -==================== - -Submodules ----------- - -GPy.mappings.additive module ----------------------------- - -.. automodule:: GPy.mappings.additive - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.compound module ----------------------------- - -.. automodule:: GPy.mappings.compound - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.constant module ----------------------------- - -.. automodule:: GPy.mappings.constant - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.identity module ----------------------------- - -.. automodule:: GPy.mappings.identity - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.kernel module --------------------------- - -.. automodule:: GPy.mappings.kernel - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.linear module --------------------------- - -.. automodule:: GPy.mappings.linear - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.mlp module ------------------------ - -.. automodule:: GPy.mappings.mlp - :members: - :undoc-members: - :show-inheritance: - -GPy.mappings.piecewise_linear module ------------------------------------- - -.. automodule:: GPy.mappings.piecewise_linear - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.mappings - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.models.rst b/doc/source/GPy.models.rst deleted file mode 100644 index e65b4fb0..00000000 --- a/doc/source/GPy.models.rst +++ /dev/null @@ -1,198 +0,0 @@ -GPy.models package -================== - -Submodules ----------- - -GPy.models.bayesian_gplvm module --------------------------------- - -.. automodule:: GPy.models.bayesian_gplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.bayesian_gplvm_minibatch module ------------------------------------------- - -.. automodule:: GPy.models.bayesian_gplvm_minibatch - :members: - :undoc-members: - :show-inheritance: - -GPy.models.bcgplvm module -------------------------- - -.. automodule:: GPy.models.bcgplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.dpgplvm module -------------------------- - -.. automodule:: GPy.models.dpgplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_classification module ------------------------------------ - -.. automodule:: GPy.models.gp_classification - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_coregionalized_regression module ----------------------------------------------- - -.. automodule:: GPy.models.gp_coregionalized_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_heteroscedastic_regression module ------------------------------------------------ - -.. automodule:: GPy.models.gp_heteroscedastic_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_kronecker_gaussian_regression module --------------------------------------------------- - -.. automodule:: GPy.models.gp_kronecker_gaussian_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_regression module -------------------------------- - -.. automodule:: GPy.models.gp_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gp_var_gauss module ------------------------------- - -.. automodule:: GPy.models.gp_var_gauss - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gplvm module ------------------------ - -.. automodule:: GPy.models.gplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.gradient_checker module ----------------------------------- - -.. automodule:: GPy.models.gradient_checker - :members: - :undoc-members: - :show-inheritance: - -GPy.models.mrd module ---------------------- - -.. automodule:: GPy.models.mrd - :members: - :undoc-members: - :show-inheritance: - -GPy.models.one_vs_all_classification module -------------------------------------------- - -.. automodule:: GPy.models.one_vs_all_classification - :members: - :undoc-members: - :show-inheritance: - -GPy.models.one_vs_all_sparse_classification module --------------------------------------------------- - -.. automodule:: GPy.models.one_vs_all_sparse_classification - :members: - :undoc-members: - :show-inheritance: - -GPy.models.sparse_gp_classification module ------------------------------------------- - -.. automodule:: GPy.models.sparse_gp_classification - :members: - :undoc-members: - :show-inheritance: - -GPy.models.sparse_gp_coregionalized_regression module ------------------------------------------------------ - -.. automodule:: GPy.models.sparse_gp_coregionalized_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.sparse_gp_minibatch module -------------------------------------- - -.. automodule:: GPy.models.sparse_gp_minibatch - :members: - :undoc-members: - :show-inheritance: - -GPy.models.sparse_gp_regression module --------------------------------------- - -.. automodule:: GPy.models.sparse_gp_regression - :members: - :undoc-members: - :show-inheritance: - -GPy.models.sparse_gplvm module ------------------------------- - -.. automodule:: GPy.models.sparse_gplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.ss_gplvm module --------------------------- - -.. automodule:: GPy.models.ss_gplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.models.ss_mrd module ------------------------- - -.. automodule:: GPy.models.ss_mrd - :members: - :undoc-members: - :show-inheritance: - -GPy.models.warped_gp module ---------------------------- - -.. automodule:: GPy.models.warped_gp - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.models - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.plotting.gpy_plot.rst b/doc/source/GPy.plotting.gpy_plot.rst deleted file mode 100644 index 8391cd3a..00000000 --- a/doc/source/GPy.plotting.gpy_plot.rst +++ /dev/null @@ -1,62 +0,0 @@ -GPy.plotting.gpy_plot package -============================= - -Submodules ----------- - -GPy.plotting.gpy_plot.data_plots module ---------------------------------------- - -.. automodule:: GPy.plotting.gpy_plot.data_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.gpy_plot.gp_plots module -------------------------------------- - -.. automodule:: GPy.plotting.gpy_plot.gp_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.gpy_plot.inference_plots module --------------------------------------------- - -.. automodule:: GPy.plotting.gpy_plot.inference_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.gpy_plot.kernel_plots module ------------------------------------------ - -.. automodule:: GPy.plotting.gpy_plot.kernel_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.gpy_plot.latent_plots module ------------------------------------------ - -.. automodule:: GPy.plotting.gpy_plot.latent_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.gpy_plot.plot_util module --------------------------------------- - -.. automodule:: GPy.plotting.gpy_plot.plot_util - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.plotting.gpy_plot - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.plotting.matplot_dep.controllers.rst b/doc/source/GPy.plotting.matplot_dep.controllers.rst deleted file mode 100644 index 239f8e79..00000000 --- a/doc/source/GPy.plotting.matplot_dep.controllers.rst +++ /dev/null @@ -1,30 +0,0 @@ -GPy.plotting.matplot_dep.controllers package -============================================ - -Submodules ----------- - -GPy.plotting.matplot_dep.controllers.axis_event_controller module ------------------------------------------------------------------ - -.. automodule:: GPy.plotting.matplot_dep.controllers.axis_event_controller - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.controllers.imshow_controller module -------------------------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.controllers.imshow_controller - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.plotting.matplot_dep.controllers - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.plotting.matplot_dep.rst b/doc/source/GPy.plotting.matplot_dep.rst deleted file mode 100644 index 9521d9e6..00000000 --- a/doc/source/GPy.plotting.matplot_dep.rst +++ /dev/null @@ -1,117 +0,0 @@ -GPy.plotting.matplot_dep package -================================ - -Subpackages ------------ - -.. toctree:: - - GPy.plotting.matplot_dep.controllers - -Submodules ----------- - -GPy.plotting.matplot_dep.defaults module ----------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.defaults - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.img_plots module ------------------------------------------ - -.. automodule:: GPy.plotting.matplot_dep.img_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.kernel_plots module --------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.kernel_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.mapping_plots module ---------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.mapping_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.maps module ------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.maps - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.plot_definitions module ------------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.plot_definitions - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.priors_plots module --------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.priors_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.ssgplvm module ---------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.ssgplvm - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.svig_plots module ------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.svig_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.util module ------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.util - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.variational_plots module -------------------------------------------------- - -.. automodule:: GPy.plotting.matplot_dep.variational_plots - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.matplot_dep.visualize module ------------------------------------------ - -.. automodule:: GPy.plotting.matplot_dep.visualize - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.plotting.matplot_dep - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.plotting.plotly_dep.rst b/doc/source/GPy.plotting.plotly_dep.rst deleted file mode 100644 index 52642e49..00000000 --- a/doc/source/GPy.plotting.plotly_dep.rst +++ /dev/null @@ -1,30 +0,0 @@ -GPy.plotting.plotly_dep package -=============================== - -Submodules ----------- - -GPy.plotting.plotly_dep.defaults module ---------------------------------------- - -.. automodule:: GPy.plotting.plotly_dep.defaults - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.plotly_dep.plot_definitions module ------------------------------------------------ - -.. automodule:: GPy.plotting.plotly_dep.plot_definitions - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.plotting.plotly_dep - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.plotting.rst b/doc/source/GPy.plotting.rst deleted file mode 100644 index 33c39c93..00000000 --- a/doc/source/GPy.plotting.rst +++ /dev/null @@ -1,39 +0,0 @@ -GPy.plotting package -==================== - -Subpackages ------------ - -.. toctree:: - - GPy.plotting.gpy_plot - GPy.plotting.matplot_dep - GPy.plotting.plotly_dep - -Submodules ----------- - -GPy.plotting.Tango module -------------------------- - -.. automodule:: GPy.plotting.Tango - :members: - :undoc-members: - :show-inheritance: - -GPy.plotting.abstract_plotting_library module ---------------------------------------------- - -.. automodule:: GPy.plotting.abstract_plotting_library - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.plotting - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.rst b/doc/source/GPy.rst deleted file mode 100644 index 9be6dbec..00000000 --- a/doc/source/GPy.rst +++ /dev/null @@ -1,26 +0,0 @@ -GPy package -=========== - -Subpackages ------------ - -.. toctree:: - - GPy.core - GPy.examples - GPy.inference - GPy.kern - GPy.likelihoods - GPy.mappings - GPy.models - GPy.plotting - GPy.testing - GPy.util - -Module contents ---------------- - -.. automodule:: GPy - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.testing.rst b/doc/source/GPy.testing.rst deleted file mode 100644 index a10c3d18..00000000 --- a/doc/source/GPy.testing.rst +++ /dev/null @@ -1,206 +0,0 @@ -GPy.testing package -=================== - -Submodules ----------- - -GPy.testing.bgplvm_minibatch_tests module ------------------------------------------ - -.. automodule:: GPy.testing.bgplvm_minibatch_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.cacher_tests module -------------------------------- - -.. automodule:: GPy.testing.cacher_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.cython_tests module -------------------------------- - -.. automodule:: GPy.testing.cython_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.examples_tests module ---------------------------------- - -.. automodule:: GPy.testing.examples_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.fitc module ------------------------ - -.. automodule:: GPy.testing.fitc - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.gp_tests module ---------------------------- - -.. automodule:: GPy.testing.gp_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.index_operations_tests module ------------------------------------------ - -.. automodule:: GPy.testing.index_operations_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.inference_tests module ----------------------------------- - -.. automodule:: GPy.testing.inference_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.kernel_tests module -------------------------------- - -.. automodule:: GPy.testing.kernel_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.likelihood_tests module ------------------------------------ - -.. automodule:: GPy.testing.likelihood_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.linalg_test module ------------------------------- - -.. automodule:: GPy.testing.linalg_test - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.link_function_tests module --------------------------------------- - -.. automodule:: GPy.testing.link_function_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.mapping_tests module --------------------------------- - -.. automodule:: GPy.testing.mapping_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.meanfunc_tests module ---------------------------------- - -.. automodule:: GPy.testing.meanfunc_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.misc_tests module ------------------------------ - -.. automodule:: GPy.testing.misc_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.model_tests module ------------------------------- - -.. automodule:: GPy.testing.model_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.mpi_tests module ----------------------------- - -.. automodule:: GPy.testing.mpi_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.observable_tests module ------------------------------------ - -.. automodule:: GPy.testing.observable_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.parameterized_tests module --------------------------------------- - -.. automodule:: GPy.testing.parameterized_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.pickle_tests module -------------------------------- - -.. automodule:: GPy.testing.pickle_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.plotting_tests module ---------------------------------- - -.. automodule:: GPy.testing.plotting_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.prior_tests module ------------------------------- - -.. automodule:: GPy.testing.prior_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.rv_transformation_tests module ------------------------------------------- - -.. automodule:: GPy.testing.rv_transformation_tests - :members: - :undoc-members: - :show-inheritance: - -GPy.testing.svgp_tests module ------------------------------ - -.. automodule:: GPy.testing.svgp_tests - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.testing - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/GPy.util.rst b/doc/source/GPy.util.rst deleted file mode 100644 index 354a3cce..00000000 --- a/doc/source/GPy.util.rst +++ /dev/null @@ -1,238 +0,0 @@ -GPy.util package -================ - -Submodules ----------- - -GPy.util.block_matrices module ------------------------------- - -.. automodule:: GPy.util.block_matrices - :members: - :undoc-members: - :show-inheritance: - -GPy.util.caching module ------------------------ - -.. automodule:: GPy.util.caching - :members: - :undoc-members: - :show-inheritance: - -GPy.util.choleskies module --------------------------- - -.. automodule:: GPy.util.choleskies - :members: - :undoc-members: - :show-inheritance: - -GPy.util.choleskies_cython module ---------------------------------- - -.. automodule:: GPy.util.choleskies_cython - :members: - :undoc-members: - :show-inheritance: - -GPy.util.classification module ------------------------------- - -.. automodule:: GPy.util.classification - :members: - :undoc-members: - :show-inheritance: - -GPy.util.config module ----------------------- - -.. automodule:: GPy.util.config - :members: - :undoc-members: - :show-inheritance: - -GPy.util.datasets module ------------------------- - -.. automodule:: GPy.util.datasets - :members: - :undoc-members: - :show-inheritance: - -GPy.util.debug module ---------------------- - -.. automodule:: GPy.util.debug - :members: - :undoc-members: - :show-inheritance: - -GPy.util.decorators module --------------------------- - -.. automodule:: GPy.util.decorators - :members: - :undoc-members: - :show-inheritance: - -GPy.util.diag module --------------------- - -.. automodule:: GPy.util.diag - :members: - :undoc-members: - :show-inheritance: - -GPy.util.functions module -------------------------- - -.. automodule:: GPy.util.functions - :members: - :undoc-members: - :show-inheritance: - -GPy.util.gpu_init module ------------------------- - -.. automodule:: GPy.util.gpu_init - :members: - :undoc-members: - :show-inheritance: - -GPy.util.initialization module ------------------------------- - -.. automodule:: GPy.util.initialization - :members: - :undoc-members: - :show-inheritance: - -GPy.util.linalg module ----------------------- - -.. automodule:: GPy.util.linalg - :members: - :undoc-members: - :show-inheritance: - -GPy.util.linalg_cython module ------------------------------ - -.. automodule:: GPy.util.linalg_cython - :members: - :undoc-members: - :show-inheritance: - -GPy.util.linalg_gpu module --------------------------- - -.. automodule:: GPy.util.linalg_gpu - :members: - :undoc-members: - :show-inheritance: - -GPy.util.ln_diff_erfs module ----------------------------- - -.. automodule:: GPy.util.ln_diff_erfs - :members: - :undoc-members: - :show-inheritance: - -GPy.util.misc module --------------------- - -.. automodule:: GPy.util.misc - :members: - :undoc-members: - :show-inheritance: - -GPy.util.mocap module ---------------------- - -.. automodule:: GPy.util.mocap - :members: - :undoc-members: - :show-inheritance: - -GPy.util.multioutput module ---------------------------- - -.. automodule:: GPy.util.multioutput - :members: - :undoc-members: - :show-inheritance: - -GPy.util.netpbmfile module --------------------------- - -.. automodule:: GPy.util.netpbmfile - :members: - :undoc-members: - :show-inheritance: - -GPy.util.normalizer module --------------------------- - -.. automodule:: GPy.util.normalizer - :members: - :undoc-members: - :show-inheritance: - -GPy.util.parallel module ------------------------- - -.. automodule:: GPy.util.parallel - :members: - :undoc-members: - :show-inheritance: - -GPy.util.pca module -------------------- - -.. automodule:: GPy.util.pca - :members: - :undoc-members: - :show-inheritance: - -GPy.util.squashers module -------------------------- - -.. automodule:: GPy.util.squashers - :members: - :undoc-members: - :show-inheritance: - -GPy.util.subarray_and_sorting module ------------------------------------- - -.. automodule:: GPy.util.subarray_and_sorting - :members: - :undoc-members: - :show-inheritance: - -GPy.util.univariate_Gaussian module ------------------------------------ - -.. automodule:: GPy.util.univariate_Gaussian - :members: - :undoc-members: - :show-inheritance: - -GPy.util.warping_functions module ---------------------------------- - -.. automodule:: GPy.util.warping_functions - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: GPy.util - :members: - :undoc-members: - :show-inheritance: From 9d74f9a9cdf84ec34dc488683f78999e51e3d704 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 08:28:57 +0100 Subject: [PATCH 15/19] [rtfd] weirdness --- doc/source/requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index dd3ba36f..4d5b3cbd 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1 +1,3 @@ +numpy +scipy paramz \ No newline at end of file From f6ba5d3c0f34b85c396746ddebc3016b3df2a4d5 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 09:04:56 +0100 Subject: [PATCH 16/19] [rtfd] removeing rtfd support IT DOES NOT WORK, using travis to upload to pypi instead --- README.md | 4 ++-- doc/source/conf.py | 2 +- doc/source/requirements.txt | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c81ef5da..21b19c6b 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ The Gaussian processes framework in Python. * GPy [homepage](http://sheffieldml.github.io/GPy/) * Tutorial [notebooks](http://nbviewer.ipython.org/github/SheffieldML/notebook/blob/master/GPy/index.ipynb) * User [mailing-list](https://lists.shef.ac.uk/sympa/subscribe/gpy-users) -* Developer [documentation](http://gpy.readthedocs.org/en/devel/) +* Developer [documentation](http://pythonhosted.org/GPy/) * Travis-CI [unit-tests](https://travis-ci.org/SheffieldML/GPy) * [![licence](https://img.shields.io/badge/licence-BSD-blue.svg)](http://opensource.org/licenses/BSD-3-Clause) -[![develstat](https://travis-ci.org/SheffieldML/GPy.svg?branch=devel)](https://travis-ci.org/SheffieldML/GPy) [![covdevel](http://codecov.io/github/SheffieldML/GPy/coverage.svg?branch=devel)](http://codecov.io/github/SheffieldML/GPy?branch=devel) [![docdevel](https://readthedocs.org/projects/gpy/badge/?version=devel)](http://gpy.readthedocs.org/en/devel/) [![Research software impact](http://depsy.org/api/package/pypi/GPy/badge.svg)](http://depsy.org/package/python/GPy) +[![develstat](https://travis-ci.org/SheffieldML/GPy.svg?branch=devel)](https://travis-ci.org/SheffieldML/GPy) [![covdevel](http://codecov.io/github/SheffieldML/GPy/coverage.svg?branch=devel)](http://codecov.io/github/SheffieldML/GPy?branch=devel) [![Research software impact](http://depsy.org/api/package/pypi/GPy/badge.svg)](http://depsy.org/package/python/GPy) ## Updated Structure diff --git a/doc/source/conf.py b/doc/source/conf.py index d489c7a9..92855e1b 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -77,7 +77,7 @@ extensions = [ # def __getattr__(cls, name): # return Mock() # -MOCK_MODULES = ['scipy.linalg.blas', 'blas', 'scipy.optimize', 'scipy.optimize.linesearch', 'scipy.linalg', +MOCK_MODULES = ['numpy', 'scipy.linalg.blas', 'blas', 'scipy.optimize', 'scipy.optimize.linesearch', 'scipy.linalg', 'scipy', 'scipy.special', 'scipy.integrate', 'scipy.io', 'scipy.stats', 'sympy', 'sympy.utilities.iterables', 'sympy.utilities.lambdify', 'sympy.utilities', 'sympy.utilities.codegen', 'sympy.core.cache', diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index 4d5b3cbd..dd3ba36f 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1,3 +1 @@ -numpy -scipy paramz \ No newline at end of file From 8358645e3764379a2b41e3d1e68f90bc3bc598a7 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 09:47:08 +0100 Subject: [PATCH 17/19] [rtd] last removal of rtd --- doc/source/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 92855e1b..1f9c98b6 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -77,12 +77,13 @@ extensions = [ # def __getattr__(cls, name): # return Mock() # -MOCK_MODULES = ['numpy', 'scipy.linalg.blas', 'blas', 'scipy.optimize', 'scipy.optimize.linesearch', 'scipy.linalg', +MOCK_MODULES = ['scipy.linalg.blas', 'blas', 'scipy.optimize', 'scipy.optimize.linesearch', 'scipy.linalg', 'scipy', 'scipy.special', 'scipy.integrate', 'scipy.io', 'scipy.stats', 'sympy', 'sympy.utilities.iterables', 'sympy.utilities.lambdify', 'sympy.utilities', 'sympy.utilities.codegen', 'sympy.core.cache', 'sympy.core', 'sympy.parsing', 'sympy.parsing.sympy_parser', - 'nose', 'nose.tools'] + 'nose', 'nose.tools' + ] autodoc_mock_imports = MOCK_MODULES # From 86457baeebb01f2022a78f31f88adf637c77b065 Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 09:49:43 +0100 Subject: [PATCH 18/19] =?UTF-8?q?Bump=20version:=201.0.4=20=E2=86=92=201.0?= =?UTF-8?q?.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GPy/__version__.py | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GPy/__version__.py b/GPy/__version__.py index 92192eed..68cdeee4 100644 --- a/GPy/__version__.py +++ b/GPy/__version__.py @@ -1 +1 @@ -__version__ = "1.0.4" +__version__ = "1.0.5" diff --git a/setup.cfg b/setup.cfg index bf387efe..b38dbc60 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.0.4 +current_version = 1.0.5 tag = False commit = True From 4ee3799773c301900eba82e0a9d838eee28af6fd Mon Sep 17 00:00:00 2001 From: Max Zwiessele Date: Fri, 8 Apr 2016 11:38:46 +0100 Subject: [PATCH 19/19] [config] softfail when config cannot be written --- setup.py | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/setup.py b/setup.py index e1c5e23d..17205504 100644 --- a/setup.py +++ b/setup.py @@ -176,23 +176,26 @@ home = os.getenv('HOME') or os.getenv('USERPROFILE') user_file = os.path.join(home,'.config', 'GPy', 'user.cfg') print("") -if not os.path.exists(user_file): - # Does an old config exist? - old_user_file = os.path.join(home,'.gpy_user.cfg') - if os.path.exists(old_user_file): - # Move it to new location: - print("GPy: Found old config file, moving to new location {}".format(user_file)) - if not os.path.exists(os.path.dirname(user_file)): - os.makedirs(os.path.dirname(user_file)) - os.rename(old_user_file, user_file) +try: + if not os.path.exists(user_file): + # Does an old config exist? + old_user_file = os.path.join(home,'.gpy_user.cfg') + if os.path.exists(old_user_file): + # Move it to new location: + print("GPy: Found old config file, moving to new location {}".format(user_file)) + if not os.path.exists(os.path.dirname(user_file)): + os.makedirs(os.path.dirname(user_file)) + os.rename(old_user_file, user_file) + else: + # No config file exists, save informative stub to user config folder: + print("GPy: Saving user configuration file to {}".format(user_file)) + if not os.path.exists(os.path.dirname(user_file)): + os.makedirs(os.path.dirname(user_file)) + with open(user_file, 'w') as f: + with open(local_file, 'r') as l: + tmp = l.read() + f.write(tmp) else: - # No config file exists, save informative stub to user config folder: - print("GPy: Saving user configuration file to {}".format(user_file)) - if not os.path.exists(os.path.dirname(user_file)): - os.makedirs(os.path.dirname(user_file)) - with open(user_file, 'w') as f: - with open(local_file, 'r') as l: - tmp = l.read() - f.write(tmp) -else: - print("GPy: User configuration file at location {}".format(user_file)) + print("GPy: User configuration file at location {}".format(user_file)) +except: + print("GPy: Could not write user configuration file {}".format(user_file)) \ No newline at end of file