def __init__(self, woodbury_chol=None, woodbury_vector=None, K=None, mean=None, cov=None, K_chol=None,<EOL>woodbury_inv=None, prior_mean=<NUM_LIT:0>):
<EOL>self._K = K<EOL>if ((woodbury_chol is not None) and (woodbury_vector is not None))or ((woodbury_inv is not None) and (woodbury_vector is not None))or ((woodbury_inv is not None) and (mean is not None))or ((mean is not None) and (cov is not None)):<EOL><INDENT>pass  <EOL><DEDENT>else:<EOL><INDENT>raise ValueError("<STR_LIT>")<EOL><DEDENT>self._K_chol = K_chol<EOL>self._K = K<EOL>self._woodbury_chol = woodbury_chol<EOL>self._woodbury_vector = woodbury_vector<EOL>self._woodbury_inv = woodbury_inv<EOL>self._mean = mean<EOL>self._covariance = cov<EOL>self._prior_mean = prior_mean<EOL>self._precision = None<EOL>
woodbury_chol : a lower triangular matrix L that satisfies posterior_covariance = K - K L^{-T} L^{-1} K
 woodbury_vector : a matrix (or vector, as Nx1 matrix) M which satisfies posterior_mean = K M
 K : the proir covariance (required for lazy computation of various quantities)
 mean : the posterior mean
 cov : the posterior covariance

 Not all of the above need to be supplied! You *must* supply:

   K (for lazy computation)
   or
   K_chol (for lazy computation)

You may supply either:

   woodbury_chol
   woodbury_vector

 Or:

   mean
   cov

 Of course, you can supply more than that, but this class will lazily
 compute all other quantites on demand.