diff --git a/pyerrors/covobs.py b/pyerrors/covobs.py index b0eb4efb..2c8f81fc 100644 --- a/pyerrors/covobs.py +++ b/pyerrors/covobs.py @@ -20,18 +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 - 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 @@ -44,13 +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) + 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 diff --git a/pyerrors/obs.py b/pyerrors/obs.py index bea4f7e0..c27670ed 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1069,7 +1069,7 @@ def derived_observable(func, data, array_mode=False, **kwargs): for o in raveled_data: for name in o.cov_names: if name in allcov: - if not np.array_equal(allcov[name], o.covobs[name].cov): + if not np.allclose(allcov[name], o.covobs[name].cov): raise Exception('Inconsistent covariance matrices for %s!' % (name)) else: allcov[name] = o.covobs[name].cov