Fixing broken kernels due to the add_parameter --> link_parameter rename

This commit is contained in:
Elizabeth 2022-04-15 14:15:30 -04:00
parent bb1bc50886
commit cc9d22cea2
3 changed files with 24 additions and 24 deletions

View file

@ -14,15 +14,15 @@ class DEtime(Kern):
self.index_dim=index_dim self.index_dim=index_dim
self.kern = SplitKern(kernel,Xp, index_dim=index_dim) self.kern = SplitKern(kernel,Xp, index_dim=index_dim)
super(DEtime, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name) super(DEtime, self).__init__(input_dim=kernel.input_dim+1, active_dims=None, name=name)
self.add_parameter(self.kern) self.link_parameter(self.kern)
def K(self, X, X2=None): def K(self, X, X2=None):
assert X2==None assert X2==None
K = self.kern.K(X,X2) K = self.kern.K(X,X2)
if self.idx_p<=0 or self.idx_p>X.shape[0]/2: if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
return K return K
slices = index_to_slices(X[:,self.index_dim]) slices = index_to_slices(X[:,self.index_dim])
idx_start = slices[1][0].start idx_start = slices[1][0].start
idx_end = idx_start+self.idx_p idx_end = idx_start+self.idx_p
@ -30,9 +30,9 @@ class DEtime(Kern):
K[idx_start:idx_end,:] = K[:self.idx_p,:] K[idx_start:idx_end,:] = K[:self.idx_p,:]
K[:,idx_start:idx_end] = K[:,:self.idx_p] K[:,idx_start:idx_end] = K[:,:self.idx_p]
K[idx_start:idx_end,idx_start:idx_end] = K_c K[idx_start:idx_end,idx_start:idx_end] = K_c
return K return K
def Kdiag(self,X): def Kdiag(self,X):
Kdiag = self.kern.Kdiag(X) Kdiag = self.kern.Kdiag(X)
@ -43,19 +43,19 @@ class DEtime(Kern):
idx_start = slices[1][0].start idx_start = slices[1][0].start
idx_end = idx_start+self.idx_p idx_end = idx_start+self.idx_p
Kdiag[idx_start:idx_end] = Kdiag[:self.idx_p] Kdiag[idx_start:idx_end] = Kdiag[:self.idx_p]
return Kdiag return Kdiag
def update_gradients_full(self,dL_dK,X,X2=None): def update_gradients_full(self,dL_dK,X,X2=None):
assert X2==None assert X2==None
if self.idx_p<=0 or self.idx_p>X.shape[0]/2: if self.idx_p<=0 or self.idx_p>X.shape[0]/2:
self.kern.update_gradients_full(dL_dK, X) self.kern.update_gradients_full(dL_dK, X)
return return
slices = index_to_slices(X[:,self.index_dim]) slices = index_to_slices(X[:,self.index_dim])
idx_start = slices[1][0].start idx_start = slices[1][0].start
idx_end = idx_start+self.idx_p idx_end = idx_start+self.idx_p
self.kern.update_gradients_full(dL_dK[idx_start:idx_end,:], X[:self.idx_p],X) self.kern.update_gradients_full(dL_dK[idx_start:idx_end,:], X[:self.idx_p],X)
grad_p1 = self.kern.gradient.copy() grad_p1 = self.kern.gradient.copy()
self.kern.update_gradients_full(dL_dK[:,idx_start:idx_end], X, X[:self.idx_p]) self.kern.update_gradients_full(dL_dK[:,idx_start:idx_end], X, X[:self.idx_p])
@ -108,7 +108,7 @@ class SplitKern(CombinationKernel):
if len(slices)>1: if len(slices)>1:
[target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[1], slices2[0])] [target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[1], slices2[0])]
if len(slices2)>1: if len(slices2)>1:
[target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[0], slices2[1])] [target.__setitem__((s,s2), self.kern_cross.K(X[s,:],X2[s2,:])) for s,s2 in itertools.product(slices[0], slices2[1])]
return target return target
def Kdiag(self,X): def Kdiag(self,X):
@ -125,7 +125,7 @@ class SplitKern(CombinationKernel):
else: else:
self.kern.update_gradients_full(dL,X,X2) self.kern.update_gradients_full(dL,X,X2)
target[:] += self.kern.gradient target[:] += self.kern.gradient
if X2 is None: if X2 is None:
assert dL_dK.shape==(X.shape[0],X.shape[0]) assert dL_dK.shape==(X.shape[0],X.shape[0])
[[collate_grads(dL_dK[s,ss], X[s], X[ss]) for s,ss in itertools.product(slices_i, slices_i)] for slices_i in slices] [[collate_grads(dL_dK[s,ss], X[s], X[ss]) for s,ss in itertools.product(slices_i, slices_i)] for slices_i in slices]
@ -154,20 +154,20 @@ class SplitKern_cross(Kern):
Xp = np.array([[Xp]]) Xp = np.array([[Xp]])
self.Xp = Xp self.Xp = Xp
super(SplitKern_cross, self).__init__(input_dim=kernel.input_dim, active_dims=None, name=name) super(SplitKern_cross, self).__init__(input_dim=kernel.input_dim, active_dims=None, name=name)
def K(self, X, X2=None): def K(self, X, X2=None):
if X2 is None: if X2 is None:
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X))/self.kern.K(self.Xp,self.Xp) return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X))/self.kern.K(self.Xp,self.Xp)
else: else:
return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X2))/self.kern.K(self.Xp,self.Xp) return np.dot(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X2))/self.kern.K(self.Xp,self.Xp)
def Kdiag(self, X): def Kdiag(self, X):
return np.inner(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X).T)/self.kern.K(self.Xp,self.Xp) return np.inner(self.kern.K(X,self.Xp),self.kern.K(self.Xp,X).T)/self.kern.K(self.Xp,self.Xp)
def update_gradients_full(self, dL_dK, X, X2=None): def update_gradients_full(self, dL_dK, X, X2=None):
if X2 is None: if X2 is None:
X2 = X X2 = X
k1 = self.kern.K(X,self.Xp) k1 = self.kern.K(X,self.Xp)
k2 = self.kern.K(self.Xp,X2) k2 = self.kern.K(self.Xp,X2)
k3 = self.kern.K(self.Xp,self.Xp) k3 = self.kern.K(self.Xp,self.Xp)
@ -181,7 +181,7 @@ class SplitKern_cross(Kern):
grad += self.kern.gradient.copy() grad += self.kern.gradient.copy()
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp) self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
grad += self.kern.gradient.copy() grad += self.kern.gradient.copy()
self.kern.gradient = grad self.kern.gradient = grad
def update_gradients_diag(self, dL_dKdiag, X): def update_gradients_diag(self, dL_dKdiag, X):
@ -191,14 +191,14 @@ class SplitKern_cross(Kern):
dL_dk1 = dL_dKdiag*k2[0]/k3 dL_dk1 = dL_dKdiag*k2[0]/k3
dL_dk2 = dL_dKdiag*k1[:,0]/k3 dL_dk2 = dL_dKdiag*k1[:,0]/k3
dL_dk3 = -dL_dKdiag*(k1[:,0]*k2[0]).sum()/(k3*k3) dL_dk3 = -dL_dKdiag*(k1[:,0]*k2[0]).sum()/(k3*k3)
self.kern.update_gradients_full(dL_dk1[:,None],X,self.Xp) self.kern.update_gradients_full(dL_dk1[:,None],X,self.Xp)
grad1 = self.kern.gradient.copy() grad1 = self.kern.gradient.copy()
self.kern.update_gradients_full(dL_dk2[None,:],self.Xp,X) self.kern.update_gradients_full(dL_dk2[None,:],self.Xp,X)
grad2 = self.kern.gradient.copy() grad2 = self.kern.gradient.copy()
self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp) self.kern.update_gradients_full(np.array([[dL_dk3]]),self.Xp,self.Xp)
grad3 = self.kern.gradient.copy() grad3 = self.kern.gradient.copy()
self.kern.gradient = grad1+grad2+grad3 self.kern.gradient = grad1+grad2+grad3

View file

@ -24,7 +24,7 @@ class Symmetric(Kernpart):
self.num_params = k.num_params self.num_params = k.num_params
self.name = k.name + '_symm' self.name = k.name + '_symm'
self.k = k self.k = k
self.add_parameter(k) self.link_parameter(k)
#self._set_params(k._get_params()) #self._set_params(k._get_params())
def K(self,X,X2,target): def K(self,X,X2,target):

View file

@ -51,8 +51,8 @@ class TruncLinear(Kern):
self.variances = Param('variances', variances, Logexp()) self.variances = Param('variances', variances, Logexp())
self.delta = Param('delta', delta) self.delta = Param('delta', delta)
self.add_parameter(self.variances) self.link_parameter(self.variances)
self.add_parameter(self.delta) self.link_parameter(self.delta)
@Cache_this(limit=3) @Cache_this(limit=3)
def K(self, X, X2=None): def K(self, X, X2=None):
@ -146,7 +146,7 @@ class TruncLinear_inf(Kern):
variances = np.ones(self.input_dim) variances = np.ones(self.input_dim)
self.variances = Param('variances', variances, Logexp()) self.variances = Param('variances', variances, Logexp())
self.add_parameter(self.variances) self.link_parameter(self.variances)
# @Cache_this(limit=3) # @Cache_this(limit=3)