mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-24 14:15:14 +02:00
first crack at a caching object
This commit is contained in:
parent
6346af8764
commit
54272d22bb
4 changed files with 23 additions and 26 deletions
|
|
@ -50,3 +50,7 @@ class ObservableArray(ListArray, Observable):
|
||||||
return self.__getitem__(slice(start, stop))
|
return self.__getitem__(slice(start, stop))
|
||||||
def __setslice__(self, start, stop, val):
|
def __setslice__(self, start, stop, val):
|
||||||
return self.__setitem__(slice(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)
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,13 @@ class Observable(object):
|
||||||
_observers_ = {}
|
_observers_ = {}
|
||||||
def add_observer(self, observer, callble):
|
def add_observer(self, observer, callble):
|
||||||
self._observers_[observer] = callble
|
self._observers_[observer] = callble
|
||||||
callble(self)
|
#callble(self)
|
||||||
def remove_observer(self, observer):
|
def remove_observer(self, observer):
|
||||||
del self._observers_[observer]
|
del self._observers_[observer]
|
||||||
def _notify_observers(self):
|
def _notify_observers(self):
|
||||||
[callble(self) for callble in self._observers_.itervalues()]
|
[callble(self) for callble in self._observers_.itervalues()]
|
||||||
|
|
||||||
|
|
||||||
class Pickleable(object):
|
class Pickleable(object):
|
||||||
def _getstate(self):
|
def _getstate(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -19,36 +19,21 @@ class Prod(Kernpart):
|
||||||
"""
|
"""
|
||||||
def __init__(self,k1,k2,tensor=False):
|
def __init__(self,k1,k2,tensor=False):
|
||||||
if tensor:
|
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:
|
else:
|
||||||
assert k1.input_dim == k2.input_dim, "Error: The input spaces of the kernels to sum don't have the same dimension."
|
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 + '*' + k2.name +']')
|
super(Prod, self).__init__(k1.input_dim, k1.name + '_x_' + k2.name)
|
||||||
#self.num_params = k1.num_params + k2.num_params
|
self.slice1 = slice(0,self.input_dim)
|
||||||
|
self.slice2 = slice(0,self.input_dim)
|
||||||
self.k1 = k1
|
self.k1 = k1
|
||||||
self.k2 = k2
|
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.add_parameters(self.k1, self.k2)
|
||||||
# self._set_params(np.hstack((k1._get_params(),k2._get_params())))
|
|
||||||
|
|
||||||
# def _get_params(self):
|
#initialize cache
|
||||||
# """return the value of the parameters."""
|
self._X, self._X2 = np.empty(shape=(2,1))
|
||||||
# return np.hstack((self.k1._get_params(), self.k2._get_params()))
|
self._params = None
|
||||||
#
|
|
||||||
# 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()]
|
|
||||||
|
|
||||||
def K(self,X,X2,target):
|
def K(self,X,X2,target):
|
||||||
self._K_computations(X,X2)
|
self._K_computations(X,X2)
|
||||||
|
|
@ -64,6 +49,11 @@ class Prod(Kernpart):
|
||||||
self._K_computations(X, X2)
|
self._K_computations(X, X2)
|
||||||
return self._K2
|
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):
|
def dK_dtheta(self,dL_dK,X,X2,target):
|
||||||
"""Derivative of the covariance matrix with respect to the parameters."""
|
"""Derivative of the covariance matrix with respect to the parameters."""
|
||||||
self._K_computations(X,X2)
|
self._K_computations(X,X2)
|
||||||
|
|
@ -82,6 +72,7 @@ class Prod(Kernpart):
|
||||||
self.k2.Kdiag(X[:,self.slice2],target2)
|
self.k2.Kdiag(X[:,self.slice2],target2)
|
||||||
target += target1 * target2
|
target += target1 * target2
|
||||||
|
|
||||||
|
|
||||||
def dKdiag_dtheta(self,dL_dKdiag,X,target):
|
def dKdiag_dtheta(self,dL_dKdiag,X,target):
|
||||||
K1 = np.zeros(X.shape[0])
|
K1 = np.zeros(X.shape[0])
|
||||||
K2 = np.zeros(X.shape[0])
|
K2 = np.zeros(X.shape[0])
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import datasets
|
||||||
import mocap
|
import mocap
|
||||||
import decorators
|
import decorators
|
||||||
import classification
|
import classification
|
||||||
|
import caching
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sympy
|
import sympy
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue