edited coregionalize implementation

This commit is contained in:
James Hensman 2014-09-30 16:44:55 +01:00
parent 9081c8ee96
commit f4718edfb8
2 changed files with 37 additions and 39 deletions

View file

@ -62,7 +62,7 @@ class Coregionalize(Kern):
return self._K_weave(X, X2)
except:
print "\n Weave compilation failed. Falling back to (slower) numpy implementation\n"
config.set('weave', 'working', False)
config.set('weave', 'working', 'False')
return self._K_numpy(X, X2)
else:
return self._K_numpy(X, X2)
@ -121,13 +121,13 @@ class Coregionalize(Kern):
#attempt to use weave for a nasty double indexing loop: fall back to numpy
if config.getboolean('weave', 'working'):
try:
dL_dK_small = self._gradient_reduce_weave(dL_dK, index1, index2)
dL_dK_small = self._gradient_reduce_weave(dL_dK, index, index2)
except:
print "\n Weave compilation failed. Falling back to (slower) numpy implementation\n"
config.set('weave', 'working', False)
dL_dK_small = self._gradient_reduce_weave(dL_dK, index1, index2)
config.set('weave', 'working', 'False')
dL_dK_small = self._gradient_reduce_weave(dL_dK, index, index2)
else:
dL_dK_small = self._gradient_reduce_weave(dL_dK, index1, index2)
dL_dK_small = self._gradient_reduce_weave(dL_dK, index, index2)
@ -150,19 +150,16 @@ class Coregionalize(Kern):
N, num_inducing, output_dim = index.size, index2.size, self.output_dim
weave.inline(code, ['N', 'num_inducing', 'output_dim', 'dL_dK', 'dL_dK_small', 'index', 'index2'])
return dL_dK_small
1
def _gradient_reduce_numpy(self, dL_dK, index, index2):
index, index2 = index[:,0], index2[:,0]
for i in range(k.output_dim):
dL_dK_small = np.zeros_like(self.B)
for i in range(k.output_dim):
tmp1 = dL_dK[index==i]
for j in range(k.output_dim):
dL_dK_small[j,i] = tmp1[:,index2==j].sum()
return dL_dK_small
def update_gradients_diag(self, dL_dKdiag, X):
index = np.asarray(X, dtype=np.int).flatten()
dL_dKdiag_small = np.array([dL_dKdiag[index==i].sum() for i in xrange(self.output_dim)])

View file

@ -360,43 +360,44 @@ class Coregionalize_weave_test(unittest.TestCase):
"""
Make sure that the coregionalize kernel work with and without weave enabled
"""
k = GPy.kern.coregionalize(1, output_dim=12)
N1, N2 = 100, 200
X = np.random.randint(0,12,(N1,1))
X2 = np.random.randint(0,12,(N2,1))
def setUp(self):
self.k = GPy.kern.Coregionalize(1, output_dim=12)
self.N1, self.N2 = 100, 200
self.X = np.random.randint(0,12,(self.N1,1))
self.X2 = np.random.randint(0,12,(self.N2,1))
#symmetric case
dL_dK = np.random.randn(N1, N1)
GPy.util.config.config.set('weave', 'working', True)
K_weave = k.K(X)
k.update_gradients_full(dL_dK, X)
grads_weave = k.gradient.copy()
def test_sym(self):
dL_dK = np.random.randn(self.N1, self.N1)
GPy.util.config.config.set('weave', 'working', 'True')
K_weave = self.k.K(self.X)
self.k.update_gradients_full(dL_dK, self.X)
grads_weave = self.k.gradient.copy()
GPy.util.config.config.set('weave', 'working', False)
K_numpy = k.K(X)
k.update_gradients_full(dL_dK, X)
grads_numpy = k.gradient.copy()
GPy.util.config.config.set('weave', 'working', 'False')
K_numpy = self.k.K(self.X)
self.k.update_gradients_full(dL_dK, self.X)
grads_numpy = self.k.gradient.copy()
self.assertTrue(np.allclose(K_numpy, K_weave))
self.assertTrue(np.allclose(grads_numpy, grads_weave))
self.assertTrue(np.allclose(K_numpy, K_weave))
self.assertTrue(np.allclose(grads_numpy, grads_weave))
#non-symmetric case
dL_dK = np.random.randn(N1, N2)
GPy.util.config.config.set('weave', 'working', True)
K_weave = k.K(X, X2)
k.update_gradients_full(dL_dK, X, X2)
grads_weave = k.gradient.copy()
def test_nonsym(self):
dL_dK = np.random.randn(self.N1, self.N2)
GPy.util.config.config.set('weave', 'working', 'True')
K_weave = self.k.K(self.X, self.X2)
self.k.update_gradients_full(dL_dK, self.X, self.X2)
grads_weave = self.k.gradient.copy()
GPy.util.config.config.set('weave', 'working', False)
K_numpy = k.K(X, X2)
k.update_gradients_full(dL_dK, X, X2)
grads_numpy = k.gradient.copy()
GPy.util.config.config.set('weave', 'working', 'False')
K_numpy = self.k.K(self.X, self.X2)
self.k.update_gradients_full(dL_dK, self.X, self.X2)
grads_numpy = self.k.gradient.copy()
self.assertTrue(np.allclose(K_numpy, K_weave))
self.assertTrue(np.allclose(grads_numpy, grads_weave))
self.assertTrue(np.allclose(K_numpy, K_weave))
self.assertTrue(np.allclose(grads_numpy, grads_weave))
#reset the weave state for any other tests
GPy.util.config.config.set('weave', 'working', False)
GPy.util.config.config.set('weave', 'working', 'False')