code: def posterior_inf(self, X=None, posterior=None):
          
          if X is None:
              try:
                  X = self._highest_parent_.X
              except NameError:
                  raise RuntimeError("This kernel is not part of a model and cannot be used for posterior inference")
          if posterior is None:
              try:
                  posterior = self._highest_parent_.posterior
              except NameError:
                  raise RuntimeError("This kernel is not part of a model and cannot be used for posterior inference")
          phi_alpha = self.phi(X) * self.variance
          return (phi_alpha).T.dot(posterior.woodbury_vector), (np.eye(phi_alpha.shape[1])*self.variance - mdot(phi_alpha.T, posterior.woodbury_inv, phi_alpha))
docs: Do the posterior inference on the parameters given this kernels functions
          and the model posterior, which has to be a GPy posterior, usually found at m.posterior, if m is a GPy model.
          If not given we search for the the highest parent to be a model, containing the posterior, and for X accordingly.