code: def _K_computations(self, X, X2=None):
          
          self._lengthscales=self.mapping.f(X)
          self._lengthscales2=np.square(self._lengthscales)
          if X2==None:
              self._lengthscales_two = self._lengthscales
              self._lengthscales_two2 = self._lengthscales2
              Xsquare = np.square(X).sum(1)
              self._K_dist2 = -2.*tdot(X) + Xsquare[:, None] + Xsquare[None, :]
          else:
              self._lengthscales_two = self.mapping.f(X2)
              self._lengthscales_two2 = np.square(self._lengthscales_two)
              self._K_dist2 = -2.*np.dot(X, X2.T) + np.square(X).sum(1)[:, None] + np.square(X2).sum(1)[None, :]
          self._w2 = self._lengthscales2 + self._lengthscales_two2.T
          prod_length = self._lengthscales*self._lengthscales_two.T
          self._K_exponential = np.exp(-self._K_dist2/self._w2)
          self._K_dvar = np.sign(prod_length)*(2*np.abs(prod_length)/self._w2)**(self.input_dim/2.)*np.exp(-self._K_dist2/self._w2)
docs: Pre-computations for the covariance function (used both when computing the covariance and its gradients). Here self._dK_dvar and self._K_dist2 are updated.