diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py index 01a7d61e..ff899dc8 100644 --- a/pyerrors/correlators.py +++ b/pyerrors/correlators.py @@ -242,7 +242,9 @@ class Corr: Parameters ---------- variant -- log: uses the standard effective mass log(C(t) / C(t+1)) - periodic : Solves C(t) / C(t+1) = cosh(m * (t - T/2)) / cosh(m * (t + 1 - T/2)) for m. See, e.g., arXiv:1205.5380 + cosh : Use periodicitiy of the correlator by solving C(t) / C(t+1) = cosh(m * (t - T/2)) / cosh(m * (t + 1 - T/2)) for m. + sinh : Use anti-periodicitiy of the correlator by solving C(t) / C(t+1) = sinh(m * (t - T/2)) / sinh(m * (t + 1 - T/2)) for m. + See, e.g., arXiv:1205.5380 guess -- guess for the root finder, only relevant for the root variant """ if self.N != 1: diff --git a/tests/test_correlators.py b/tests/test_correlators.py new file mode 100644 index 00000000..37b59fba --- /dev/null +++ b/tests/test_correlators.py @@ -0,0 +1,48 @@ +import numpy as np +import pyerrors as pe +import pytest + +np.random.seed(0) + + +def test_function_overloading(): + corr_content_a = [] + corr_content_b = [] + for t in range(24): + corr_content_a.append(pe.pseudo_Obs(np.random.normal(1e-10, 1e-8), 1e-4, 't')) + corr_content_b.append(pe.pseudo_Obs(np.random.normal(1e8, 1e10), 1e7, 't')) + + corr_a = pe.correlators.Corr(corr_content_a) + corr_b = pe.correlators.Corr(corr_content_b) + + fs = [lambda x: x[0] + x[1], lambda x: x[1] + x[0], lambda x: x[0] - x[1], lambda x: x[1] - x[0], + lambda x: x[0] * x[1], lambda x: x[1] * x[0], lambda x: x[0] / x[1], lambda x: x[1] / x[0], + lambda x: np.exp(x[0]), lambda x: np.sin(x[0]), lambda x: np.cos(x[0]), lambda x: np.tan(x[0]), + lambda x: np.log(x[0] + 0.1), lambda x: np.sqrt(np.abs(x[0])), + lambda x: np.sinh(x[0]), lambda x: np.cosh(x[0]), lambda x: np.tanh(x[0])] + + for i, f in enumerate(fs): + t1 = f([corr_a, corr_b]) + for o_a, o_b, con in zip(corr_content_a, corr_content_b, t1.content): + t2 = f([o_a, o_b]) + t2.gamma_method() + assert np.isclose(con[0].value, t2.value) + assert np.isclose(con[0].dvalue, t2.dvalue) + assert np.allclose(con[0].deltas['t'], t2.deltas['t']) + +def test_modify_correlator(): + corr_content = [] + for t in range(24): + exponent = np.random.normal(3, 5) + corr_content.append(pe.pseudo_Obs(2 + 10 ** exponent, 10 ** (exponent - 1), 't')) + + corr = pe.correlators.Corr(corr_content) + + with pytest.warns(RuntimeWarning): + corr.symmetric() + with pytest.warns(RuntimeWarning): + corr.anti_symmetric() + corr.roll(np.random.randint(100)) + corr.deriv(symmetric=True) + corr.deriv(symmetric=False) + corr.second_deriv() diff --git a/tests/test_pyerrors.py b/tests/test_pyerrors.py index 0835fb08..4c8cf18f 100644 --- a/tests/test_pyerrors.py +++ b/tests/test_pyerrors.py @@ -35,7 +35,7 @@ def test_function_overloading(): fs = [lambda x: x[0] + x[1], lambda x: x[1] + x[0], lambda x: x[0] - x[1], lambda x: x[1] - x[0], lambda x: x[0] * x[1], lambda x: x[1] * x[0], lambda x: x[0] / x[1], lambda x: x[1] / x[0], lambda x: np.exp(x[0]), lambda x: np.sin(x[0]), lambda x: np.cos(x[0]), lambda x: np.tan(x[0]), - lambda x: np.log(x[0]), lambda x: np.sqrt(x[0]), + lambda x: np.log(x[0]), lambda x: np.sqrt(np.abs(x[0])), lambda x: np.sinh(x[0]), lambda x: np.cosh(x[0]), lambda x: np.tanh(x[0])] for i, f in enumerate(fs): @@ -47,8 +47,17 @@ def test_function_overloading(): def test_overloading_vectorization(): - a = np.random.randint(0, 100, 10) - b = pe.pseudo_Obs(4, 0.8, 'e1') + a = np.random.randint(1, 100, 10) + b = pe.pseudo_Obs(4, 0.8, 't') + + assert [o.value for o in a * b] == [o.value for o in b * a] + assert [o.value for o in a + b] == [o.value for o in b + a] + assert [o.value for o in a - b] == [-1 * o.value for o in b - a] + assert [o.value for o in a / b] == [o.value for o in [p / b for p in a]] + assert [o.value for o in b / a] == [o.value for o in [b / p for p in a]] + + a = np.random.normal(0.0, 1e10, 10) + b = pe.pseudo_Obs(4, 0.8, 't') assert [o.value for o in a * b] == [o.value for o in b * a] assert [o.value for o in a + b] == [o.value for o in b + a] diff --git a/tests/test_roots.py b/tests/test_roots.py index c1bdc7ea..8d3a8191 100644 --- a/tests/test_roots.py +++ b/tests/test_roots.py @@ -16,4 +16,4 @@ def test_root_linear(): assert np.isclose(my_root.value, value) difference = my_obs - my_root - assert all(np.isclose(0.0, difference.deltas['t'])) + assert np.allclose(0.0, difference.deltas['t'])