code: def woodbury_inv(self):
          
          if self._woodbury_inv is None:
              if self._woodbury_chol is not None:
                  self._woodbury_inv, _ = dpotri(self._woodbury_chol, lower=1)
                  # self._woodbury_inv, _ = dpotrs(self.woodbury_chol, np.eye(self.woodbury_chol.shape[0]), lower=1)
                  symmetrify(self._woodbury_inv)
              elif self._covariance is not None:
                  B = np.atleast_3d(self._K) - np.atleast_3d(self._covariance)
                  self._woodbury_inv = np.empty_like(B)
                  for i in range(B.shape[-1]):
                      tmp, _ = dpotrs(self.K_chol, B[:, :, i])
                      self._woodbury_inv[:, :, i], _ = dpotrs(self.K_chol, tmp.T)
          return self._woodbury_inv
docs: The inverse of the woodbury matrix, in the gaussian likelihood case it is defined as
          $$
          (K_{xx} + \Sigma_{xx})^{-1}
          \Sigma_{xx} := \texttt{Likelihood.variance / Approximate likelihood covariance}
          $$