From 54272d22bb88d8cc741105597409352fd4c9928a Mon Sep 17 00:00:00 2001 From: James Hensman Date: Thu, 6 Feb 2014 12:33:00 +0000 Subject: [PATCH] first crack at a caching object --- GPy/core/parameterization/array_core.py | 4 ++ GPy/core/parameterization/parameter_core.py | 3 +- GPy/kern/parts/prod.py | 41 ++++++++------------- GPy/util/__init__.py | 1 + 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/GPy/core/parameterization/array_core.py b/GPy/core/parameterization/array_core.py index 12c68bb6..4c31f23b 100644 --- a/GPy/core/parameterization/array_core.py +++ b/GPy/core/parameterization/array_core.py @@ -50,3 +50,7 @@ class ObservableArray(ListArray, Observable): return self.__getitem__(slice(start, stop)) def __setslice__(self, start, stop, val): return self.__setitem__(slice(start, stop), val) + def __copy__(self, *args): + return ObservableArray(self.base.base.copy(*args)) + def copy(self, *args): + return self.__copy__(*args) diff --git a/GPy/core/parameterization/parameter_core.py b/GPy/core/parameterization/parameter_core.py index d63c6ea8..a826b10c 100644 --- a/GPy/core/parameterization/parameter_core.py +++ b/GPy/core/parameterization/parameter_core.py @@ -14,11 +14,12 @@ class Observable(object): _observers_ = {} def add_observer(self, observer, callble): self._observers_[observer] = callble - callble(self) + #callble(self) def remove_observer(self, observer): del self._observers_[observer] def _notify_observers(self): [callble(self) for callble in self._observers_.itervalues()] + class Pickleable(object): def _getstate(self): diff --git a/GPy/kern/parts/prod.py b/GPy/kern/parts/prod.py index 2569c51c..62eed2aa 100644 --- a/GPy/kern/parts/prod.py +++ b/GPy/kern/parts/prod.py @@ -19,36 +19,21 @@ class Prod(Kernpart): """ def __init__(self,k1,k2,tensor=False): if tensor: - super(Prod, self).__init__(k1.input_dim + k2.input_dim, '['+k1.name + '**' + k2.name +']') + super(Prod, self).__init__(k1.input_dim + k2.input_dim, k1.name + '_xx_' + k2.name) + self.slice1 = slice(0,k1.input_dim) + self.slice2 = slice(k1.input_dim,k1.input_dim+k2.input_dim) else: - assert k1.input_dim == k2.input_dim, "Error: The input spaces of the kernels to sum don't have the same dimension." - super(Prod, self).__init__(k1.input_dim, '['+k1.name + '*' + k2.name +']') - #self.num_params = k1.num_params + k2.num_params + assert k1.input_dim == k2.input_dim, "Error: The input spaces of the kernels to multiply don't have the same dimension." + super(Prod, self).__init__(k1.input_dim, k1.name + '_x_' + k2.name) + self.slice1 = slice(0,self.input_dim) + self.slice2 = slice(0,self.input_dim) self.k1 = k1 self.k2 = k2 -# if tensor: -# self.slice1 = slice(0,self.k1.input_dim) -# self.slice2 = slice(self.k1.input_dim,self.k1.input_dim+self.k2.input_dim) -# else: -# self.slice1 = slice(0,self.input_dim) -# self.slice2 = slice(0,self.input_dim) - - self._X, self._X2 = np.empty(shape=(2,1)) self.add_parameters(self.k1, self.k2) -# self._set_params(np.hstack((k1._get_params(),k2._get_params()))) -# def _get_params(self): -# """return the value of the parameters.""" -# return np.hstack((self.k1._get_params(), self.k2._get_params())) -# -# def _set_params(self,x): -# """set the value of the parameters.""" -# self.k1._set_params(x[:self.k1.num_params]) -# self.k2._set_params(x[self.k1.num_params:]) -# -# def _get_param_names(self): -# """return parameter names.""" -# return [self.k1.name + '_' + param_name for param_name in self.k1._get_param_names()] + [self.k2.name + '_' + param_name for param_name in self.k2._get_param_names()] + #initialize cache + self._X, self._X2 = np.empty(shape=(2,1)) + self._params = None def K(self,X,X2,target): self._K_computations(X,X2) @@ -64,6 +49,11 @@ class Prod(Kernpart): self._K_computations(X, X2) return self._K2 + def update_gradients_full(self, dL_dK, X): + self._K_computations(X, None) + self.k1.update_gradients_full(dL_dK*self._K2, X[:,self.slice1]) + self.k2.update_gradients_full(dL_dK*self._K1, X[:,self.slice2]) + def dK_dtheta(self,dL_dK,X,X2,target): """Derivative of the covariance matrix with respect to the parameters.""" self._K_computations(X,X2) @@ -82,6 +72,7 @@ class Prod(Kernpart): self.k2.Kdiag(X[:,self.slice2],target2) target += target1 * target2 + def dKdiag_dtheta(self,dL_dKdiag,X,target): K1 = np.zeros(X.shape[0]) K2 = np.zeros(X.shape[0]) diff --git a/GPy/util/__init__.py b/GPy/util/__init__.py index c25b1349..5a335027 100644 --- a/GPy/util/__init__.py +++ b/GPy/util/__init__.py @@ -10,6 +10,7 @@ import datasets import mocap import decorators import classification +import caching try: import sympy