From 060c23571e9af8014f3a3331ef6bae018002fa49 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Tue, 20 Dec 2022 17:35:30 +0100 Subject: [PATCH 1/4] 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 2/4] 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 3/4] 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 4/4] 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)])