From c01d822ec8a1e7c3cd7182649df17e884f6340a9 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:09:35 +0100 Subject: [PATCH 1/6] refactor: unnecessary if clause in constructor of Corr class removed. --- pyerrors/correlators.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 95eadf74..453beb8b 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -69,9 +69,6 @@ class Corr: if isinstance(data_input, list): - if all([isinstance(item, (Obs, CObs)) for item in data_input]): - _assert_equal_properties(data_input) - self.content = [np.asarray([item]) for item in data_input] if all([isinstance(item, (Obs, CObs)) or item is None for item in data_input]): _assert_equal_properties([o for o in data_input if o is not None]) self.content = [np.asarray([item]) if item is not None else None for item in data_input] From 313dec7ceed01a00cc300e27cff97872b5d9853e Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:18:25 +0100 Subject: [PATCH 2/6] refactor: _assert_equal_properties simplified. --- pyerrors/misc.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/pyerrors/misc.py b/pyerrors/misc.py index bbfb8e7d..cf0dd18a 100644 --- a/pyerrors/misc.py +++ b/pyerrors/misc.py @@ -105,16 +105,11 @@ def gen_correlated_data(means, cov, name, tau=0.5, samples=1000): def _assert_equal_properties(ol, otype=Obs): - if not isinstance(ol[0], otype): - raise Exception("Wrong data type in list.") + otype = type(ol[0]) for o in ol[1:]: if not isinstance(o, otype): raise Exception("Wrong data type in list.") - if not ol[0].is_merged == o.is_merged: - raise Exception("All Obs in list have to have the same state 'is_merged'.") - if not ol[0].reweighted == o.reweighted: - raise Exception("All Obs in list have to have the same property 'reweighted'.") - if not ol[0].e_content == o.e_content: - raise Exception("All Obs in list have to be defined on the same set of configs.") - if not ol[0].idl == o.idl: - raise Exception("All Obs in list have to be defined on the same set of configurations.") + for attr in ["is_merged", "reweighted", "e_content", "idl"]: + if hasattr(ol[0], attr): + if not getattr(ol[0], attr) == getattr(o, attr): + raise Exception(f"All Obs in list have to have the same state '{attr}'.") From 060c23571e9af8014f3a3331ef6bae018002fa49 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:35:30 +0100 Subject: [PATCH 3/6] fix: real and imag attributes of complex correlator object fixed. --- pyerrors/correlators.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 453beb8b..3e0ad600 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -1136,8 +1136,10 @@ class Corr: for t in range(self.T): if _check_for_none(self, newcontent[t]): continue - if np.isnan(np.sum(newcontent[t]).value): - newcontent[t] = None + tmp_sum = np.sum(newcontent[t]) + if hasattr(tmp_sum, "value"): + if np.isnan(tmp_sum.value): + newcontent[t] = None if all([item is None for item in newcontent]): raise Exception('Operation returns undefined correlator') return Corr(newcontent) @@ -1194,8 +1196,8 @@ class Corr: @property def real(self): def return_real(obs_OR_cobs): - if isinstance(obs_OR_cobs, CObs): - return obs_OR_cobs.real + if isinstance(obs_OR_cobs[0], CObs): + return obs_OR_cobs[0].real else: return obs_OR_cobs @@ -1204,8 +1206,8 @@ class Corr: @property def imag(self): def return_imag(obs_OR_cobs): - if isinstance(obs_OR_cobs, CObs): - return obs_OR_cobs.imag + if isinstance(obs_OR_cobs[0], CObs): + return obs_OR_cobs[0].imag else: return obs_OR_cobs * 0 # So it stays the right type From f68a5d044fa7c5cb15b820a837513c35fd6f3a93 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:37:37 +0100 Subject: [PATCH 4/6] tests: test for construction of complex correlator object added. --- tests/correlators_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 49332254..222f8030 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -532,3 +532,10 @@ def test_prune(): with pytest.raises(Exception): corr_mat.prune(3) corr_mat.prune(4) + + +def test_complex_Corr(): + o1 = pe.pseudo_Obs(1.0, 0.1, "test") + cobs = pe.CObs(o1, o1) + ccorr = pe.Corr([cobs, cobs, cobs]) + assert np.all([ccorr.imag[i] == ccorr.real[i] for i in range(ccorr.T)]) From f39a70c5a86ab8e14f90def05eedc227b35c59c9 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:40:41 +0100 Subject: [PATCH 5/6] fix: Corr.__repr__ also works for complex correlators. --- pyerrors/correlators.py | 2 ++ tests/correlators_test.py | 1 + 2 files changed, 3 insertions(+) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 3e0ad600..c39c7095 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -969,6 +969,8 @@ class Corr: content_string += "Description: " + self.tag + "\n" if self.N != 1: return content_string + if isinstance(self[0], CObs): + return content_string if print_range[1]: print_range[1] += 1 diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 222f8030..49c950be 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -539,3 +539,4 @@ def test_complex_Corr(): cobs = pe.CObs(o1, o1) ccorr = pe.Corr([cobs, cobs, cobs]) assert np.all([ccorr.imag[i] == ccorr.real[i] for i in range(ccorr.T)]) + print(ccorr) From 63439684048599e88c851bc75b9146619d3d7e41 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 18:13:15 +0100 Subject: [PATCH 6/6] fix: complex correlator fix extended to array valued complex correlators. --- pyerrors/correlators.py | 8 ++++---- tests/correlators_test.py | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index c39c7095..736bcb7a 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -1198,8 +1198,8 @@ class Corr: @property def real(self): def return_real(obs_OR_cobs): - if isinstance(obs_OR_cobs[0], CObs): - return obs_OR_cobs[0].real + if isinstance(obs_OR_cobs.flatten()[0], CObs): + return np.vectorize(lambda x: x.real)(obs_OR_cobs) else: return obs_OR_cobs @@ -1208,8 +1208,8 @@ class Corr: @property def imag(self): def return_imag(obs_OR_cobs): - if isinstance(obs_OR_cobs[0], CObs): - return obs_OR_cobs[0].imag + if isinstance(obs_OR_cobs.flatten()[0], CObs): + return np.vectorize(lambda x: x.imag)(obs_OR_cobs) else: return obs_OR_cobs * 0 # So it stays the right type diff --git a/tests/correlators_test.py b/tests/correlators_test.py index 49c950be..1ab31f12 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -536,7 +536,9 @@ def test_prune(): def test_complex_Corr(): o1 = pe.pseudo_Obs(1.0, 0.1, "test") - cobs = pe.CObs(o1, o1) + cobs = pe.CObs(o1, -o1) ccorr = pe.Corr([cobs, cobs, cobs]) - assert np.all([ccorr.imag[i] == ccorr.real[i] for i in range(ccorr.T)]) + assert np.all([ccorr.imag[i] == -ccorr.real[i] for i in range(ccorr.T)]) print(ccorr) + mcorr = pe.Corr(np.array([[ccorr, ccorr], [ccorr, ccorr]])) + assert np.all([mcorr.imag[i] == -mcorr.real[i] for i in range(mcorr.T)])