From b0610544a8e16b5aee366647f940af4e662bad52 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 7 Dec 2021 07:29:05 +0000 Subject: [PATCH] fix: array mode now works for elements with different covobs --- pyerrors/obs.py | 9 ++++++++- tests/linalg_test.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pyerrors/obs.py b/pyerrors/obs.py index 51e620da..ea10e578 100644 --- a/pyerrors/obs.py +++ b/pyerrors/obs.py @@ -1148,6 +1148,13 @@ def derived_observable(func, data, array_mode=False, **kwargs): # TODO: array mode does not work when matrices are defined on differenet ensembles if array_mode is True: + + class Zero_grad(): + def __init__(self): + self.grad = 0 + + zero_grad = Zero_grad() + d_extracted = {} g_extracted = {} for name in new_sample_names: @@ -1158,7 +1165,7 @@ def derived_observable(func, data, array_mode=False, **kwargs): for name in new_cov_names: g_extracted[name] = [] for i_dat, dat in enumerate(data): - g_extracted[name].append(np.array([o.covobs[name].grad for o in dat.reshape(np.prod(dat.shape))]).reshape(dat.shape + (1, ))) + g_extracted[name].append(np.array([o.covobs.get(name, zero_grad).grad for o in dat.reshape(np.prod(dat.shape))]).reshape(dat.shape + (1, ))) for i_val, new_val in np.ndenumerate(new_values): new_deltas = {} diff --git a/tests/linalg_test.py b/tests/linalg_test.py index b4216c2e..bdbce655 100644 --- a/tests/linalg_test.py +++ b/tests/linalg_test.py @@ -189,7 +189,7 @@ def test_matmul_irregular_histories(): standard_array = [] for i in range(dim ** 2): standard_array.append(pe.Obs([np.random.normal(1.1, 0.2, length)], ['ens1'])) - standard_matrix = np.array(standard_array).reshape((dim, dim)) # * pe.pseudo_Obs(0.1, 0.002, 'qr') + standard_matrix = np.array(standard_array).reshape((dim, dim)) * pe.cov_Obs(1.0, 0.002, 'cov') # * pe.pseudo_Obs(0.1, 0.002, 'qr') for idl in [range(1, 501, 2), range(250, 273), [2, 8, 19, 20, 78]]: irregular_array = []