From 7eebba83875a9d17503d43f0fcee9ef932e8af04 Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 30 Nov 2022 16:42:30 +0000 Subject: [PATCH 1/2] feat: construction of G0 in GEVP simplified and explicit check for positive-semidefiniteness added. --- pyerrors/correlators.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index dd0d51d6..48b2d848 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -306,12 +306,14 @@ class Corr: else: symmetric_corr = self.matrix_symmetric() + G0 = np.vectorize(lambda x: x.value)(symmetric_corr[t0]) + np.linalg.cholesky(G0) # Check if matrix G0 is positive-semidefinite. + if sort is None: if (ts is None): raise Exception("ts is required if sort=None.") if (self.content[t0] is None) or (self.content[ts] is None): raise Exception("Corr not defined at t0/ts.") - G0 = np.vectorize(lambda x: x.value)(symmetric_corr[t0]) Gt = np.vectorize(lambda x: x.value)(symmetric_corr[ts]) reordered_vecs = _GEVP_solver(Gt, G0) @@ -319,7 +321,6 @@ class Corr: if sort == "Eigenvalue" and ts is not None: warnings.warn("ts has no effect when sorting by eigenvalue is chosen.", RuntimeWarning) all_vecs = [None] * (t0 + 1) - G0 = np.vectorize(lambda x: x.value)(symmetric_corr[t0]) for t in range(t0 + 1, self.T): try: Gt = np.vectorize(lambda x: x.value)(symmetric_corr[t]) From ad1296ae4788bb405ea859a0a5e6a436f33fbdfa Mon Sep 17 00:00:00 2001 From: Fabian Joswig Date: Wed, 30 Nov 2022 16:47:57 +0000 Subject: [PATCH 2/2] tests: Exception for negative matrix in GEVP tested. --- tests/correlators_test.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/correlators_test.py b/tests/correlators_test.py index adf4e2ba..c4980a7e 100644 --- a/tests/correlators_test.py +++ b/tests/correlators_test.py @@ -310,6 +310,7 @@ def test_GEVP_warnings(): with pytest.warns(DeprecationWarning): corr_mat.GEVP(0, sorted_list="Eigenvalue") + def test_GEVP_exceptions(): corr_aa = _gen_corr(1) corr_ab = 0.5 * corr_aa @@ -371,6 +372,10 @@ def test_GEVP_exceptions(): with pytest.raises(Exception): corr_0.matrix_symmetric() + n_corr_mat = -corr_mat + with pytest.raises(np.linalg.LinAlgError): + n_corr_mat.GEVP(2) + def test_matrix_symmetric(): corr_aa = _gen_corr(1)