From 780cf856875990b44e1d1cb1df3d62272dfb5952 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Tue, 28 Apr 2015 07:40:09 +0100 Subject: [PATCH] modifiying stationary.py --- GPy/kern/_src/stationary.py | 119 +++++++----------------------------- 1 file changed, 21 insertions(+), 98 deletions(-) diff --git a/GPy/kern/_src/stationary.py b/GPy/kern/_src/stationary.py index 7dab68a0..f75be3c2 100644 --- a/GPy/kern/_src/stationary.py +++ b/GPy/kern/_src/stationary.py @@ -9,14 +9,15 @@ from ...util.linalg import tdot from ... import util import numpy as np from scipy import integrate -from ...util.config import config # for assesing whether to use weave +from ...util.config import config # for assesing whether to use cython from ...util.caching import Cache_this -import stationary_cython try: - from scipy import weave + import stationary_cython except ImportError: - config.set('weave', 'working', 'False') + print('warning: failed to import cython module: falling back to numpy') + config.set('cython', 'working', 'false') + class Stationary(Kern): """ @@ -159,21 +160,11 @@ class Stationary(Kern): #now the lengthscale gradient(s) dL_dr = self.dK_dr_via_X(X, X2) * dL_dK if self.ARD: - #rinv = self._inv_dis# this is rather high memory? Should we loop instead?t(X, X2) - #d = X[:, None, :] - X2[None, :, :] - #x_xl3 = np.square(d) - #self.lengthscale.gradient = -((dL_dr*rinv)[:,:,None]*x_xl3).sum(0).sum(0)/self.lengthscale**3 + tmp = dL_dr*self._inv_dist(X, X2) if X2 is None: X2 = X - - - if config.getboolean('weave', 'working'): - try: - self.lengthscale.gradient = self.weave_lengthscale_grads(tmp, X, X2) - except: - print("\n Weave compilation failed. Falling back to (slower) numpy implementation\n") - config.set('weave', 'working', 'False') - self.lengthscale.gradient = np.array([np.einsum('ij,ij,...', tmp, np.square(X[:,q:q+1] - X2[:,q:q+1].T), -1./self.lengthscale[q]**3) for q in range(self.input_dim)]) + if config.getboolean('cython', 'working'): + self.lengthscale.gradient = self._lengthscale_grads_cython(tmp, X, X2) else: self.lengthscale.gradient = np.array([np.einsum('ij,ij,...', tmp, np.square(X[:,q:q+1] - X2[:,q:q+1].T), -1./self.lengthscale[q]**3) for q in range(self.input_dim)]) else: @@ -190,29 +181,7 @@ class Stationary(Kern): dist = self._scaled_dist(X, X2).copy() return 1./np.where(dist != 0., dist, np.inf) - def weave_lengthscale_grads(self, tmp, X, X2): - """Use scipy.weave to compute derivatives wrt the lengthscales""" - N,M = tmp.shape - Q = X.shape[1] - if hasattr(X, 'values'):X = X.values - if hasattr(X2, 'values'):X2 = X2.values - grads = np.zeros(self.input_dim) - code = """ - double gradq; - for(int q=0; q - #include - """ - weave_options = {'headers' : [''], - 'extra_compile_args': ['-fopenmp -O3'], # -march=native'], - 'extra_link_args' : ['-lgomp']} - weave.inline(code, ['ret', 'N', 'D', 'M', 'tmp', 'X', 'X2'], type_converters=weave.converters.blitz, support_code=support_code, **weave_options) - return ret/self.lengthscale**2 - def gradients_X_diag(self, dL_dKdiag, X): return np.zeros(X.shape) def input_sensitivity(self, summarize=True): return self.variance*np.ones(self.input_dim)/self.lengthscale**2 + + + class Exponential(Stationary): def __init__(self, input_dim, variance=1., lengthscale=None, ARD=False, active_dims=None, name='Exponential'): super(Exponential, self).__init__(input_dim, variance, lengthscale, ARD, active_dims, name)