diff --git a/GPy/kern/parts/rbf.py b/GPy/kern/parts/rbf.py index 8811b74a..027aa382 100644 --- a/GPy/kern/parts/rbf.py +++ b/GPy/kern/parts/rbf.py @@ -109,7 +109,7 @@ class RBF(Kernpart): self.lengthscale.gradient = self._dL_dlengthscales_via_K(dL_dK, X, None) else: self.lengthscale.gradient = (self.variance / self.lengthscale) * np.sum(self._K_dvar * self._K_dist2 * dL_dK) -b + def update_gradients_sparse(self, dL_dKmm, dL_dKnm, dL_dKdiag, X, Z): #contributions from Kdiag self.variance.gradient = np.sum(dL_dKdiag) diff --git a/GPy/kern/parts/sympykern.py b/GPy/kern/parts/sympykern.py index 52813ecd..3d6517a8 100644 --- a/GPy/kern/parts/sympykern.py +++ b/GPy/kern/parts/sympykern.py @@ -1,3 +1,4 @@ +# Check Matthew Rocklin's blog post. try: import sympy as sp sympy_available=True @@ -129,6 +130,8 @@ class spkern(Kernpart): if False: self.compute_psi_stats() + self._code = {} + # generate the code for the covariance functions self._gen_code() @@ -169,6 +172,7 @@ class spkern(Kernpart): code_type = "C" else: code_type = "PYTHON" + # Need to add the sympy_helpers header in here. (foo_c,self._function_code), (foo_h,self._function_header) = \ codegen(code_list, code_type, @@ -233,7 +237,7 @@ class spkern(Kernpart): """ # Here's the code to do the looping for K - self._K_code =\ + self._code['K'] =\ """ // _K_code // Code for computing the covariance function. @@ -254,7 +258,7 @@ class spkern(Kernpart): """%(precompute_string,arg_string,"/*"+str(self._sp_k)+"*/") # adding a string representation of the function in the # comment forces recompile when needed - self._K_code_X = self._K_code.replace('Z2(', 'X2(') + self._code['K_X'] = self._code['K'].replace('Z2(', 'X2(') # Code to compute diagonal of covariance. @@ -265,9 +269,9 @@ class spkern(Kernpart): diag_precompute_string = re.sub('Z','X',diag_precompute_string) diag_precompute_string = re.sub('j','i',diag_precompute_string) # Code to do the looping for Kdiag - self._Kdiag_code =\ + self._code['Kdiag'] =\ """ - // _Kdiag_code + // _code['Kdiag'] // Code for computing diagonal of covariance function. int i; int n = target_array->dimensions[0]; @@ -282,51 +286,88 @@ class spkern(Kernpart): """%(diag_precompute_string,diag_arg_string,"/*"+str(self._sp_k)+"*/") #adding a string representation forces recompile when needed # Code to compute gradients - grad_func_list = [] if self.output_dim>1: - grad_func_list += c_define_output_indices - grad_func_list += [' '*16 + 'TARGET1(%i+ii) += PARTIAL2(i, j)*dk_d%s(%s);'%(self.num_shared_params+i*self.output_dim, theta.name, arg_string) for i, theta in enumerate(self._sp_theta_i)] - grad_func_list += [' '*16 + 'TARGET1(%i+jj) += PARTIAL2(i, j)*dk_d%s(%s);'%(self.num_shared_params+i*self.output_dim, theta.name, reverse_arg_string) for i, theta in enumerate(self._sp_theta_i)] - grad_func_list += ([' '*16 + 'TARGET1(%i) += PARTIAL2(i, j)*dk_d%s(%s);'%(i,theta.name,arg_string) for i,theta in enumerate(self._sp_theta)]) - grad_func_string = '\n'.join(grad_func_list) + for i, theta in enumerate(self._sp_theta_i): + grad_func_list = [' '*26 + 'TARGET1(ii) += PARTIAL2(i, j)*dk_d%s(%s);'%(theta.name, arg_string)] + grad_func_list += [' '*26 + 'TARGET1(jj) += PARTIAL2(i, j)*dk_d%s(%s);'%(theta.name, reverse_arg_string)] + grad_func_list = c_define_output_indices+grad_func_list - self._dK_dtheta_code =\ - """ - // _dK_dtheta_code - // Code for computing gradient of covariance with respect to parameters. - int i; - int j; - int n = partial_array->dimensions[0]; - int num_inducing = partial_array->dimensions[1]; - int input_dim = X_array->dimensions[1]; - //#pragma omp parallel for private(j) - for (i=0;idimensions[0]; + int num_inducing = partial_array->dimensions[1]; + int input_dim = X_array->dimensions[1]; + //#pragma omp parallel for private(j) + for (i=0;idimensions[0]; + int input_dim = X_array->dimensions[1]; + for (i=0;idimensions[0]; + int num_inducing = partial_array->dimensions[1]; + int input_dim = X_array->dimensions[1]; + //#pragma omp parallel for private(j) + for (i=0;idimensions[0]; + int input_dim = X_array->dimensions[1]; + for (i=0;idimensions[0]; - int input_dim = X_array->dimensions[1]; - for (i=0;i