Merge pull request #24 from s-kuberski/feature/covobs

Feature/covobs
This commit is contained in:
Fabian Joswig 2021-12-08 09:42:38 +00:00 committed by GitHub
commit ea237ed849
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 16 deletions

View file

@ -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

View file

@ -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