diff --git a/pyerrors/covobs.py b/pyerrors/covobs.py index 64d90150..9343dc41 100644 --- a/pyerrors/covobs.py +++ b/pyerrors/covobs.py @@ -20,19 +20,7 @@ class Covobs: grad : list or array Gradient of the Covobs wrt. the means belonging to cov. """ - self.cov = np.array(cov) - if self.cov.ndim == 0: - self.N = 1 - self.cov = np.diag([self.cov]) - elif self.cov.ndim == 1: - self.N = len(self.cov) - self.cov = np.diag(self.cov) - elif self.cov.ndim == 2: - self.N = self.cov.shape[0] - if self.cov.shape[1] != self.N: - raise Exception('Covariance matrix has to be a square matrix!') - else: - raise Exception('Covariance matrix has to be a 2 dimensional square matrix!') + self.set_cov(cov) if '|' in name: raise Exception("Covobs name must not contain replica separator '|'.") self.name = name @@ -45,15 +33,43 @@ class Covobs: else: if pos > self.N: raise Exception('pos %d too large for covariance matrix with dimension %dx%d!' % (pos, self.N, self.N)) - self.grad = np.zeros((self.N, 1)) - self.grad[pos] = 1. + self._grad = np.zeros((self.N, 1)) + self._grad[pos] = 1. else: - self.grad = np.array(grad) - if self.grad.ndim == 1: - self.grad = np.reshape(self.grad, (self.N, 1)) + self.set_grad(grad) self.value = mean def errsq(self): """ Return the variance (= square of the error) of the Covobs """ return float(np.dot(np.transpose(self.grad), np.dot(self.cov, self.grad))) + + def set_cov(self, cov): + self._cov = np.array(cov) + if self._cov.ndim == 0: + self.N = 1 + self._cov = np.diag([self._cov]) + elif self._cov.ndim == 1: + self.N = len(self._cov) + self._cov = np.diag(self._cov) + elif self._cov.ndim == 2: + self.N = self._cov.shape[0] + if self._cov.shape[1] != self.N: + raise Exception('Covariance matrix has to be a square matrix!') + else: + raise Exception('Covariance matrix has to be a 2 dimensional square matrix!') + + def set_grad(self, grad): + self._grad = np.array(grad) + if self._grad.ndim in [0, 1]: + self._grad = np.reshape(self._grad, (self.N, 1)) + elif self._grad.ndim != 2: + raise Exception('Invalid dimension of grad!') + + @property + def cov(self): + return self._cov + + @property + def grad(self): + return self._grad