Support non-symmetric dL_dKmm for stationary kernel

This commit is contained in:
Zhenwen Dai 2014-06-03 11:34:32 +01:00
parent 8eaa0bbf8a
commit 6119c33078

View file

@ -168,11 +168,14 @@ class Stationary(Kern):
#the lower memory way with a loop #the lower memory way with a loop
tmp = invdist*dL_dr tmp = invdist*dL_dr
if X2 is None:
tmp *= 2.
X2 = X
ret = np.empty(X.shape, dtype=np.float64) ret = np.empty(X.shape, dtype=np.float64)
[np.einsum('ij,ij->i', tmp, X[:,q][:,None]-X2[:,q][None,:], out=ret[:,q]) for q in xrange(self.input_dim)] if X2 is None:
[np.einsum('ij,ij->i', tmp, X[:,q][:,None]-X[:,q][None,:], out=ret[:,q]) for q in xrange(self.input_dim)]
ret2 = np.empty(X.shape, dtype=np.float64)
[np.einsum('ij,ji->j', tmp, X[:,q][:,None]-X[:,q][None,:], out=ret2[:,q]) for q in xrange(self.input_dim)]
ret += ret2
else:
[np.einsum('ij,ij->i', tmp, X[:,q][:,None]-X2[:,q][None,:], out=ret[:,q]) for q in xrange(self.input_dim)]
ret /= self.lengthscale**2 ret /= self.lengthscale**2
return ret return ret