def dq_Kqp_a(self,q,p,a, kernels) :
"""
Useful for the adjoint integration scheme.
d_q (K_q p) . a = ...
"""
h = 1e-8
Q0phA = q + h*a
Q0mhA = q - h*a
update_emp = ( Landmarks.K(self, Q0phA, p, Landmarks.precompute_kernels(self, Q0phA))
- Landmarks.K(self, Q0mhA, p, Landmarks.precompute_kernels(self, Q0mhA))) / (2*h)
return update_emp
"""x = q.reshape((self.npoints, self.dimension))
p = p.reshape((self.npoints, self.dimension))
a = a.reshape((self.npoints, self.dimension))
dists = squareform(pdist(x, 'sqeuclidean')) # dists_ij = |x_i-x_j|^2
# We have :
# [K_q p]_nd = sum_j { k(|x_n - x_j|^2) * p_j^d }
#
# So that :
# grad_nd = a_nd * sum_j { 2 * (x_n^d - x_j^d) * k'(|x_n - x_j|^2) * p_j^d }
grad = zeros((self.npoints, self.dimension))
for d in range(self.dimension) :
diffs = atleast_2d(x[:,d]).T - x[:,d] # diffs_ij = x_i^d - x_j^d
# K_ij = 2 * (x_i^d - x_j^d) * k'(|x_i - x_j|^2) * p_j^d
K = 2 * dists * kernels[1] * p[:,d]
# grad_nd = a_nd * sum_j { 2 * (x_n^d - x_j^d) * k'(|x_n - x_j|^2) * p_j^d }
grad[:,d] = a[:,d] * sum( K , 1 )
return grad.reshape((self.npoints * self.dimension,))"""
评论列表
文章目录