code: def gradients_X(self, dL_dK, X, X2, target):
          
          # First account for gradients arising from presence of X in exponent.
          self._K_computations(X, X2)
          if X2 is None:
              _K_dist = 2*(X[:, None, :] - X[None, :, :])
          else:
              _K_dist = X[:, None, :] - X2[None, :, :] # don't cache this in _K_co
          gradients_X = (-2.*self.variance)*np.transpose((self._K_dvar/self._w2)[:, :, None]*_K_dist, (1, 0, 2))
          target += np.sum(gradients_X*dL_dK.T[:, :, None], 0)
          # Now account for gradients arising from presence of X in lengthscale.
          self._dK_computations(dL_dK)
          if X2 is None:
              target += 2.*self.mapping.df_dX(self._dL_dl[:, None], X)
          else:
              target += self.mapping.df_dX(self._dL_dl[:, None], X)
docs: Derivative of the covariance matrix with respect to X.